質問するログイン新規登録
Terraform

Terraformは、インフラ構築のためのツールです。AWS/DigitalOcean/GoogleCloudといった様々なインフラに対応。インフラ構成のコード管理や変更の作業などの手間を自動化し、インフラ構築の効率化を図ることができます。

Q&A

解決済

2回答

224閲覧

Terraformのmodule cloudfront を利用し CloudFront Functionを設定する場合・しない場合をtfvarsで切り変えたい

GotHokLin

総合スコア40

Terraform

Terraformは、インフラ構築のためのツールです。AWS/DigitalOcean/GoogleCloudといった様々なインフラに対応。インフラ構成のコード管理や変更の作業などの手間を自動化し、インフラ構築の効率化を図ることができます。

0グッド

1クリップ

投稿2024/08/02 10:08

0

1

実現したいこと

現在、TerraformにてAWSに環境を作成しています。
複数の環境を用意する必要があるのですが、なるべくTerraform側のソースを共通化したいと考えております。

  • 環境はディレクトリ単位で切り替える
  • ディレクトリ単位でterraform initでterraformの環境を準備する
  • CloudFrontなどのAWSリソースを定義するTerraformのソースは別ディレクトリに置いて、環境ごとのディレクトリにはそのファイルをシンボリックリンクを貼る
  • 各ディレクトリにterraform.tfvarsファイルを置き、環境ごとの差異がある分を定義する
  • Terraformのソース内では、できるだけTerraform Registroyで公開されているModuleを利用して、resource文で定義する箇所を減らしたい

CloudFrontそのものを作成する・しないは、create_distribution の true / falseにteraform.tfvars内で定義したvaliable変数を渡して制御しています。

環境ごとにCloudFront Functionが必要な場合と不要な場合があります。

発生している問題・分からないこと

以下のように記述してCloudFront Functionが必要な場合は問題なく

hcl

1 function_association = { 2 viewer-request = { 3 function_arn = var.cloudfront_viewer_request_arn 4 } 5 }

function_arn の部分を function_arn = "" にすると、以下のようなエラーになります。

text

1module.cloudfront[0].aws_cloudfront_distribution.this[0]: Modifying... [id=E19I5NMMR4CRHM] 23│ Error: updating CloudFront Distribution (〓ディストリビューションID〓): operation error CloudFront: UpdateDistribution, https response error StatusCode: 400, RequestID: 〓リクエストID〓, api error MalformedXML: 1 validation error detected: Value '' at 'distributionConfig.defaultCacheBehavior.functionAssociations.items.1.member.functionARN' failed to satisfy constraint: Member must satisfy regular expression pattern: arn:aws:cloudfront::[0-9]{12}:function\/[a-zA-Z0-9-_]{1,64} 45│ with module.cloudfront[0].aws_cloudfront_distribution.this[0], 6│ on .terraform\modules\cloudfront\main.tf line 27, in resource "aws_cloudfront_distribution" "this": 7│ 27: resource "aws_cloudfront_distribution" "this" { 8

function_arn の部分を function_arn = false にすると、以下のようなエラーになります。

text

1Planning failed. Terraform encountered an error while generating this plan. 2 34│ Error: "default_cache_behavior.0.function_association.0.function_arn" (false) is an invalid ARN: arn: invalid prefix 56│ with module.cloudfront[0].aws_cloudfront_distribution.this[0], 7│ on .terraform\modules\cloudfront\main.tf line 27, in resource "aws_cloudfront_distribution" "this": 8│ 27: resource "aws_cloudfront_distribution" "this" { 910

function_arn の部分を function_arn = null にすると、以下のようなエラーになります。

text

1Planning failed. Terraform encountered an error while generating this plan. 2 34│ Error: Missing required argument 56│ with module.cloudfront[0].aws_cloudfront_distribution.this[0], 7│ on .terraform\modules\cloudfront\main.tf line 27, in resource "aws_cloudfront_distribution" "this": 8│ 27: resource "aws_cloudfront_distribution" "this" { 910│ The argument "default_cache_behavior.0.function_association.0.function_arn" is required, but no definition was found. 11

こういった動作をさせることは可能でしょうか。
可能な場合、どのように記述すべきでしょうか。
以上、よろしくお願いいたします。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

Webを検索してもマッチした情報を見つけることができませんでした。

補足

環境は以下の通りです。
Terraform v1.9.2
provider registry.terraform.io/hashicorp/aws v5.58.0
CoudFrontモジュール terraform-aws-modules/cloudfront/aws 3.4.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GotHokLin

2024/08/22 07:28

68userさん、コメントありがとうございました。 別件で忙殺状態でお礼もお伝えしておりませんでいた。大変失礼いたしました。 挙げていただいた内容でうまくいきそうです。 私自身がDynamic Blockを使ったことがないので、まだピンときていないところがありますが、まさにやろうとしていたことがここに記載されておりました。 頂いた記事・Dynamic Block自体も理解して利用してみたいと思います。
guest

回答2

0

自己解決

すっかり遅くなってしまいましたが、こちらの件は以下のように実現しました。
以下のように記述し、うまくいっております。
どなたかの参考になれば幸いです。
なお、こちらはモジュールのバージョンを3.4.0に固定しています。
2025年8月10日現在、CloudFrontのモジュールは5.0.0となっているようです。
新規に構築する場合は、新しいバージョンを利用する方がよいかと思いますので、その辺ご留意ください。

terraform.tfvars内

text

1create_cloudfront = true

CloudFront作成moduleの記述

hcl

1module "cloudfront" { 2 count = var.create_cloudfront ? 1 : 0 3 create_distribution = var.create_cloudfront 4 create_origin_access_control = var.create_cloudfront 5 source = "terraform-aws-modules/cloudfront/aws" 6 version = "3.4.0" 7……

投稿2025/08/10 08:14

編集2025/08/10 08:21
GotHokLin

総合スコア40

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

なお、上記の記述が、モジュールのバージョンを3.4.0に固定しています。
2025年8月10日現在、CloudFrontのモジュールは5.0.0となっているようです。
新たに作成する場合は、新しいバージョンを利用する方がよいかと思いますので、ご留意ください。

上記、ここに記述すると分かりにくかったため、削除したかったですが、削除ができませんでした。
取り消し線で消して、自己解決欄のコメントに追記しておきます。

投稿2025/08/10 08:18

編集2025/08/10 08:23
GotHokLin

総合スコア40

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問