!Ref !Sub ${EnvName}-xxxはできないので!GetAttで代替

AWS

CloudFormation の Outputs セクションで Elastic IP (EIP) の情報を出力する際に、!Ref !Sub ${EnvName}-xxx!GetAtt を使って書き換えたい場合、以下のように進めます。

ポイント:

  • !GetAtt はリソースの属性値を取得します。
  • リソースの論理IDはテンプレート内で静的に定義されており、!Sub や他の関数で動的に生成することはできません。
  • !GetAtt の構文は !GetAtt [リソース論理ID, 属性名] です。

手順:

  1. リソースの論理IDを直接使用する:
    • まず、EIP リソースの論理IDを確認します。例えば、MyEIP とします。
    • !GetAtt を使って、そのリソースの特定の属性(例えば PublicIp)を取得します。
  2. Outputs セクションの書き換え:Outputs: EipOutput: Value: !GetAtt MyEIP.PublicIp
    • これにより、指定した EIP リソースのパブリックIPアドレスを出力します。

注意点:

  • リソースの論理IDは動的に変更できない:
    • !Sub を使ってリソースの論理IDを動的に生成することはできません。
    • そのため、!GetAtt 内で !Sub ${EnvName}-xxx のようにリソース名を組み立てることはできません。
  • リソースが他のスタックにある場合:
    • 別のスタックからリソースを参照する場合は、スタックのエクスポート/インポート機能(ExportImportValue)を使用します。

例:

Resources:
  MyEIP:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
      Tags:
        - Key: Name
          Value: !Sub '${EnvName}-xxx'

Outputs:
  EipPublicIp:
    Value: !GetAtt MyEIP.PublicIp

これにより、MyEIP リソースのパブリックIPアドレスを出力できます。

まとめ:

!Ref !Sub ${EnvName}-xxx!GetAtt で書き換える場合、リソースの論理IDを直接指定し、その属性を取得する形にします。動的にリソースの論理IDを生成することはできないため、テンプレート内で使用している論理IDを正確に指定する必要があります。

コメント

タイトルとURLをコピーしました