CloudFormation、関数の使い方個人的メモ
◆!Ref
・入力されたパラメータ値の参照
・リソースの参照
・リソースのパラメータに必要な値が Ref による 戻り値で書けるかどうか 、書けない場合は GetAtt による 属性で書けるかどうか 、調査が必要
◆!GetAtt
・Arn、RoleIdの参照
◆Outputs
・別スタックで値を参照する時(クロススタック参照)
└参照元:Outputsセクションに任意のパラメータを記述。
対象のリソースはValue: !Refで参照する。
参照先:!ImportValue 任意のパラメータ。
・cloudformaitonのコンソールに値を出力
cloudformationの値の引き回し
クロススタック参照(Outputs+ImportValue)、CloudFormationのネスト機能
- クロススタック参照(Outputs+ImportValue):上記の「◆Outputs」
- CloudFormationのネスト機能
上位のテンプレートからネストしている下位のテンプレートへの値の引き回しができる
https://qiita.com/tyoshitake/items/ff08855d629ba4097125
AWS Systems Manager パラメータストアに格納されているプレーンテキスト値の ssm
- {{resolve:service-name:reference-key}}
- reference-key
└パラメータ名とバージョン番号
⇒{{resolve:ssm:parameter-name:version}}
◆Conditionsセクション
リソースを作成する、しないを環境ごとに制御したいときに使用する。
!Refで参照したhoge1がdevと同じであればCreateDevResourcesはtrue、違うならfalse
Conditions:
CreateDevResources: !Equals [!Ref hoge1, dev]
◆!Equals
[]内の第一引数と第二2引数が同じであればtrue、違う場合はfalseを返す
!Equals [!Ref hoge1, dev]
◆!IF
三項演算子のように使用する。
[]の第一引数がtrueの場合は第二引数(10)がaaaに代入される。falseの場合は100がaaaに代入される
Properties:
aaa: !If [CreateDevResources, 10, 100]
RefとSubの違い
・Ref:リソース、パラメータをそのまま参照
・Sub:${}で値を参照し、文字列結合が可能
◆Parameters
templateのParameters:セクションに記載するパラメータは、cloudformationのデプロイ時に入力するパラメータに対応している。
以下のように記載すると、cloudformaitonのデプロイ時にBotNameの入力欄が表示される。
Parameters:
BotName:
Type: String
Default: "SampleBot"
- CloudFormationのネスト機能を使った値の引き回しをやってみた。
下記のlambdaのソースをzip化しS3バケットに配置。
import os
def lambda_handler(event, context):
param_1_from_master = os.environ['PARAM_1_FROM_MASTER']
param_2_from_master = os.environ['PARAM_2_FROM_MASTER']
param_3_from_master = os.environ['PARAM_3_FROM_MASTER']
print(f"Value from Master Param 1: {param_1_from_master}")
print(f"Value from Master Param 2: {param_2_from_master}")
print(f"Value from Master Param 3: {param_3_from_master}")
return "Success"
下記のネストされたテンプレートのソースをS3バケットに配置。
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
Param1FromMaster:
Type: String
Param2FromMaster:
Type: String
Param3FromMaster:
Type: String
Resources:
LambdaExecutionRole:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: LambdaExecutionPolicy
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
Resource: arn:aws:logs:*:*:*
MyLambdaFunction:
Type: "AWS::Lambda::Function"
Properties:
Handler: lambda_function.lambda_handler
Role: !GetAtt LambdaExecutionRole.Arn
Code:
S3Bucket: バケット名
S3Key: S3キー
Runtime: python3.8
Environment:
Variables:
PARAM_1_FROM_MASTER: !Ref Param1FromMaster
PARAM_2_FROM_MASTER: !Ref Param2FromMaster
PARAM_3_FROM_MASTER: !Ref Param3FromMaster
下記の親テンプレートのソースをS3バケットに配置。
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
MasterParam1:
Type: String
Default: "Hello from Master Param 1"
MasterParam2:
Type: String
Default: "Hello from Master Param 2"
MasterParam3:
Type: String
Default: "Hello from Master Param 3"
Resources:
NestedStack:
Type: "AWS::CloudFormation::Stack"
Properties:
TemplateURL: ネストした下位のテンプレートのオブジェクトURL
Parameters:
Param1FromMaster: !Ref MasterParam1
Param2FromMaster: !Ref MasterParam2
Param3FromMaster: !Ref MasterParam3
これでcfnでデプロイすると環境変数が設定されたLambdaが作成される。