EventBridge+Lambda로 AMI 생성 알림을 구현하는 CloudFormation 템플릿 생성

EventBridge+Lambda에서 AMI 생성 알림을 구현하는 CloudFormation 템플릿을 만들었습니다.

이번에 참고한 기사



AMI 작성 시간을 알고 싶었기 때문에 SNS Topic으로 통지 해 보았습니다.

CloudFormation 템플릿으로 구현 개요



CloudFormation 템플릿으로 스택을 만들면 아래와 같은 구성이 완성됩니다.
CloudTrail은 CloudFormation 템플릿에 포함되어 있지 않으므로 별도 활성화가 필요합니다.



이 구성은 아래 CloudFormation 템플릿으로 구축됩니다.
  • AMI 생성 시 SNS 알림용 CloudFormation 템플릿(notify-sns-createimage.yml)
  • CloudTrail 활성화를 전제
  • SNS의 통지처 지정 메일 주소에 도착하는 확인 메일은 별도 대응 전제


  • AMI 생성시 SNS 알림용 CloudFormation 템플릿(notify-sns-createimage.yml)



    AMI 생성 시 CreateImage라는 AWS API Call이 호출될 때 EventBridge를 통해 SNS 알림(Email)합니다. Lambda에서는 다음을 수행합니다.
  • AMI 작성시 SNS 통지

  • 메일 형식
    件名:
    Start CreateImage (対象インスタンスID(対象AMI))
    
    本文:
    Start CreateImage
    
    Region:対象リージョン
    InstanceID:対象インスタンスID
    AMI Name:対象AMI
    AMI ID:対象AMI ID
    

    AMI 생성 시 SNS 알림용 CloudFormation 템플릿(notify-sns-createimage.yml)의 내용은 아래와 같습니다.
    CloudFormation 스택을 만들 때 입력해야 하는 매개 변수를 설명합니다.
  • EventName : Event명(초기값: notify-sns-createimage_event)
  • FunctionName : Lambda 함수 이름 (초기 값 : notify-sns-createimage)
  • RoleName : Lambda 함수에서 이용하는 IAM 롤명 (초기값: notify-sns-createimage)
  • SNSSubscriptionEmail : SNS 엔드포인트(대상 이메일 주소) (기본값: 왓 x@에에ぁmpぇ. 이 m )
  • 항상 수신 가능한 이메일 주소로 변경하십시오

  • SNSTopicName : SNS Topic 이름(초기값: notify-sns-createimage_event)



  • notify-sns-createimage.yml
    AWSTemplateFormatVersion: 2010-09-09
    Parameters:
      RoleName:
        Type: String
        Default: notify-sns-createimage
      FunctionName:
        Type: String
        Default: notify-sns-createimage
      EventName:
        Type: String
        Default: notify-sns-createimage_event
      SNSTopicName:
        Type: String
        Default: notify-sns-createimage
      SNSSubscriptionEmail:
        Type: String
        Default: xxxx@example.com
    Resources:
      LambdaRole:
        Type: 'AWS::IAM::Role'
        Properties:
          RoleName: !Sub '${RoleName}'
          AssumeRolePolicyDocument:
            Statement:
              - Action:
                  - 'sts:AssumeRole'
                Effect: Allow
                Principal:
                  Service:
                    - lambda.amazonaws.com
            Version: 2012-10-17
          ManagedPolicyArns:
            - 'arn:aws:iam::aws:policy/AWSLambdaExecute'
          Path: /
      Lambda:
        Type: 'AWS::Lambda::Function'
        DependsOn: LambdaRole
        Properties:
          Code:
            ZipFile: |
              import os
              import boto3
    
              def lambda_handler(event, context):
                  awsRegion = event['detail']['awsRegion']
                  name = event['detail']['requestParameters']['name']
                  instanceId = event['detail']['requestParameters']['instanceId']
                  imageId = event['detail']['responseElements']['imageId']
    
                  client = boto3.client('sns')
    
                  sns_response = client.publish(
                      TopicArn= os.environ['SNS_TopicName'] ,
                      Message=('Start CreateImage\n\nRegion:'
                      + awsRegion
                      + '\nInstanceID:'
                      + instanceId
                      + '\nAMI Name:'
                      + name
                      + '\nAMI ID:'
                      + imageId
                      + '\n\n'),
                                Subject= 'Start CreateImage  (' + instanceId + '(' + name + '))'
                  )
    
                  return sns_response
          Description: SNS notification when CreateImage is executed
          FunctionName: !Sub ${FunctionName}
          Handler: index.lambda_handler
          MemorySize: 128
          Role: !GetAtt LambdaRole.Arn
          Runtime: python3.6
          Timeout: 300
          Environment:
            Variables:
              'AWS_ACCOUNT': !Sub ${AWS::AccountId}
              'SNS_TopicName': !Sub arn:aws:sns:${AWS::Region}:${AWS::AccountId}:${SNSTopicName}
          Tags:
            - Key: Name
              Value: !Sub ${RoleName}
            - Key: CloudformationArn
              Value: !Ref 'AWS::StackId'
      NotifyMailSNSTopic:
        Type: AWS::SNS::Topic
        Properties:
          DisplayName: !Sub ${SNSTopicName}
          TopicName: !Sub ${SNSTopicName}
          Subscription:
            - Endpoint: !Sub ${SNSSubscriptionEmail}
              Protocol: email
      NotifyMailSNSPolicy:
        Type: AWS::SNS::TopicPolicy
        DependsOn: NotifyMailSNSTopic
        Properties:
          PolicyDocument:
            Id: MyTopicPolicy
            Version: '2012-10-17'
            Statement:
            - Sid: NotifyMailSNSPolicy
              Effect: Allow
              Principal:
               AWS: !GetAtt LambdaRole.Arn
              Action:
              - sns:Publish
              Resource: !Ref NotifyMailSNSTopic
          Topics:
            - !Ref NotifyMailSNSTopic
      Rule:
        Type: 'AWS::Events::Rule'
        Properties:
          Description: !Sub ${EventName}
          Name: !Sub ${EventName}
          EventPattern: 
            source: 
              - "aws.ec2"
            detail-type: 
              - "AWS API Call via CloudTrail"
            detail: 
              eventSource: 
                - "ec2.amazonaws.com"
              eventName: 
                - "CreateImage"
          State: "ENABLED"
          Targets:
            - Arn: !GetAtt 
                - Lambda
                - Arn
              Id: lambda
      LambdaEvent:
        Type: 'AWS::Lambda::Permission'
        Properties:
          Action: 'lambda:InvokeFunction'
          FunctionName: !Ref Lambda
          Principal: events.amazonaws.com
          SourceArn: !GetAtt 
            - Rule
            - Arn
    

    좋은 웹페이지 즐겨찾기