Help us understand the problem. What is going on with this article?

CloudFormationでCloudWatch EventsとLambdaを構築

CloudFormation概要

忘備録的に記載致します。

JSONファイルやYAMLファイルへ構築したいAWSサービスの設定項目を記載し、
CloudFormationへ読み込ませることで記載したサービスの構築が自動化できる。

■ 公式リンク
公式ページ
ブラックベルト

構築

構成

EC2とかであればすぐ検索できるかと思いますので、
前回の記事のCloudWatch EventsとLambdaの連携する箇所を構築します。
※Lambdaのコードも前回の記事を参照をお願い致します。
【前回:AWS Configの通知内容をLambdaで成形】

CFn.PNG

CloudFormation

テンプレート
CloudFormationのパラメータはLambdaへ渡す為のものとなります。

AWSTemplateFormatVersion: 2010-09-09
Description: CFn test
Parameters: 
    変数名:CloudFormationで使用できる変数
        Type: String
        Description:(変数の説明文) 
    S3Name:
        Type: String
    ZipF:
        Type: String
    P3Handler:
        Type: String
Resources:
    以下AWSサービスの内容

今回のパラメータの意図

LambdaのコードはYAMLファイルへ直書きをせずS3へ保存し、それを参照させます。

  • S3Name:python3のコードを保存したS3バケット名
  • ZipF:python3のコードを記載したファイル名
  • P3Handler:上記ファイル名から「.zip」を外した文字

CloudWatch Events

YAMLファイルの記載内容
内容はGUIでEventsのルールを作成するとイベントパターンが閲覧できる為、
実際に作成したいイベントを手で設定してみると参考になります。

IAMの設定変更検知

EventRule:
    Type: 'AWS::Events::Rule'
    Properties:
      Description: EventRule
      EventPattern:
        source:
          - aws.config
        detail-type:
          - Config Configuration Item Change
        detail:
          configurationItem:
            resourceType:
              - 'AWS::IAM::User'
              - 'AWS::IAM::Group'
              - 'AWS::IAM::Role'
              - 'AWS::IAM::Policy'
      State: ENABLED
      Targets:
        - Arn: !GetAtt 
            - LambdaTestFunction
            - Arn
          Id: TargetFunctionV1
    DependsOn:
      - LambdaTestFunction

ルールの準拠・非準拠検知

  EventRule:
    Type: 'AWS::Events::Rule'
    Properties:
      Description: EventRule
      EventPattern:
        source:
          - aws.config
        detail-type:
          - Config Rules Compliance Change
      State: ENABLED
      Targets:
        - Arn: !GetAtt 
            - LambdaTestFunction
            - Arn
          Id: TargetFunctionV1
    DependsOn:
      - LambdaTestFunction

項目の補足

resourceType:IAMの項目を記載し、IAMの設定変更を通知対象にする。
Targets:CloudWatch Eventsへ関連づけるLambdaを記載
公式参考ドキュメント

CloudWatch EventsへLambdaのロールを付与

  PermissionForEventsToInvokeLambda:
    Type: 'AWS::Lambda::Permission'
    Properties:
      FunctionName: !Ref LambdaTestFunction
      Action: 'lambda:InvokeFunction'
      Principal: events.amazonaws.com
      SourceArn: !GetAtt 
        - EventRule
        - Arn

公式参考ドキュメント

Lambda

  LambdaTestFunction:
    Type: 'AWS::Lambda::Function'
    Properties:
      Code:
        S3Bucket: !Ref S3Name
        S3Key: !Ref ZipF
      Environment:
        Variables:
      FunctionName: Config-item-change-test
      Handler: P3Handler.lambda_handler
      Runtime: python3.6
      Timeout: '3'
      Role: !GetAtt 
        - LambdaExecutionRole
        - Arn

項目の補足

  • S3Bucket: python3のコードを保存したS3バケット名
  • S3Key:python3のコードを記載したファイル名
  • Handler:上記ファイル名から「.zip」を外した文字

公式参考ドキュメント

今回作成したLambda用のPolicy作成と付与

  LambdaExecutionRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Path: /
      Policies:
        - PolicyName: lambdatest
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - 'logs:CreateLogGroup'
                  - 'logs:CreateLogStream'
                  - 'logs:PutLogEvents'
                  - 's3:PutAnalyticsConfiguration'
                  - 's3:PutAccelerateConfiguration'
                  - 's3:ReplicateObject'
                  - 's3:PutEncryptionConfiguration'
                  - 's3:PutBucketTagging'
                  - 's3:PutLifecycleConfiguration'
                  - 's3:PutObjectTagging'
                  - 's3:PutBucketVersioning'
                  - 's3:PutMetricsConfiguration'
                  - 's3:PutReplicationConfiguration'
                  - 's3:PutObjectVersionTagging'
                  - 's3:PutBucketCORS'
                  - 's3:PutInventoryConfiguration'
                  - 's3:PutObject'
                  - 's3:PutBucketNotification'
                  - 's3:PutBucketWebsite'
                  - 's3:PutBucketRequestPayment'
                  - 's3:PutBucketLogging'
                  - 's3:ListBucket'
                  - 'sns:Publish'
                Resource:
                  - '*'

公式参考ドキュメント

すべてを一つにまとめる

テンプレートの「Resources:」から次の行へインデントを入れ、張り付けていってください。

AWSTemplateFormatVersion: 2010-09-09
Description: CFn test
Parameters: 
    S3Name:
        Type: String
    ZipF:
        Type: String
    P3Handler:
        Type: String
Resources:
  LambdaTestFunction:
    Type: 'AWS::Lambda::Function'
    Properties:
      Code:
        S3Bucket: !Ref S3Name
        S3Key: !Ref ZipF
      Environment:
        Variables:
      FunctionName: Config-item-change-test
      Handler: P3Handler.lambda_handler
      Runtime: python3.6
      Timeout: '3'
      Role: !GetAtt 
        - LambdaExecutionRole
        - Arn

CloudFormationでテンプレートのチェック

CloudFormationにはテンプレートが正しいか否かをチェックする事ができます。
AWSリソース単位で作成される為、エラー箇所が表示されます。
それらでエラー解消につながります。

  1. CloudFormationのメニュ内 テンプレートのデザインから
    image.png

  2. 右上のファイルアイコンから「開く」を選択し、上記で作成したYAMLファイルを開きます。
    image.png

  3. YAMLファイルのフォーマットが正しければ以下のようにアイコンと矢印が出ます。
    image.png

CloudFormationで構築

  1. アップロードアイコンをクリックすることで、構築に入ります。
    image.png

  2. 名前やパラメータを入力してください。今回ロールを作成するので、
    最後の「AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。」へ
    チェックすることを忘れないで下さい。他はデフォルトで問題ありません。

最後に

CloudFormationは0からの挑戦だったので使い方を学ぶのが大変でした。
公式ドキュメントが充実し、先駆者様のおかげで使えるようになりました。
間違いがありましたらご指摘いただけると幸いです。

tomoki_s
AWSもPythonもコンテナも勉強しないと!
stylez
WEB・業務システム、インフラ構築・運用監視まで、幅広い開発実績と経験豊富なエンジニアによる自社開発体制で、スピーディかつ高クオリティのシステム開発を手掛けています。AWSをはじめ各種クラウドやベンダーパートナーとして総合的なITサービスや、独自移行ツールを使ったマイグレーション、サーバーレスなシステム構築、コンテナを利用したDevOpsコンサルティングなどを提供しています。
https://www.stylez.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away