質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Terraform

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

861閲覧

Terraform:共通化について

ttoo

総合スコア126

Terraform

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2022/10/01 06:16

編集2022/10/01 06:28

Terraformの「aws_s3_bucket_public_access_block」の箇所について、
全てのS3バケットに共通しております。
こちらは一つにまとめたいのですが、プログラミングの関数みたいな形で、
ひとまとめにすることは可能でしょうか?
また、可能でしたらその設定方法をご教示ください。
「module」は利用せずに、1ファイル内で完結するものとします。

########################################################## # variable 設定 ########################################################## # 変数 variable "project" {} variable "env" {} ###################################################################### # S3 バケット ###################################################################### # データレイク用S3 resource "aws_s3_bucket" "data_lake_s3" { bucket = "${var.project}-data-lake-${var.env}" acl = "private" # S3バケットのデフォルト暗号化 server_side_encryption_configuration { rule { apply_server_side_encryption_by_default { kms_master_key_id = "aws/s3" sse_algorithm = "aws:kms" } } } tags = { Name = "${var.project}-data-lake-${var.env}" } } resource "aws_s3_bucket_public_access_block" "data_lake_s3_block" { bucket = aws_s3_bucket.data_lake_s3.id block_public_acls = true block_public_policy = true ignore_public_acls = true restrict_public_buckets = true } # データウェアハウス用S3 resource "aws_s3_bucket" "data_warehouse_s3" { bucket = "${var.project}-data-warehouse-${var.env}" acl = "private" # S3バケットのデフォルト暗号化 server_side_encryption_configuration { rule { apply_server_side_encryption_by_default { kms_master_key_id = "aws/s3" sse_algorithm = "aws:kms" } } } tags = { Name = "${var.project}-data-warehouse-${var.env}" } } resource "aws_s3_bucket_public_access_block" "data_warehouse_s3_block1" { bucket = aws_s3_bucket.data_warehouse_s3.id block_public_acls = true block_public_policy = true ignore_public_acls = true restrict_public_buckets = true } # データマート用S3 resource "aws_s3_bucket" "data_mart_s3" { bucket = "${var.project}-data-mart-${var.env}" acl = "private" # S3バケットのデフォルト暗号化 server_side_encryption_configuration { rule { apply_server_side_encryption_by_default { kms_master_key_id = "aws/s3" sse_algorithm = "aws:kms" } } } tags = { Name = "${var.project}-data-mart-${var.env}" } } resource "aws_s3_bucket_public_access_block" "data_mart_s3_block2" { bucket = aws_s3_bucket.data_mart_s3.id block_public_acls = true block_public_policy = true ignore_public_acls = true restrict_public_buckets = true } # Athena用 resource "aws_s3_bucket" "athena_log_s3" { bucket = "${var.project}-athena-log-${var.env}" acl = "private" key = "analytics/" # S3バケットのデフォルト暗号化 server_side_encryption_configuration { rule { apply_server_side_encryption_by_default { kms_master_key_id = "aws/s3" sse_algorithm = "aws:kms" } } } tags = { Name = "${var.project}-athena-log-${var.env}" } } resource "aws_s3_bucket_public_access_block" "athena_log_s3_block3" { bucket = aws_s3_bucket.athena_log_s3.id block_public_acls = true block_public_policy = true ignore_public_acls = true restrict_public_buckets = true }

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

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

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

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

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

guest

回答1

0

ベストアンサー

※コメント欄で質問があり、個別にresourceを定義する理由を追記しました。

まとめることは可能ですが、自分なら個別にresourceを定義します。

複数resourceの定義をまとめてしまうと、個別に変更ができなくなります。例えば、data_lake_s3バケットだけaws_s3_bucket_public_access_blockの属性を変更したくなったらどうするのでしょうか?

もちろん、コードを改変してdata_lake_s3バケットのaws_s3_bucket_public_access_blockだけ個別に定義することは可能です。しかし、インフラを公開した後は安易にリソースを変更できないので、インフラのコード改変はアプリケーションと比べてコストが大きいです。ですので、コードの改変ができるだけ発生しないように実装した方が変更が容易になります。

将来に渡ってaws_s3_bucket_public_access_block属性の変更要件が発生しないことを担保できるのであれば1定義にまとめてもいいと思いますが、そこまで読み切るのは難しいと思います。

また、このケースでは定義をまとめることにそれほどメリットがあるとは感じられず、設計・実装コストに見合わないと思いました。(ここは人それぞれかもしれません)

したがって自分なら個別にresource定義しますが、for_eachでまとめることはできます。(planまでしか確認してません)

tf

1resource "aws_s3_bucket_public_access_block" "this" { 2 for_each = { 3 for i, id in [ 4 aws_s3_bucket.data_lake_s3.id, 5 aws_s3_bucket.data_warehouse_s3.id, 6 aws_s3_bucket.data_mart_s3.id, 7 aws_s3_bucket.athena_log_s3.id 8 ] : i => id 9 } 10 11 bucket = each.value 12 13 block_public_acls = true 14 block_public_policy = true 15 ignore_public_acls = true 16 restrict_public_buckets = true 17}
$ terraform plan (省略) # aws_s3_bucket_public_access_block.this["0"] will be created + resource "aws_s3_bucket_public_access_block" "this" { + block_public_acls = true + block_public_policy = true + bucket = (known after apply) + id = (known after apply) + ignore_public_acls = true + restrict_public_buckets = true } # aws_s3_bucket_public_access_block.this["1"] will be created + resource "aws_s3_bucket_public_access_block" "this" { + block_public_acls = true + block_public_policy = true + bucket = (known after apply) + id = (known after apply) + ignore_public_acls = true + restrict_public_buckets = true } # aws_s3_bucket_public_access_block.this["2"] will be created + resource "aws_s3_bucket_public_access_block" "this" { + block_public_acls = true + block_public_policy = true + bucket = (known after apply) + id = (known after apply) + ignore_public_acls = true + restrict_public_buckets = true } # aws_s3_bucket_public_access_block.this["3"] will be created + resource "aws_s3_bucket_public_access_block" "this" { + block_public_acls = true + block_public_policy = true + bucket = (known after apply) + id = (known after apply) + ignore_public_acls = true + restrict_public_buckets = true }

参考

投稿2022/10/01 08:43

編集2022/10/01 10:23
jhashimoto

総合スコア838

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

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

ttoo

2022/10/01 08:55

ご回答ありがとうございます! 一点ご質問で、「自分なら個別にresource定義しますが」こちらはどうして個別で設定するのがいいんでしょうか?
jhashimoto

2022/10/01 09:50

aws_s3_bucket_public_access_blockを変更可能にしておきたいからです。長くなってしまったので、回答に追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問