LoginSignup
18
15

More than 3 years have passed since last update.

CloudFormationでCloudWatch EventsとLambdaを構築

Last updated at Posted at 2019-02-24

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

18
15
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
15