[Terraform functions ứng dụng] Thiết lập điều kiện cho AWS IAM policy theo S3 bucket name mà người dùng nhập vào
Giả sử bạn cần tạo template có chứa các policy liên quan đến S3, nhưng lại không biết trước được S3 bucket tên là gì. Mà IAM policy thì cần chỉ định đến arn của resource, nếu để dạng:
arn:aws:s3:::*
thì không ổn chút nào, bạn muốn dạng:
arn:aws:s3:::<tên bucket>
arn:aws:s3:::<tên bucket>/*
Thì bạn có thể sử dụng function formatlist().
Ví dụ cách thực hiện:
data "aws_iam_policy_document" "lambda_function_policy_s3" {
count = local.create_lambda_role && var.attach_s3_policy ? 1 : 0
statement {
actions = [
"s3:GetBucketTagging",
"s3:GetBucketVersioning",
"s3:GetBucketAcl",
"s3:ListBucketVersions",
"s3:ListBucket",
"s3:GetBucketLocation",
]
resources = local.bucket_arns
}
statement {
actions = [
"s3:GetObjectAcl",
"s3:GetObject",
"s3:GetObjectVersionTagging",
"s3:GetObjectVersionAcl",
"s3:GetObjectTagging",
"s3:GetObjectVersion",
"s3:DeleteObjectTagging",
"s3:PutObject",
"s3:DeleteObjectVersion",
"s3:PutObjectVersionAcl",
"s3:PutObjectVersionTagging",
"s3:PutObjectTagging",
"s3:DeleteObjectVersionTagging",
"s3:DeleteObject",
"s3:PutObjectAcl"
]
resources = local.bucket_content_arns
}
}
bucket_arns = formatlist("arn:aws:s3:::%s", var.allowed_s3_bucket_names)
bucket_content_arns = formatlist("arn:aws:s3:::%s/*", var.allowed_s3_bucket_names)
variable "allowed_s3_bucket_names" {
type = list(string)
description = "List of bucket that lambda function allowed to access"
default = []
}
terraform.tfvars
allowed_s3_bucket_names = ["yentth25-test-existing-source-bucket"]
Bạn có thể bổ sung thêm điều kiện yêu cầu người dùng buộc phải nhập giá trị cho “allowed_s3_bucket_names”, không cho phép để rỗng chẳng hạn.