CloudFormation ForEach組み込み関数のループ処理で英数字以外(「-」や「.」)のパラメータを使う方法

2023.09.08

こんにちは。
繁松です。

はじめに

CloudFormation ForEach組み込み関数を使った際に以下のようなエラーに遭遇したことはありませんか?

Transform AWS::LanguageExtensions failed with: OutputKey 'Topicshigematsu-kodai' should be alphanumeric. Rollback requested by user.

このエラーは、ForEach関数のパラメータに英数字以外の文字列(「-」、「.」など)が使われた場合に発生するエラーです。
CloudFormation内の論理ID(Logical ID)では英数字以外の文字列(「-」、「.」など)を使うことができません。
ForEach関数を使った場合は指定したパラメータが論理IDとなるためエラーになります。

エラー例

  • "shigematsu-kodai, kurameso-taro, mesokura-jiro"のトピックを作成したいのでParametersから値を参照しForEach関数で作成しようとしている
  • 論理 ID「'Topic${SNSName}':」を「Topicshigematsu-kodai」に設定しようとしているのでエラーになる
AWSTemplateFormatVersion: 2010-09-09  
Transform: 'AWS::LanguageExtensions'  

Parameters:  
  Names:  
    Type: CommaDelimitedList  
    Default: "shigematsu-kodai, kurameso-taro, mesokura-jiro"  
  
Resources:  
  'Fn::ForEach::LoopName':  
    - SNSName  
    - !Ref Names  
    - 'Topic${SNSName}':  
        Type: 'AWS::SNS::Topic'  
        Properties:  
          TopicName: !Ref SNSName

結果

ForEach関数で英数字以外のパラメータを指定したテンプレート

ForEach組み込み関数を使いたいけど、リソースに「-」や「.」も使いたいといった場合の対応策です。
今回はSNSトピック「shigematsu-kodai, kurameso-taro, mesokura-jiro」をForEach関数を使って作成していきます。

成功例

  • 「-」や「.」を使いたい場所を英数字(今回は0)にして、あとから「-」に置き換える
  • 論理 IDは「Topicshigematsu0kodai」に、パラメータは「shigematsu-kodai」になりエラーを回避できる
AWSTemplateFormatVersion: 2010-09-09  
Transform: 'AWS::LanguageExtensions'  

Parameters:  
  Names:  
    Type: CommaDelimitedList  
    Default: "shigematsu0kodai, kurameso0taro, mesokura0jiro"  
  
Resources:  
  'Fn::ForEach::LoopName':  
    - SNSName  
    - !Ref Names  
    - 'Topic${SNSName}':  
        Type: 'AWS::SNS::Topic'  
        Properties:  
          TopicName: !Join [ "-", !Split ["0", !Ref SNSName]]

結果

  • 「-」を利用してリソースを作成することができました。


さいごに

色々試してみましたが、ForEachに渡す値は英数字にして、リソースのパラメータでSplit関数、Join関数などを使っていい感じ置き換える方法しか見つけることできませんでした。
※他に良い方法あれば教えてください。

以上繁松でした。

参考