AWS
CloudFormation
lambda
CloudWatchEvents

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からの挑戦だったので使い方を学ぶのが大変でした。

公式ドキュメントが充実し、先駆者様のおかげで使えるようになりました。

間違いがありましたらご指摘いただけると幸いです。