AWS CloudFormation 스택이 ROLLBACK_IN_PROGRESS 상태가 될 경우 이메일 알림을 받으려면 어떻게 해야 합니까?
최종 업데이트 날짜: 2020년 9월 23일
스택 생성 시 내 AWS CloudFormation 스택이 ROLLBACK_IN_PROGRESS 상태로 전환될 때 이메일 알림을 수신하고 싶습니다.
간략한 설명
해결 방법 섹션의 단계를 완료하면 알림이 다음과 같은 방식으로 작동합니다.
- AWS CloudFormation 스택은 AWS Lambda 함수에 알림을 전달하는 Amazon SNS(Amazon Simple Notification Service) 주제에 모든 알림을 전송합니다.
- Lambda 함수는 아림을 구분 분석하고 "ROLLBACK_IN_PROGRESS" 알림을 이메일 알림용으로 구성된 두 번째 Amazon SNS 주제에 전송합니다.
- 이 두 번째 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. [구독 생성(Create subscription)]을 선택합니다.
참고: 11단계에서 입력한 이메일 주소로부터 Amazon SNS의 구독 확인 이메일을 수신하게 됩니다.
13. 확인 이메일 메시지에서 [구독 확인(Confirm subscription)]을 선택합니다.
브라우저에서 구독 확인 메시지를 확인할 수 있습니다.
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. [역할 생성(Create role)]을 선택합니다.
4. [신뢰할 수 있는 유형의 개체 선택(Select type of trusted entity)] 섹션에서 [AWS 서비스(AWS service)]를 선택합니다.
5. [이 역할을 사용할 서비스 선택(Choose the service that will use this role)] 섹션에서 [Lambda]를 선택합니다.
6. [다음: 권한]을 선택합니다.
7. 검색 모음에서 앞에서 생성한 정책의 이름을 입력하고 해당 정책을 선택합니다.
8. [다음: 태그]를 선택한 다음 IAM 태그를 작성합니다(선택 사항).
9. [다음: 검토]를 선택합니다.
10. [역할 이름]에 역할 이름을 입력합니다.
11. [역할 생성(Create role)]을 선택합니다.
Lambda 함수를 생성하고 사용자가 만든 IAM 역할 지정
1. Lambda 콘솔을 엽니다.
2. [함수 생성(Create function)]을 선택합니다.
3. [새로 작성]을 선택합니다.
4. [이름]에 Lambda 함수의 이름을 입력합니다.
5. [런타임]에서 [Node.js 10.x]를 선택합니다.
6. [실행 역할(Execution role)]에서 [기존 역할 사용(Use an existing role)]을 선택합니다.
7. [기존 역할]에서 앞에서 생성한 IAM 역할을 선택합니다.
8. [함수 생성(Create function)]을 선택합니다.
Lambda 함수에 알림을 전달할 두 번째 SNS 주제 및 구독 생성
1. Amazon SNS 콘솔을 엽니다.
2. 탐색 창에서 [주제]를 선택합니다.
3. 주제 생성을 선택하십시오.
4. [이름]에 주제 이름을 입력합니다.
5. [표시 이름]에 표시 이름을 입력합니다.
6. [주제 생성]을 선택합니다.
7. 나중에 사용하기 위해 주제의 ARN을 기록해 둡니다.
8. [구독 생성]을 선택합니다.
9. [주제 ARN]에 7단계에서 기록한 SNS 주제 ARN을 선택합니다.
10. [프로토콜]에서 [AWS Lambda]를 선택합니다.
11. [엔드포인트]에서 앞서 생성한 Lambda 함수를 선택합니다.
12. [구독 생성(Create subscription)]을 선택합니다.
SNS 주제에 게시하는 스크립트로 Lambda 함수 업데이트
1. Lambda 콘솔을 엽니다.
2. 탐색 창에서 [함수]를 선택한 다음 앞에서 생성한 함수를 선택합니다.
3. [함수 코드(Function code)] 섹션에서 편집기 창에 다음 스크립트를 입력합니다.
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] 보기의 [트리거 추가(Add triggers)] 섹션에서 [SNS]를 선택합니다.
5. [트리거 구성(Configure triggers)] 섹션의 [SNS 주제(SNS topic)]에서 Lambda 함수에 알림을 전달하기 위해 생성한 SNS 주제를 선택합니다.
6. [추가]를 선택합니다.
7. [저장(Save)]을 선택합니다.
Lambda 함수에 알림을 전달하는 SNS 주제에 모든 알림을 전송하도록 AWS CloudFormation 스택 설정
1. AWS CloudFormation 콘솔을 열고 설정 마법사의 단계에 따라 스택을 생성합니다.
2. [알림 옵션]에서 [기존 Amazon SNS 주제]를 선택합니다.
3. Lambda 함수에 알림을 전달하기 위해 생성했던 SNS 주제를 선택합니다.
4. 설정 마법사의 단계를 완료하여 스택을 생성합니다.
AWS 명령줄 인터페이스(AWS CLI)를 사용하여 스택을 생성하는 경우 -notification-arns 명령을 사용합니다. 이 명령은 Lambda 함수에 알리는 알림을 SNS 주제로 전송합니다. 그런 다음, SNS 주제의 값을 SNS ARN으로 설정합니다.