CloudFormation概要
忘備録的に記載致します。
JSONファイルやYAMLファイルへ構築したいAWSサービスの設定項目を記載し、
CloudFormationへ読み込ませることで記載したサービスの構築が自動化できる。
構築
構成
EC2とかであればすぐ検索できるかと思いますので、
前回の記事のCloudWatch EventsとLambdaの連携する箇所を構築します。
※Lambdaのコードも前回の記事を参照をお願い致します。
【前回:AWS Configの通知内容をLambdaで成形】
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リソース単位で作成される為、エラー箇所が表示されます。
それらでエラー解消につながります。
CloudFormationで構築
-
名前やパラメータを入力してください。今回ロールを作成するので、
最後の「AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。」へ
チェックすることを忘れないで下さい。他はデフォルトで問題ありません。
最後に
CloudFormationは0からの挑戦だったので使い方を学ぶのが大変でした。
公式ドキュメントが充実し、先駆者様のおかげで使えるようになりました。
間違いがありましたらご指摘いただけると幸いです。