【小ネタ】CloudFormationで文字列内に変数を入れる。(YAML版)

2017.02.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

【小ネタ】CloudFormationで文字列内に変数を入れる。(YAML版)

こんにちは、岩本です。

CloudFormationを利用する際に、ある特定の値を変数として利用するケースは多いと思いますが、
ある文字列中に変数を挿入したい場合があるかと思います。

今回は、CloudFormationでIAM Policyを設定する際を例に、
ARN内に記載するリージョンAWS IDを変数として利用する場合を記載します。

サンプル

AWSTemplateFormatVersion: '2010-09-09'
Description: TEST-Policy

Resources:
  TestPolicy:
    Properties:
      PolicyDocument:
        Statement:
        - Action: lambda:InvokeFunction
          Effect: Allow
          Resource: !Sub arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:hogehoge
        Version: '2012-10-17'
      PolicyName: AWSLambdaTestPolicy
      Roles:
      - test-hogehoge-role
    Type: AWS::IAM::Policy

解説

やりたい事

  • 事前に設定した変数を元に
    Resource: arn:aws:lambda:[AWSのリージョン]:[AWSのアカウントID]:function:hogehoge
    と入力したい。

やった事

  • Resource:以後に!Sub関数を記載し、必要な箇所に${AWS::Region} ${AWS::AccountId} と記載した。
  • !Subとは?
    • CloudFormationに組み込まれている関数Fn::Subの短縮記載で、ある値の入力文字列にある変数の代わりとなります。
  • ${AWS::Region} ${AWS::AccountId} とは?
    • CloudFormationで事前に定義されたパラメータで、それぞれCloudFormationの実行リージョン・アカウントを取得します。

指定の変数を利用したい場合

Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
    - Label:
        default: AWS Account
      Parameters:
      - AWSAccountID

Parameters:
  AWSAccountID:
    ConstraintDescription: AWS ID is Only Number with 12digit
    Default: 123456789012
    MinLength: 12
    MaxLength: 12
    AllowedPattern: "[0-9]*"
    Description: Please enter Gambit System AWS ID!
    Type: String

Resources:
  TestPolicy:
    Properties:
      PolicyDocument:
        Statement:
        - Action: lambda:InvokeFunction
          Effect: Allow
          Resource: !Sub arn:aws:lambda:${AWS::Region}:${AWSAccountID}:function:hogehoge
        Version: '2012-10-17'
      PolicyName: AWSLambdaTestPolicy
      Roles:
      - test-hogehoge-role
    Type: AWS::IAM::Policy
  • ${AWS::AccountId}${AWSAccountID} と変更しました。
  • ${AWSAccountID}は、Parametersで指定した値となり、上記のように任意の変数を利用する事も可能です。