2016-07-14 3 views
2

람다 (Java 사용)의 SES를 사용하여 전자 메일을 보내려고하면 연결이 끊깁니다.AWS : Lambda의 SES를 통해 전자 메일 보내기

람다 함수와 동일한 VPC에서 EC2 인스턴스와 동일한 코드를 테스트했으며 거기에서 작동합니다 (동일한 역할이 할당되었습니다). 또한 VPC에없는 람다 함수를 실행 해 보았습니다 (그래도 어쨌든 하나에 있어야합니다). 또한 작동하지 않습니다.

여기에 코드

SendEmailRequest request = new SendEmailRequest().withSource(from) 
                .withDestination(destination) 
                .withMessage(message); 

    try { 
     System.out.println("Attempting to send an email through Amazon SES by using the AWS SDK for Java..."); 

     if (client == null) { 
      client = new AmazonSimpleEmailServiceClient(); 
      client.setRegion(Region.getRegion(Regions.EU_WEST_1)); 
     } 

     client.sendEmail(request); // this is where the exception is thrown 
     System.out.println("Email sent!"); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
     System.err.println(ex.getMessage()); 
    } 
} 

오류 메시지의 해당 비트가 시간 초과로 인해 (email.eu 서쪽-1을 위해 ...) 연결에 실패한다고합니다.

람다에서 작동하지 않는 이유는 무엇입니까?

+0

VPC에 Lambda 기능을 배치 한 경우 VPC에 NAT 게이트웨이를 추가 할 때까지 AWS API를 비롯하여 VPC 외부의 항목에 액세스 할 수 없습니다. –

+0

@ MarkB 나는 VPC 외부에서 시도한 것과 똑같은 방식으로 작동하지 않는다는 점에 유의한다. –

+1

VPC를 사용하지 않고 시간 초과가 계속 발생하는 경우 시간 초과 된 SES에 대한 연결이며 람다 기능에 할당 된 시간이 부족하지 않은 것이 확실합니까? 실제 오류 메시지를 표시할까요? 코드가 로컬에서 실행됩니까? –

답변

2

나는이 지역의 누군가로부터 도움을 얻었습니다. 제 질문에서 누락 된 정보가 있었기 때문에 문제를 파악하는 데 필요한 정보가 있었으므로 문제를 해결하기 위해 필요한 정보를 설정해야합니다. 또한 주목할 점은 실제로 VPC 밖에서 람다 함수를 실행할 수 없다는 것입니다. 당신이 자신을 제거 할 때 디폴트 값을 할당 받았을뿐입니다.

먼저, 이메일을 보내는 데 필요한 람다 함수의 역할을 첨부하는 최소한의 정책이 있습니다 (실제로 사용하는 것에 따라 보내기 옵션 중 하나를 제거 할 수 있으며 물론 물론 리소스).

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Action": [ 
       "ses:SendEmail", 
       "ses:SendRawEmail", 
       "ec2:CreateNetworkInterface" 
      ], 
      "Resource": "*" 
     } 
    ] 
} 

지금부터 작성해야 할 리소스를 안내해 드리겠습니다. 먼저 NAT 게이트웨이에 사용할 서브넷이 필요합니다.

VPC 대시 보드를 열고 서브넷을 만들고 유용한 레이블을 지정하여 NAT의 서브넷임을 확인하십시오. 람다 기능과 동일한 VPC에 넣으십시오.

다음으로, 당신은 당신의 VPC에 따라 달라집니다 (기존) 지역 경로를 가지고 있으므로 경로 테이블을 설정해야하고 있습니다 또한 인터넷 게이트웨이를 대상으로하는 기본 경로 0.0.0.0/0. 인터넷 게이트웨이가없는 경우 인터넷 게이트웨이 섹션으로 이동하여 인터넷 게이트웨이 섹션을 만드십시오.

이제 NAT 게이트웨이를 만들어야합니다. 이 설정은 EC2에서 설정할 수 있지만 VPC 대시 보드의 NAT 게이트웨이 섹션을 대신 사용하여 다른 EC2 인스턴스를 관리하지 않습니다. 방금 만든 서브넷에 넣고 공용 IP를 할당합니다 (새 EIP를 만들 수 있음).

람다 (Lambda) 기능을위한 서브넷을 두 개 더 설정합니다 (하나는 충분하지만 AWS는 가용성을 위해 두 개를 권장합니다). 이 두 가지는 로컬 경로 (물론)와 경로 테이블을 공유하며 방금 만든 NAT 게이트웨이를 대상으로하는 기본 경로입니다.

이제 람다 함수에서 이메일을 보낼 수 있습니다! 위의 단계는 Lambda 함수가 개인 IP 만 가질 때 필요합니다. NAT 게이트웨이가 Lambda 함수에 제공하는 공개 키가 필요한 SES에 대한 액세스 권한을 얻으려면 위의 단계가 필요합니다.

관련 문제