困っていた内容
リソース情報を SSM パラメーターストア の StringList型パラメータで管理しています。
CloudFormation でパラメータ内の一部の値を動的参照するように書きたいのですが、テンプレートの書き方を教えてください。
なお、AWS公式ドキュメントは確認しましたが、一部の値だけを参照する方法はなさそうに見えました。
動的な参照を使用してテンプレート値を指定する - AWS CloudFormation
パラメーターストアの値
名前: /CloudFormation/VPC
種類: StringList
値: sg-1234567890abcdefg,subnet-abcdg1234567890
CloudFormationテンプレート
AWSTemplateFormatVersion: '2010-09-09'
Description: VPC function.
Resources:
Function:
Type: AWS::Lambda::Function
Properties:
Handler: index.handler
Role: arn:aws:iam::123456789012:role/lambda-role
Code:
S3Bucket: my-bucket
S3Key: function.zip
Runtime: nodejs12.x
Timeout: 5
TracingConfig:
Mode: Active
VpcConfig:
SecurityGroupIds:
- sg-1234567890abcdefg # パラメータから動作参照にしたい
SubnetIds:
- subnet-abcdg1234567890 # パラメータから動作参照にしたい
どう対応すればいいの?
パラメータセクションと組み込み関数Fn::Select
をご利用ください。
具体的には次のようなテンプレートを作成すると、パラメータ内の一部の値を動的参照できます。
CloudFormationテンプレート
AWSTemplateFormatVersion: '2010-09-09'
Description: VPC function.
Parameters:
Vpc:
Type: AWS::SSM::Parameter::Value<List<String>>
Default: "/CloudFormation/VPC"
Resources:
Function:
Type: AWS::Lambda::Function
Properties:
Handler: index.handler
Role: arn:aws:iam::123456789012:role/lambda-role
Code:
S3Bucket: my-bucket
S3Key: function.zip
Runtime: nodejs12.x
Timeout: 5
TracingConfig:
Mode: Active
VpcConfig:
SecurityGroupIds:
- !Select [ 0, !Ref Vpc]
SubnetIds:
- !Select [ 1, !Ref Vpc]
動的な参照ではできないの?
2022年9月時点の挙動として、次のような「動作な参照」で取得したパラメータから一部の値を取得する書き方を行うと、配列全体の値が返却されます。
!Select [ 0, !Split [',', '{{resolve:ssm:/CloudFormation/VPC}}']]
区切り記号を:
に変更すると{{resolve
が返却されることから、動作な参照が行われる前に組み込み関数が処理されるようです。
そのため、現時点では「動的な参照」では SSM パラメーターストアのパラメータから一部の値を取得できないようです。
参考資料
- パラメータ - AWS CloudFormation
- 動的な参照を使用してテンプレート値を指定する - AWS CloudFormation
- Fn::Select - AWS CloudFormation
- Fn::Split - AWS CloudFormation
- AWS::Lambda::Function - AWS CloudFormation
- Alert when doing a split on a dynamic reference · Issue #2181 · aws-cloudformation/cfn-lint
- AWS SSM Parameter StoreのString型とStringList型はどう違う? | DevelopersIO
- AWS Systems Manager Parameter Store - AWS Systems Manager
- CloudFormation の参照周りで意識すべきポイント・Tips | DevelopersIO
- CloudFormation 文字列の配列をパラメータで渡してテンプレートを実行したいとき、CommaDelimitedListを使ってみる | DevelopersIO
- CloudFormationのParametersの入力方法の違いをデータ型ごとに一覧にしてみた | DevelopersIO