[목표]
AWS EventBridge Rule과 AWS SNS 서비스를 이용하여 리소스가 삭제되었을 때, 관리자에게 이메일 발송.
본 게시글에서 EC2 Instance, RDS Instance, Redshift Cluster, S3 Bucket, MWAA Environment를 대상으로 함.
[환경]
AWS WEB Console에서 작업 진행
[구성 과정]
<SNS 구성>
1. SNS Topic
a. Create Topic
i. Type: Standard
ii. Name: InfraManager
iii. Display Name: study4me
iv. 그 외 구성: Default
2. SNS Subscriptions
a. Create Subscriptiont
i. Topic ARN: 위에서 생성한 Topic 선택
ii. Protocol: Email
iii. Endpoint: Notification을 수신할 이메일 기입
iv. 그 외 구성: Default
b. 이메일 인증
i. 메일 수신함에서 이메일 인증
<EventBridge 구성>
1. EventBridge Rule
a. Create rule
i. Name: 아래 표 참조
ii. Rule type: Rule with an event pattern
iii. Event Source: Other
iv. Sample event(optional): 생략함
v. Creation method: Custom pattern(JSON editor)
vi. Event pattern: 아래 표 참조
vii. Target 1: AWS service
viii. Select a target: SNS topic
ix. Topic: 위 과정에서 생성한 SNS Topic 선택
x. Additional settings
1) Configure target input: Input transformer
2) Configure input transformer 클릭
3) Sample event(Optional): 생략함
4) Input path: 아래 표 참조
5) Template: 아래 표 참조
6) Output: Sample event(Optional)을 생략했기 때문에 확인할 수 없음.
(Output을 원할 경우 Sample event(Optional)을 작성해야함.)
7) Confirm 클릭
xi. 그 외 구성: Default
b. 생성할 EventBridge Rule 리스트
Resource | Rule Name | Event Pattern | Input Path | Input Template | 출력 예시 |
EC2 | NOTI-EC2-TERMINATED-01 | { "source": [ "aws.ec2" ], "detail-type": [ "EC2InstanceState-changeNotification" ], "detail": { "state": [ "terminated" ] } } |
{ "instance": "$.detail.instance-id", "time": "$.time" } |
"EC2 has been deleted." "Account: study4me-it" "Time: <time>" "EC2 Instance ID: <instance>" |
"EC2 has been deleted." "Account: study4me-it" "Time: 2023-05-10T02:18:28Z" "EC2 Instance ID: i-abcd1111" |
RDS | NOTI-RDS-DELETED-01 | { "source": ["aws.rds"], "detail-type": ["AWS API Call via CloudTrail"], "detail": { "eventSource": ["rds.amazonaws.com"], "eventName": ["DeleteDBInstance", "DeleteDBCluster"] } } |
{ "rdsArn": "$.detail.responseElements.dBInstanceArn", "sourceIPAddress": "$.detail.sourceIPAddress", "eventTime": "$.detail.eventTime", "eventName": "$.detail.eventName" } |
"RDS has been deleted" "Account: study4me-it" "Time: <eventTime>" "Source IP: <sourceIPAddress>" "Event Name: <eventName>" "RDS ARN: <rdsArn>" |
"RDS has been deleted" "Account: study4me-it" "Time: 2023-05-10T02:18:28Z" "Source IP: 119.149.165.2" "Event Name: DeleteDBInstance" "RDS ARN: arn:aws:rds:ap-northeast-2:123456789101:db:test" |
Redshift | NOTI-REDSHIFT-DELETED-01 | { "source": ["aws.redshift"], "detail-type": ["AWS API Call via CloudTrail"], "detail": { "eventSource": ["redshift.amazonaws.com"], "eventName": ["DeleteCluster"] } } |
{ "sourceIPAddress": "$.detail.sourceIPAddress", "eventTime": "$.detail.eventTime", "clusterIdentifier": "$.detail.responseElements.clusterIdentifier", "eventName": "$.detail.eventName" } |
"Redshift has been deleted" "Account: study4me-it" "Time: <eventTime>" "Source IP: <sourceIPAddress>" "Event Name: <eventName>" "Redshift Cluster Identifier: <clusterIdentifier>" |
"Redshift has been deleted" "Account: study4me-it" "Time: 2023-05-10T01:52:25Z" "Source IP: 119.149.165.2" "Event Name: DeleteCluster" "Redshift Cluster Identifier: test" |
S3 Bucket |
NOTI-S3-BUCKET-DELETED-01 | { "source": ["aws.s3"], "detail-type": ["AWS API Call via CloudTrail"], "detail": { "eventSource": ["s3.amazonaws.com"], "eventName": ["DeleteBucket"] } } |
{ "eventTime": "$.detail.eventTime", "sourceIPAddress": "$.detail.sourceIPAddress", "eventName": "$.detail.eventName", "bucketName": "$.detail.requestParameters.bucketName" } |
"S3 Bucket has been deleted" "Account: study4me-it" "Time: <eventTime>" "Source IP : <sourceIPAddress>" "Event Name: <eventName>" "Bucket Name : <bucketName>" |
"S3 Bucket has been deleted" "Account: study4me-it" "Time: 2023-05-08T04:35:53Z" "Source IP : 119.149.165.2" "Event Name: DeleteBucket" "Bucket Name : study4me-it-test" |
MWAA | NOTI-MWAA-DELETED-01 | { "source": ["aws.airflow"], "detail-type": ["AWS API Call via CloudTrail"], "detail": { "eventSource": ["airflow.amazonaws.com"], "eventName": ["DeleteEnvironment"] } } |
{ "mwaaName": "$.detail.requestParameters.Name", "sourceIPAddress": "$.detail.sourceIPAddress", "eventTime": "$.detail.eventTime", "eventName": "$.detail.eventName" } |
"MWAA has been deleted" "Account: study4me-it" "Time: <eventTime>" "Source IP : <sourceIPAddress>" "Event Name: <eventName>" "MWAA Name : <mwaaName>" |
"MWAA has been deleted" "Account: study4me-it" "Time: 2023-05-08T04:35:53Z" "Source IP : 119.149.165.2" "Event Name: DeleteEnvironment" "MWAA Name : test" |
<TEST & Result >
1. EC2 Instance 삭제 후 수신 이메일
2. RDS Instance 삭제 후 수신 이메일
3. Redshift Cluster 삭제 후 수신 이메일
4. S3 Bucket 삭제 후 수신 이메일
5. MWAA Environment 삭제 후 수신 이메일
[참고 사항]
위에서는 자세히 설명하지 않았지만 EventBridge Rule 생성의 Creation Method에서 EC2 삭제 감지는 Use Pattern form을 사용하였고, 그 외 리소스 삭제 감지는 Custom pattern을 사용함. Custom Pattern 작성 시 이번에 사용한 패턴은 CloudTrail Event를 통해 AWS API를 감지하여 SNS Topic을 Trigger함. EC2는 AWS에서 제공하는 Pattern Form이 있어서 사용해본 것이고, EC2 또한 CloudTrail Event를 통해 AWS API 감지를 할 수 있음.
* Use Pattern form : Use a template provided by EventBridge to create an event pattern.
eventName은 IAM Policy 생성에서 찾아보거나 CloudTrail에서 찾아보면 대충 어떤 Event Name을 가졌는지 짐작할 수 있음. eventSource는 CloudTrail을 찾아보는 편임.
[마무리]
위 과정에서 AWS Resource가 삭제되었을 경우 EventBridge로 감지하고 SNS 서비스를 트리거하여 이메일을 수신하였다. 이러한 구성을 다르게 활용도 가능하다. 예를 들어 S3 Bucket이 생성되었을 때, Lambda를 실행하여 S3 Bucket Policy를 자동으로 넣어주도록 구성할 수도 있다. 특정 이벤트가 발생했을 때, 다른 서비스를 트리거할 수 있으니 알아두면 AWS 운영 관리에 도움이 될 것 같다.
[참고 사이트]
https://repost.aws/ko/knowledge-center/ec2-email-instance-state-change
[키워드]
Event Bridge, SNS, Email, Notificaton, 리소스 삭제 시 이메일 발송, When aws resource delete, send email
'AWS' 카테고리의 다른 글
[AWS] System Manager 간단 정리(SSM Agent Install) (0) | 2024.10.19 |
---|---|
Control Tower 간단 설명 (0) | 2024.09.10 |
AWS Solution Architect Professional 후기(SAP-C01) (0) | 2021.11.17 |