terraform - 如何在 Terraform 存储桶策略中使用存储桶作为变量?
问题描述
我想创建一个 S3 存储桶列表并将对它们的访问限制为一个用户。该用户应该只能访问该存储桶,并且无权在 AWS 中执行其他操作。
我这样创建了我的列表(在此示例中存储桶名称不是真实的):
// List bucket names as a variable
variable "s3_bucket_name" {
type = "list"
default = [
"myfirstbucket",
"mysecondbucket",
...
]
}
然后我创建一个用户。
// Create a user
resource "aws_iam_user" "aws_aim_users" {
count = "${length(var.s3_bucket_name)}"
name = "${var.s3_bucket_name[count.index]}"
path = "/"
}
然后我创建一个访问密钥。
// Create an access key
resource "aws_iam_access_key" "aws_iam_access_keys" {
count = "${length(var.s3_bucket_name)}"
user = "${var.s3_bucket_name[count.index]}"
// user = "${aws_iam_user.aws_aim_user.name}"
}
现在我创建一个用户策略 // 添加用户策略
resource "aws_iam_user_policy" "aws_iam_user_policies" {
// user = "${aws_iam_user.aws_aim_user.name}"
count = "${length(var.s3_bucket_name)}"
name = "${var.s3_bucket_name[count.index]}"
user = "${var.s3_bucket_name[count.index]}"
policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:GetLifecycleConfiguration",
...
],
"Resource": "${var.s3_bucket_name[count.index].arn}}"
}
]
}
EOF
}
现在,我创建了附加用户的存储桶。
resource "aws_s3_bucket" "aws_s3_buckets" {
count = "${length(var.s3_bucket_name)}"
bucket = "${var.s3_bucket_name[count.index]}"
acl = "private"
policy = <<POLICY
{
"Id": "Policy1574607242703",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1574607238413",
"Action": [
"s3:PutObject"
],
"Effect": "Allow",
"Resource": {
"${var.s3_bucket_name[count.index].arn}}"
"${var.s3_bucket_name[count.index].arn}/*}"
},
"Principal": {
"AWS": "${var.s3_bucket_name[count.index]}"
}
}
]
}
POLICY
tags = {
Name = "${var.s3_bucket_name[count.index]}"
Environment = "live"
}
}
我遇到的问题是它不喜欢我通过使用我的变量在策略中设置 ARN 的位置。
我也相信我需要使用 user.arn 而不是存储桶,尽管它们应该具有相同的名称。我在这里做错了什么?
解决方案
我想我看到了一些可以帮助你的东西。
存储桶策略资源选项不会使用存储桶的 arn,它们正在寻找实际的存储桶名称,因此它看起来像这样“arn:aws:s3:::my-bucket”。
我还在您的设置中看到了一些额外的 },这也可能导致问题。
并且,,, terraform 版本是 0.12,它消除了对 {$"resource.thing"} 的需要,而是用 resource.thing 替换它。他们有一个有用的terraform 0.12upgrade
命令来运行升级文件,这很好。在 terrafor 0.12 中,他们调整了像您一样创建资源的方式。https://www.hashicorp.com/blog/hashicorp-terraform-0-12-preview-for-and-for-each/
推荐阅读
- python - ValueError:无法将字符串转换为浮点数 - 在 google colab 中
- python - 如何在网页中输入
- r - 将汇总数据帧从长转换为宽(不使用 reshape、reshape2、tydr)
- reactjs - React componentWillUpdate 每秒运行一次并且条件不起作用
- firebase - 来自火力基地的警告
- gremlin - 如何使用 gremlin 计算 Jaccard 相似度
- intellij-idea - IntelliJ 没有强制执行右边距
- android - Android共享内存和内存映射
- javascript - 为什么我的数组没有删除正确的记录
- mongodb - docker-compose:运行命令而不覆盖任何内容