目次
はじめに
こんにちは、ディーネットの牛山です。
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の変更内容は他にもありますので、公式ページを確認することを推奨します。
プロフィール
AWSの設計・構築をメインにおこなっています。
運用・保守をおこなう部署におりましたが、最近、アーキテクト課に異動しました。
日々精進しております。
LINK
クラウドベリージャム:プロフィールページ