Terraform - 无法在字符串模板中包含给定值:需要字符串

Terraform - Cannot include the given value in a string template: string required

我正在尝试按照 this page 使用 terraform 在 SageMaker 上创建模型 由于权限限制,我无法为 sagemaker 角色分配完整的访问策略,因此我创建了一个角色并附加了一个具有部分权限的策略

当我测试 Terraform plan 时,它给了我这个:

Error: Invalid template interpolation value
...
..........................
 141:                 "ecr:GetRepositoryPolicy"
 142:             ],
 143:             "Resource": [
 144:                 "arn:aws:s3:::${aws_s3_bucket.xx_xxxxxxxxxx_xxx_bucket}",
 145:                 "arn:aws:s3:::${local.binaries_bucket_name}",
 146:                 "arn:aws:s3:::${aws_s3_bucket.xx_xxxxxxxxxx_xxx_bucket}/*",
 147:                 "arn:aws:s3:::${local.binaries_bucket_name}/*",
 148:                 "arn:aws:ecr:us-east-1:*:repository/*",
 149.....................
 157:         }
 158:     ]
 159: }
 160: POLICY
    |----------------
    | aws_s3_bucket.xx_xxxxxxxxxx_xxx_bucket is object with 25 attributes

Cannot include the given value in a string template: string required.

我是新手,只是想知道这是在抱怨存储桶名称太长还是其他原因?我应该怎么做才能解决这个问题,我有点困惑。非常感谢。

(PS: Terraform 版本 v0.13.4 + 提供商 registry.terraform.io/hashicorp/aws v3.20.0)

我认为您需要正确创建自定义策略,然后 link 将其添加到存储桶中,您可以在此处查看一些示例: https://registry.terraform.io/modules/JousP/s3-bucket-policy/aws/latest/examples/custom-policy

看来你要的是S3 bucket的ARN,由exported resource attributes提供。具体来说,您可能需要 arn 资源属性。

更新您的政策,例如:

 144:             "${aws_s3_bucket.xx_xxxxxxxxxx_xxx_bucket.arn}",
 146:             "${aws_s3_bucket.xx_xxxxxxxxxx_xxx_bucket.arn}/*",

将通过访问 arn 属性为您提供所需的字符串。当前编写的策略正在访问 aws_s3_bucket.xx_xxxxxxxxxx_xxx_bucket,它是该资源的每个参数和属性的映射(可能是对象),并且不会在您的策略字符串中插入。