terraform奮闘記

2023/03/08に公開

学習記録

2023/3/7 : moduleごとに複数リージョンを使い分ける方法
2023/3/12 : s3をoriginにしたcloudfrontの要点まとめ

2023/3/7 : moduleごとに複数リージョンを使い分ける方法

参考記事
https://medium.com/@jyotti/terraform-multi-region-79a84ce1da0c


ファイル構成

ユースケース
・cloudfrontにwafをアタッチする場合、wafをus-east-1に作成しなければいけないケース

手順

  1. regionのエイリアスを追記
  2. moduleに渡す引数にprovidersを追記
  3. 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とか

関連するリソース

  1. s3のpublic access block
  2. OAC
  3. 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