TerraformでAWSの環境構築 ( S3 )
やったこと
- TerrafprmでS3バケットを以下の設定で作成する
- デフォルト暗号化 ( AES256 )
- バージョニングを有効
- アクセス制限
- バケットポリシーを設定
- ブロックパブリックアクセス
- ライフサイクルを設定
- Prefix
- 失効の設定 ( 現行 / 以前のバージョン )
- 保持期間の設定
今回利用したTerraformは以下。
Terraform v0.12.0 + provider.aws v2.13.0
S3バケットを作成する
- Terraform公式ドキュメント:
■ 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 }
デフォルト暗号化
デフォルト暗号化の設定をしている部分のコード
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 } }
項目 | 意味 |
---|---|
id | ルール名 |
noncurrent_version_expiration | 前のバージョン |
expiration | 現行のバージョン |
ブロックパブリックアクセス
ブロックパブリックアクセスの設定をしている部分のコード
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 }
バケットポリシーを設定 ( 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 ) - バージョニングを有効 - アクセス制限 - ライフサイクルを設定