AWS CloudFormation 스택이 ROLLBACK_IN_PROGRESS 상태에 있을 때 이메일 알림을 받으려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2019년 11월 12일

스택 생성 시 내 AWS CloudFormation 스택이 ROLLBACK_IN_PROGRESS 상태로 전환될 때 이메일 알림을 수신하고 싶습니다. 이러한 이메일 알림을 설정하려면 어떻게 해야 합니까?

간략한 설명

해결 방법 섹션의 단계를 완료하면 알림이 다음과 같은 방식으로 작동합니다.

  1. AWS CloudFormation 스택은 AWS Lambda 함수에 알림을 전달하는 Amazon SNS(Amazon Simple Notification Service) 주제에 모든 알림을 전송합니다.
  2. Lambda 함수는 아림을 구분 분석하고 "ROLLBACK_IN_PROGRESS" 알림을 이메일 알림용으로 구성된 두 번째 Amazon SNS 주제에 전송합니다.
  3. 이 두 번째 SNS 주제는 "ROLLBACK_IN_PROGRESS" 메시지와 관련하여 구독자에게 이메일을 전송합니다.

해결 방법

이메일 알림을 위한 SNS 주제 및 구독 생성

1.    Amazon SNS 콘솔을 엽니다.

2.    탐색 창에서 [주제]를 선택합니다.

참고: 기존 주제를 사용하려면 리소스 목록에서 해당 주제를 선택한 다음 7단계로 건너뜁니다.

3.    주제 생성을 선택하십시오.

4.    [이름]에 주제 이름을 입력합니다.

5.    [표시 이름]에 표시 이름을 입력합니다.

6.    [주제 생성]을 선택합니다.

7.    나중에 사용하기 위해 주제의 Amazon 리소스 이름(ARN)을 기록해 둡니다.

8.    [구독 생성]을 선택합니다.

9.    [주제 ARN]에 7단계에서 기록한 SNS 주제 ARN을 선택합니다.

10.    [프로토콜]에서 [이메일]을 선택합니다.

11.    [엔드포인트]에 이메일 주소를 입력합니다.

12.    [구독 생성]을 선택합니다.

11단계에서 입력한 이메일 주소로부터 Amazon SNS의 구독 확인 이메일을 수신하게 됩니다.

13.    확인 이메일 메시지에서 [구독 확인]을 선택합니다.

브라우저에서 구독 확인 메시지를 확인할 수 있습니다.

Lambda가 이메일 알림을 위해 SNS 주제에 게시할 수 있도록 허용하는 AWS Identity and Access Management(IAM) 정책 생성

참고: 이 정책은 Lambda가 Amazon CloudWatch Logs에 로그를 작성하는 것도 허용합니다.

1.    IAM 콘솔을 엽니다.

2.    탐색 창에서 정책을 선택합니다.

3.    정책 생성을 선택합니다.

4.    [JSON] 탭을 선택한 다음 JSON 코드 편집기에 다음 코드를 입력합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "sns:Publish"
      ],
      "Resource": [
        "{awsExampleSNSTopicARN}"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    }
  ]
}

참고: awsExampleSNSTopicARN을 이메일 알림을 위해 생성했던 SNS 주제에 대한 ARN으로 대체합니다.

5.    [정책 검토]를 선택합니다.

6.    [이름]에 정책 이름을 입력합니다.

7.    [정책 생성]을 선택합니다.

Lambda용 IAM 정책에 IAM 정책 연결

1.    IAM 콘솔을 엽니다.

2.    탐색 창에서 역할을 선택합니다.

3.    [역할 만들기]를 선택합니다.

4.    [Select type of trusted entity] 섹션에서 [AWS 서비스]를 선택합니다.

5.    [Choose the service that will use this role] 섹션에서 [Lambda]를 선택합니다.

6.    [다음: 권한]을 선택합니다.

7.    검색 모음에서 앞에서 생성한 정책의 이름을 입력하고 해당 정책을 선택합니다.

8.    [다음: 태그]를 선택한 다음 IAM 태그를 작성합니다(선택 사항).

9.    [다음: 검토]를 선택합니다.

10.    [역할 이름]에 역할 이름을 입력합니다.

11.    [역할 만들기]를 선택합니다.

Lambda 함수를 생성하고 사용자가 만든 IAM 역할 지정

1.    Lambda 콘솔을 엽니다.

2.    [함수 생성]을 선택합니다.

3.    [새로 작성]을 선택합니다.

