My Note

自己理解のためのブログ

TerraformでAWSの環境構築 ( S3 )

やったこと

  • TerrafprmでS3バケットを以下の設定で作成する
    • デフォルト暗号化 ( AES256 )
    • バージョニングを有効
    • アクセス制限
      • バケットポリシーを設定
      • ブロックパブリックアクセス
    • ライフサイクルを設定
      • Prefix
      • 失効の設定 ( 現行 / 以前のバージョン )
      • 保持期間の設定

今回利用したTerraformは以下。

Terraform v0.12.0
+ provider.aws v2.13.0

S3バケットを作成する

■ resource "aws_s3_bucket" "private" の全体

resource "aws_s3_bucket" "private" {
  bucket = var.bucket_name

  versioning {
    enabled = true
  }

  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        sse_algorithm = "AES256"
      }
    }
  }

  lifecycle_rule {
    id      = var.lifecycle_rule
    prefix  = var.lifecycle_prefix
    enabled = true

    noncurrent_version_expiration {
      days = var.noncurrent_version_expiration_days
    }
    expiration {
      days = var.expiration_days
    }
  }
}

バージョニングを設定

バージョニングの設定をしている部分のコード

versioning {
    enabled = true
  }

f:id:yhidetoshi:20190621231923p:plain

デフォルト暗号化

デフォルト暗号化の設定をしている部分のコード

server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        sse_algorithm = "AES256"
      }
    }
  }

f:id:yhidetoshi:20190621231945p:plain

ライフサイクルを設定

ライフサイクルの設定をしている部分のコード

lifecycle_rule {
    id      = var.lifecycle_rule
    prefix  = var.lifecycle_prefix
    enabled = true

    noncurrent_version_expiration {
      days = var.noncurrent_version_expiration_days
    }
    expiration {
      days = var.expiration_days
    }
  }
項目 意味
id ルール名
noncurrent_version_expiration 前のバージョン
expiration 現行のバージョン

f:id:yhidetoshi:20190621232020p:plain

f:id:yhidetoshi:20190621232040p:plain

ブロックパブリックアクセス

ブロックパブリックアクセスの設定をしている部分のコード

resource "aws_s3_bucket_public_access_block" "private" {
  bucket                  = "${aws_s3_bucket.private.id}"
  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

f:id:yhidetoshi:20190621232105p:plain

バケットポリシーを設定 ( dataリソースを使う )

データリソースを使う場合のコード

resource "aws_s3_bucket_policy" "bucket" {
  bucket = "${aws_s3_bucket.private.id}"
  policy = "${data.aws_iam_policy_document.sample.json}"
}

data "aws_iam_policy_document" "sample" {
    
    statement {
        sid = "AddPerm"
        effect = "Deny"
        principals {
            type = "AWS"
            identifiers = ["*"]
        }
        actions = ["s3:GetObject"]
        resources = ["arn:aws:s3:::${var.bucket_name}/*"]
    }
  
}

バケットポリシーを設定 ( JSONを使う )

JSONで書いたポリシーを埋め込んで使う場合のコード

resource "aws_s3_bucket_policy" "private" {
  bucket = "${aws_s3_bucket.private.id}"
  policy = <<EOF
{
    "Version":"2012-10-17",
    "Statement":[
      {
        "Sid":"AddPerm",
        "Effect":"Deny",
        "Principal": "*",
        "Action":["s3:GetObject"],
        "Resource":["arn:aws:s3:::${var.bucket_name}/*"]
      }
    ]
  }
EOF
}

Terraformのコード全体

ディレクトリ構造(一部抜粋)

├── modules
│   ├── s3
│   │   └── main.tf
├── s3-backend.tf
├── s3.tf

■ Module側 ( s3.tf )

module "s3-bucket" {
    source = "./modules/s3"
    bucket_name = "example_bucket"
    lifecycle_rule = "sample_rule"
    lifecycle_prefix = "test/"
    noncurrent_version_expiration_days = 60
    expiration_days = 90
}

■ Resource側 ( s3/main.tf )

variable "bucket_name" {}
variable "lifecycle_rule" {}
variable "lifecycle_prefix" {}
variable "noncurrent_version_expiration_days" {}
variable "expiration_days" {}

resource "aws_s3_bucket" "private" {
  bucket = var.bucket_name

  versioning {
    enabled = true
  }

  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        sse_algorithm = "AES256"
      }
    }
  }

  lifecycle_rule {
    id      = var.lifecycle_rule
    prefix  = var.lifecycle_prefix
    enabled = true

    noncurrent_version_expiration {
      days = var.noncurrent_version_expiration_days
    }
    expiration {
      days = var.expiration_days
    }
  }
}

resource "aws_s3_bucket_public_access_block" "private" {
  bucket                  = "${aws_s3_bucket.private.id}"
  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

resource "aws_s3_bucket_policy" "bucket" {
  bucket = "${aws_s3_bucket.private.id}"
  policy = "${data.aws_iam_policy_document.sample.json}"
}

data "aws_iam_policy_document" "sample" {
    
    statement {
        sid = "AddPerm"
        effect = "Deny"
        principals {
            type = "AWS"
            identifiers = ["*"]
        }
        actions = ["s3:GetObject"]
        resources = ["arn:aws:s3:::${var.bucket_name}/*"]
    }
  
}

まとめ

Terraformを使ってS3バケットでよく使う機能や設定を実施してみました。

- デフォルト暗号化 ( AES256 )
- バージョニングを有効
- アクセス制限
- ライフサイクルを設定