본문 바로가기

코딩 학습/Aws

[aws] SES 서비스 연동 과정 정리(php), 삽질의 연속

기존에 쓰던 무료 서버에서 통신에러가 자꾸 발생하는것을 우려하다가 홧김에 '그래 기왕하는거 aws 가서 해보자'

라고 시작했던 aws 이전 소동

 

그중에 제일 오래 걸렸던 php로 메일을 보내기 위한 SES 서비스 연동과정에서 생겼던 문제들을 정리해보았다.

(기존 서버에서는 그냥 'mail()' function으로 수행 -> 메일이 자꾸 스팸함으로 + aws 서버에서는 안보내짐)

내가 막혔던 문제는

 

크게 정리하자면

1. SES dkim 인증 문제

2. composer aws-sdk-php 설치 문제

3. aws credential 위치 문제

4. aws credential access key 인증 문제

가 있었고 각각에 대해서 아래와 같이 정리해두었다.

 

1. SES dkim 인증 관련

 - 구글 도메인을 이용하려 하는데, 구글 도메인의 DNS 맞춤레코드에 aws 의 아래의 CNAME 레코드를 그냥 전체를 복사하거나 복사버튼을 클릭해서 집어넣으면 본인의 도메인이 2번 중복해서 들어가는 문제

 - 구글 도메인의 입력창이 아래 같이 자동으로 뒷면의 도메인을 완성시켜주기 때문에, aws에서 복사한 host 이름에서 본인 도메인 부분은 지우고 입력해야한다. (ex. ~~~~_domainkey 까지만)

 - 본인은 내가 잘못입력하거나 72시간 걸린다길래 느긋하게 3일 기다렸다가 빠꾸먹고 또 확인하고 하루 더 기다리면서 총 4일을 날려먹다가 저걸 확인해서 수정하니 15분 만에 되더라..

2. composer aws-sdk-php 설치 문제

aws 에서 php를 통해 ses 서비스를 이용하자면 aws에서 제공하는 php 연결 툴킷(sdk) 설치가 필요하다.

ses 인증을 마치고 드디어 작업을 하던 중 아래 블로그와 같이 composer를 이용한 설치가 필요하다는 것을 이해하고 설치를 수행했는데,

https://withpg.tistory.com/entry/aws-php-ses-%EB%A9%94%EC%9D%BC-%EB%B0%9C%EC%86%A1%ED%95%98%EA%B8%B0

 

aws php ses 메일 발송하기

Error executing "SendEmail" on "https://email.ap-northeast-2.amazonaws.com"; AWS HTTP error: Client error: `POST https://email.ap-northeast-2.amazonaws.com` resulted in a `400 Bad Request` response: Sender MessageReje (truncated...) MessageRejected (client

withpg.tistory.com

자꾸 /var/www/html/ooo.php not found or unable to start 가 자꾸 나오는 함정에 빠져버렸다.

 

백엔드도 잘 모르고 aws 시스템에 이해가 덜 하던 때였기에 다른 툴킷처럼(unzip 이나 7z 처럼) 서버에 아무 곳이나 설치하면 되는줄 알고

 -  /home/ubuntu 디렉토리에 설치해 버렸더니 못 찾는 문제였었고

 - chatGPT와 온갖 블로그의 힘을 빌려 권한을 줘봐도 안되어서 결국에는 '웹서버'에 설치를 해야하는것을 깨닫고는 웹서버인 /var/www/html/ 에 들어가서 composer require aws/aws-sdk-php 를 수행해야 함을 깨닫고 해결할 수 있었다.

 - 결국 웹서버가 설치된 /var/www/html/에 vendor/autoload.php가 있음을 확인하도록 한다.

 

3. aws credential 위치 문제

 좋아, aws-sdk-php도 설치했겠다. 시키는대로 메일을 보내보았더니

Cannot read credentials from /.aws/credentials in /var/www/html/vendor/aws/aws-sdk-php/src/Credentials/CredentialProvider.php:826

이번에는 credential 위치를 못 찾는 문제가 자꾸 발생했다. 후..

credential을 어디에 어떤 포맷으로 만들어야 되는지 파악이 안되어서 헤맸으나 결론은 아래와 같다.

- 먼저 CredentialProvider.php 가 credentials파일을 찾고 있는 위치를 파악한다. 

  -> 기본적으로 self::getHomeDir() . '/.aws/credentials' 이렇게 설정되어 있으므로 homeDir 가 어딘지 잘 파악이 안되시는 저와 같은 분은 웹서버에 아래와 같이 간단한 테스트 코드를 만들어서 확인토록 한다.

<? php

function getHomeDir(){

  return getenv('HOME') ?: getenv('USERPROFILE');

}

$awsCredentialsPath = getHomeDir().'/.aws/credentials';

echo "The AWS credentials file path is: ".$awsCredentialsPath.PHP_EOL;

?>

  -> 그러면 루트 디렉토리(제일 최상위)의 /.aws/credentials로 나올것이다. (아니면 그에 맞춰서) 

  -> 이에 맞춰 폴더를 만들고 아무 확장자 없이 credentials 파일을 만들자 내용은 아래와 같으면 된다.

그리고 작성된 credential 파일은 위에서 만들었던 /.aws 디렉토리에 집어넣어주면된다.

 

4. aws credential access key 인증 문제

문제는 지금부터였다.

credentials 파일도 만들었고 aws_access_key_id 에 비밀번호에 내 smtp 인증으로 만든 iam 계정과 비밀번호도 잘 집어넣어서 해주었다.

그런데, 자꾸 

The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. 

에러만 나오는 것이다. 비밀번호나 access key가 안 맞다는 건데

 4-1. ''/' , '%' 특수 기호가 비밀번호에 들어가면 안되기도 한다' -> 새 iam 계정을 만들어 했지만 실패

 4-2. 오탈자가 있을것이다. -> 실제로 오탈자가 있기도 했지만 없앴는데도 그대로 실패

stackoverflow랑 chatgpt한테 물어봐도 맨날 비밀번호가 틀렸단다 + aws 에서 하란대로 iam 계정했는데도 안되는데..

 

초코파이 하나 먹고 오고 나서 아래 블로그에서 힌트를 얻어 해결하였다.

https://velog.io/@minchocopie/AWS-SES-TroubleShooting

 

[AWS] SES 트러블슈팅 !

AccessDenied: User arn:aws:iam::767791266862:user/ses-user is not authorized to perform ses:SendEmail on resource arn:aws:ses:ap-northeast-2:767791266

velog.io

결론은 

** SMTP 보안 인증 계정 ≠ aws ses 인증 액세스 키라는 거였다.

SMTP 서비스와 다르고 SES 서비스가 다른데, 내가 이용하려는건 SES 서비스인데 자꾸 SMTP 계정(액세스키)로 하려고 하니 문제가 생긴것이었다.본인은 아래와 같이 있는 smtp 계정에 액세스 키를 한개 더 만들어서 ses 용 액세스 키를 만들었다. 그리고 그 액세스 키를 넣어주었더니

 

뙇!! 

드!디!어! 왔다! 

잔다!