4.    [이름]에 Lambda 함수의 이름을 입력합니다.

5.    [런타임]에서 [Node.js 10.x]를 선택합니다.

6.    [실행 역할]에서 [Use an existing role]을 선택합니다.

7.    [기존 역할]에서 앞에서 생성한 IAM 역할을 선택합니다.

8.    [함수 생성]을 선택합니다.

Lambda 함수에 알림을 전달할 두 번째 SNS 주제 및 구독 생성

1.    Amazon SNS 콘솔을 엽니다.

2.    탐색 창에서 [주제]를 선택합니다.

3.    주제 생성을 선택하십시오.

4.    [이름]에 주제 이름을 입력합니다.

5.    [표시 이름]에 표시 이름을 입력합니다.

6.    [주제 생성]을 선택합니다.

7.    나중에 사용하기 위해 주제의 ARN을 기록해 둡니다.

8.    [구독 생성]을 선택합니다.

9.    [주제 ARN]에 7단계에서 기록한 SNS 주제 ARN을 선택합니다.

10.    [프로토콜]에서 [AWS Lambda]를 선택합니다.

11.    [엔드포인트]에서 앞서 생성한 Lambda 함수를 선택합니다.

12.    [구독 생성]을 선택합니다.

SNS 주제에 게시하는 스크립트로 Lambda 함수 업데이트

1.    Lambda 콘솔을 엽니다.

2.    탐색 창에서 [함수]를 선택한 다음 앞에서 생성한 함수를 선택합니다.

3.    [함수 코드] 섹션에서 편집기 창에 다음 스크립트를 입력합니다.

topic_arn = "{awsExampleSNSTopicARN}";
var AWS = require('aws-sdk'); 
AWS.config.region_array = topic_arn.split(':'); // splits the ARN into an array 
AWS.config.region = AWS.config.region_array[3];  // makes the 4th variable in the array (will always be the region)

// ####################   BEGIN LOGGING   ########################

console.log(topic_arn);   // just for logging to the that the var was parsed correctly
console.log(AWS.config.region_array); // to see if the SPLIT command worked
console.log(AWS.config.region_array[3]); // to see if it got the region correctly
console.log(AWS.config.region); // to confirm that it set the AWS.config.region to the correct region from the ARN

// ####################  END LOGGING (you can remove this logging section)  ########################

exports.handler = function(event, context) {
    const message = event.Records[0].Sns.Message;
    if (message.indexOf("ROLLBACK_IN_PROGRESS") > -1) {
        var fields = message.split("\n");
        subject = fields[11].replace(/['']+/g, '');
        send_SNS_notification(subject, message);   
    }
};

function send_SNS_notification(subject, message) {
    var sns = new AWS.SNS();
    subject = subject + " is in ROLLBACK_IN_PROGRESS";
    sns.publish({ 
        Subject: subject,
        Message: message,
        TopicArn: topic_arn
    }, function(err, data) {
        if (err) {
            console.log(err.stack);
            return;
        } 
        console.log('push sent');
        console.log(data);
    });
}

참고: awsExampleSNSTopicARN을 이메일 알림을 위해 생성했던 SNS 주제에 대한 ARN으로 대체합니다.

4.    [Designer] 보기의 [트리거 추가] 섹션에서 [SNS]를 선택합니다.

5.    [트리거 구성] 섹션의 [SNS 주제]에서 Lambda 함수에 알림을 전달하기 위해 생성한 SNS 주제를 선택합니다.

6.    [추가]를 선택합니다.

7.    [저장]을 선택합니다.

Lambda 함수에 알림을 전달하는 SNS 주제에 모든 알림을 전송하도록 AWS CloudFormation 스택 설정

1.    AWS CloudFormation 콘솔을 열고 설정 마법사의 단계에 따라 스택을 생성합니다.

2.    [알림 옵션]에서 [기존 Amazon SNS 주제]를 선택합니다.

3.    Lambda 함수에 알림을 전달하기 위해 생성했던 SNS 주제를 선택합니다.

4.    설정 마법사의 단계를 완료하여 스택을 생성합니다.

AWS 명령줄 인터페이스(AWS CLI)를 사용하여 스택을 생성하는 경우 -notification-arns 명령을 사용합니다. 이 명령은 Lambda 함수에 알리는 알림을 SNS 주제로 전송합니다. 그런 다음, SNS 주제의 값을 SNS ARN으로 설정합니다.


이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?