CloudFormationのイベント通知ができるようになったので試してみた

こんにちは、SCSK石原です。

2022年7月20日にCloudFormationのイベント通知ができるようになったと発信がありました。

AWS CloudFormation event notifications with Amazon EventBridge help you create event-driven applications

今回はこの機能を試してみました。

CFnイベントをメール通知(お試しVer)

EventBridgeでイベントを拾って、SNSにパブリッシュします。

構成手順を説明します。

SNSトピックの作成

Emailに通知するために、まずSNSトピックを作成します。

続いて、メール通知のために宛先がEmailのサブスクリプションを作成します。

サブスクリプション作成後はメールが来ますので、「confirm subscription」をクリックして有効化します。

EventBridgeルールの作成

今回のメインである、CloudFormationイベントを拾ってくるEventBridgeのルールを作成します。

Enabling Amazon EventBridge - AWS CloudFormation
CloudFormation sends events to Amazon EventBridge by default. Specify the rules and targets to match to the events using the CloudFormation console and AWS Comm...

任意のルール名でルールを作成します。

今回はCFnのイベントによってキックされるルールです。ルールタイプは「イベントパターン」を選択してください。

イベントパターンを定義します。CFnはAWSサービスですので、「AWSイベントまたはEventBridgeパートナーイベント」を選択します。

イベントパターンはCloudFormationを選択します。イベントタイプは目的に応じて選択してください。今回選択している「CloudFormation Stack Status Change」では、スタックのステータスが変わったタイミングでイベントがトリガーされます。

Managing events with AWS CloudFormation and Amazon EventBridge – AWS CloudFormation

最後に先ほど作成したSNSにパブリッシュする設定をします。

EventBridgeの設定は以上になります。

動作確認

適当なスタックを作成、削除したところ下記の4通メールが来ました。

CREATE_IN_PROGRESS
CREATE_COMPLETE
DELETE_IN_PROGRESS
DELETE_COMPLETE

CFnイベントをメール通知(実用的Ver)

ここまで読んでいただきありがとうございます。

たくさん環境あるし、GUIでポチポチするのはめんどくさいという方向けに、CFnテンプレートを置いておきます。
ご自由にご利用ください。

こちらは、メールの件名、メール内容を人が見やすいように加工する仕掛けも入れています。

AWSTemplateFormatVersion: "2010-09-09"
Description: "CFnEventNotify template"
Parameters:
  NotifyEmailAddress:
    Type: String

  EventType:
    Type: String
    Default: "CFnEventNotify"

Resources:
# =====================================
# SNS
# =====================================
  EventTypeNotifyTopic:
    Type: AWS::SNS::Topic
    Properties: 
      DisplayName: !Sub "${EventType}-${AWS::AccountId}"
      TopicName: !Sub "Topic-${AWS::AccountId}-${EventType}"

  EventTypeNotifyTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Statement:
          - Effect: "Allow"
            Principal:
              Service: "events.amazonaws.com"
            Action: "sns:Publish"
            Resource: "*"
      Topics:
        - !Ref EventTypeNotifyTopic

  Subscription:
    Type: AWS::SNS::Subscription
    Properties: 
      Endpoint: !Ref NotifyEmailAddress
      Protocol: email
      TopicArn: !Ref EventTypeNotifyTopic

# =====================================
# EventBridge
# =====================================
  CFnEventRule:
    Type: AWS::Events::Rule
    Properties: 
      Description: !Sub "${EventType}"
      EventPattern: 
        detail-type: 
        - "CloudFormation Stack Status Change"
        source:
        - "aws.cloudformation"
      Name: !Sub "${EventType}-Rule"
      State: ENABLED
      Targets: 
      - Arn: !Ref SubjectChangeStateMachine
        Id: !Sub "${EventType}-StateMachine-Target"
        RoleArn: !GetAtt StateMachineExecuteRole.Arn
        InputTransformer:
          InputPathsMap:
            "stackid": "$.detail.stack-id"
            "status": "$.detail.status-details.status"
            "account": "$.account"
          InputTemplate: |
            {
              "subject": "CFnEvent \"\"",
              "message": " AWSアカウントID: \"\" \n スタック: \"\" \n ステータス: \"\""
            }


# =====================================
# StepFunctions
# =====================================
  StepFunctionToSNSPublishRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - states.amazonaws.com
            Action: "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: StateMachine2SNSPublish
          PolicyDocument:
            Statement:
              - Effect: Allow
                Resource:
                  - !Ref EventTypeNotifyTopic
                Action:
                  - sns:Publish
  
  StateMachineExecuteRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - events.amazonaws.com
            Action: "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: StateMachineExecute
          PolicyDocument:
            Statement:
              - Effect: Allow
                Resource:
                  - !Ref SubjectChangeStateMachine
                Action:
                  - states:StartExecution
  
  SubjectChangeStateMachine:
    Type: "AWS::StepFunctions::StateMachine"
    Properties:
      DefinitionString: !Sub |-
            {
              "StartAt": "PublishSns",
              "States": {
                "PublishSns": {
                  "Type": "Task",
                  "Resource": "arn:aws:states:::sns:publish",
                  "Parameters": {
                    "TopicArn": "${EventTypeNotifyTopic}",
                    "Message.$": "$.message",
                    "Subject.$": "$.subject"
                  },
                  "End": true
                }
              }
            }
      RoleArn: !GetAtt StepFunctionToSNSPublishRole.Arn

終わりに

検証環境など、不特定多数のスタックが作成されるケースで通知設定しておけば、何か役に立つかもしれないですね。

また、メール通知ではなく何かのトリガーにも使えそうです。

現場からは以上です!

タイトルとURLをコピーしました