CloudFormation で Parameter Store の StringList 型から一部の値を参照する方法を教えてください
困っていた内容
リソース情報を SSM パラメーターストア の StringList型パラメータで管理しています。
CloudFormation でパラメータ内の一部の値を動的参照するように書きたいのですが、テンプレートの書き方を教えてください。
なお、AWS公式ドキュメントは確認しましたが、一部の値だけを参照する方法はなさそうに見えました。
動的な参照を使用してテンプレート値を指定する - AWS CloudFormation
名前: /CloudFormation/VPC 種類: StringList 値: sg-1234567890abcdefg,subnet-abcdg1234567890
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
をご利用ください。
具体的には次のようなテンプレートを作成すると、パラメータ内の一部の値を動的参照できます。
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