⛳
terraform奮闘記
学習記録
2023/3/7 : moduleごとに複数リージョンを使い分ける方法
2023/3/12 : s3をoriginにしたcloudfrontの要点まとめ
2023/3/7 : moduleごとに複数リージョンを使い分ける方法
参考記事
ファイル構成
ユースケース
・cloudfrontにwafをアタッチする場合、wafをus-east-1に作成しなければいけないケース
手順
- regionのエイリアスを追記
- moduleに渡す引数にprovidersを追記
- module側にprovider情報を追記
1. regionのエイリアスを追記
terraform/provider.tf
terraform {
required_version = ">= 1.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 4.9.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
# for cloudfront
provider "aws" {
region = "us-east-1"
alias = "us-east-1" ★
}
2. moduleに渡す引数にprovidersを追記
terraform/main.tf
module "waf" {
source = "./modules/waf"
enable = lookup("${var.resources_state}", "waf")
local_name = var.name
providers = {
aws = aws.us-east-1 ★
}
3. module側にprovider情報を追記
terraform/module/waf/provider.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
}
}
}
2023/3/12 : s3をoriginにしたcloudfrontの要点まとめ
ファイル構成
よくわからないargumentの解説
price_class : CloudFrontの価格帯を指定。デフォルトはパフォーマンス、低レイテンシーを優先する(PriceClass_All)。ある程度の遅延を許容できる場合は、低コストクラスを指定する(PriceClass_200 | PriceClass_100)。
default_root_object : cloudfrontのFQDNを指定した際、デフォルトで表示させるオブジェクト(今回だとhtmlファイルとか)を指定するための設定。よくある index.htmlとか
関連するリソース
- s3のpublic access block
- OAC
- s3 policy
これらはcloudfrontやS3のリソースに記述するのではなく、別個でリソース定義する。
1. s3のpublic access block
terraform/modules/cloudfront/cloudfront.tf
# block public access
resource "aws_s3_bucket_public_access_block" "example" {
for_each = local._origin_s3
bucket = aws_s3_bucket.contents_s3[each.key].bucket
block_public_acls = each.value.block_public
block_public_policy = each.value.block_public
ignore_public_acls = each.value.block_public
restrict_public_buckets = each.value.block_public
}
2. OAC
terraform/modules/cloudfront/cloudfront.tf
# OAC
resource "aws_cloudfront_origin_access_control" "oac" {
for_each = local._origin_s3
name = "${local._name}-${each.key}-OAC"
description = "Access Control"
origin_access_control_origin_type = "s3" ★
signing_behavior = "always"
signing_protocol = "sigv4"
}
s3のバケット名ではなく、s3と記述するみたい。
3. s3 policy
terraform/modules/cloudfront/cloudfront.tf
# s3 attach policy
data "template_file" "contents_s3_policy" {
for_each = local._origin_s3
template = file("${each.value.policy_path}")
vars = {
cloudfront_arn = aws_cloudfront_distribution.cf.arn
s3_buket_name = aws_s3_bucket.contents_s3[each.key].bucket
}
}
# s3 policy
resource "aws_s3_bucket_policy" "contents_policy" {
for_each = local._origin_s3
bucket = aws_s3_bucket.contents_s3[each.key].bucket
policy = data.template_file.contents_s3_policy[each.key].rendered
}
terraform/modules/cloudfront/policy/contents_s3_policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCloudFrontServicePrincipal",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::${s3_buket_name}/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "${cloudfront_arn}"
}
}
}
]
}
Discussion