如何在 AWS IAM 策略中引用 StringOutput

How do I reference a StringOutput in an AWS IAM policy

我一直在寻找如何做到这一点。我不认为我有正确的术语。将 Pulumi 与 Golang 结合使用,如何在字符串中引用某些资源的 ID。

例如,我创建了一个存储桶,然后我想在 IAM 策略中引用该存储桶的 ID。这似乎是不可能的。

bucket, err := s3.NewBucket(
    ctx,
    photosBucketName,
    &s3.BucketArgs{})

tmpJSON, err := json.Marshal(map[string]interface{}{
    "Version": "2012-10-17",
    "Statement": []map[string]interface{}{
        {
            "Effect":    "Allow",
            "Principal": "*",
            "Action":    []string{"s3:GetObject"},
            "Resource":  []string{fmt.Sprintf("arn:aws:s3:::%s/*", bucket.ID())},
        },
    },
})

输出为:

Sprintf format %s has arg bucket.ID() of wrong type github.com/pulumi/pulumi/sdk/v2/go/pulumi.IDOutput

由于存储桶名称上生成的后缀,使用 photosBucketName 会导致文档格式错误。

感谢时间和帮助。

Pulumi 资源 return 输出,这些值是 Pulumi 不知道的值,直到上游云提供商 API(在本例中为 AWS S3 API)直到资源已创建。

这意味着,如果您想以标准 Go 字符串的形式访问原始输出值,则需要以某种方式告诉 Pulumi 引擎等待该资源创建完毕。您可以使用 Pulumi 的 apply

因此,在您的特定示例中,我们希望为我们的 IAM 策略构建一个 JSON 字符串(IAM 策略仅采用字符串,它们不能采用其他 Pulumi 输出)。

bucket, err := s3.NewBucket(
    ctx,
    photosBucketName,
    &s3.BucketArgs{})

// notice how we're using the apply function to wrap the building of the JSON string
bucketPolicy := bucket.Arn.ApplyT(func (arn string) (string, error) {
    policyJSON, err := json.Marshal(map[string]interface{}{
        "Version": "2012-10-17",
        "Statement": []map[string]interface{}{
            {
                "Effect": "Allow",
                "Principal": "*",
                "Action": []string{"s3:GetObject"},
                "Resource": []string{
                    arn, // I can now pass the arn directy
                },
            },
        },
    })
    if err != nil {
        return "", err
    }
  return string(policyJSON), nil
})