Terraform 1.9で知っておきたいtemplatestringのこと

はじめに

ブログ執筆久方ぶりになってしまいましたが、皆さまいかがお過ごしでしょうか。

さて、今回は、Terraform1.9より新しいtemplatestring関数の周知がありました。

この関数は、既存のtemplatefile関数の機能から新しいtemplatestring関数で動的なテンプレートに対応するものです。

CloudFormationテンプレートパラメータ等動的に変更が要求されるものに有用です。

やってみた

テンプレート準備

AWSより提供される「AWSCloudFormationStackSetAdministrationRole」をデプロイするCloudFormationテンプレートを参照し、 templatestring関数を使用し動的に書き換える内容となります。

data "http" "cfn_template" {
  url = "https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/AWSCloudFormationStackSetAdministrationRole.yml"
}

locals {
  template_content = data.http.cfn_template.response_body
}

resource "aws_cloudformation_stack" "example" {
  name = "example-stack"
  template_body = templatestring(local.template_content, {
    ExecutionRoleName = "exampleExecutionRole"
  })

  parameters = {
    AdministrationRoleName = "exampleRoleName"
  }

  tags = {
    Environment = "production"
  }

  capabilities = ["CAPABILITY_NAMED_IAM"]
}

補完対象

HTTPデータスソースを使用して、動的にCloudFormationテンプレートを取得し、templatestring関数でテンプレートの内容が補完されデプロイされます。

S3から提供されるテンプレートは次の通りとなっており、次の箇所を置き替えることなどに対応しています。

- !Sub 'arn:*:iam::*:role/${ExecutionRoleName}'

AWSTemplateFormatVersion: 2010-09-09
Description: Configure the AWSCloudFormationStackSetAdministrationRole to enable use of AWS CloudFormation StackSets.

Parameters:
  AdministrationRoleName:
    Type: String
    Default: AWSCloudFormationStackSetAdministrationRole
    Description: "The name of the administration role. Defaults to 'AWSCloudFormationStackSetAdministrationRole'."
  ExecutionRoleName:
    Type: String
    Default: AWSCloudFormationStackSetExecutionRole
    Description: "The name of the execution role that can assume this role. Defaults to 'AWSCloudFormationStackSetExecutionRole'."

Resources:
  AdministrationRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Ref AdministrationRoleName
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: cloudformation.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      Policies:
        - PolicyName: AssumeRole-AWSCloudFormationStackSetExecutionRole
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - sts:AssumeRole
                Resource:
                  - !Sub 'arn:*:iam::*:role/${ExecutionRoleName}'

デプロイ結果

terraform plan、terraform apply後、AWSマネージメントコンソールからCloudFormationサービスページにいき、対象のスタックを確認するとtemplatestring内のExecutionRoleName値に置き換わっていることが確認できます。

※terraform plan時点で置き換わりの確認はおこなえます。

まとめ

いかがでしたでしょうか、templatestring関数によって活用の幅が広がったと思います。

Terraform 1.9の変更内容は他にもありますので、公式ページを確認することを推奨します。