带资源的 AWS Cloudformation IAM 策略

AWS Cloudformation IAM Policy with Resource

我想做的是创建一个仅允许访问特定 S3 存储桶的 IAM 策略,我想将该 S3 存储桶作为参数传递。

根据 AWS 的文档,这是 IAM 策略 CloudFormation 模板的样子:

"RolePolicies": {
     "Type": "AWS::IAM::Policy",
     "Properties": {
        "PolicyName": "root",
        "PolicyDocument": {
           "Version" : "2012-10-17",
           "Statement": [ {
              "Effect": "Allow",
              "Action": "*",
              "Resource": "*"
           } ]
        },

问题是,如何让"Resource"成为参数?该参数应该是 S3 存储桶的 arn(例如 arn:aws:s3:::s3-bucket-name)。我会简单地输入一个字符串类型参数并输入整个 arn 还是类似于 AWS::S3::Bucket 类型?无论哪种方式,我都不确定在 "Resource".

之后输入什么

谢谢!

您可以使用Ref with Fn::Join or Fn::Sub

例如:

"Parameters" : {
    "BucketName" : {
        "Type" : "String",
        "Description" : "S3 Bucket name."
    }
}

使用 RefFn::Join

    ...
        "Resource": { "Fn::Join" : [ "", [ "arn:aws:s3:::", { "Ref" : "BucketName"} ] ] }
    ...

使用 Fn::Sub:

    ...
        "Resource": { "Fn::Sub": [ "arn:aws:s3:::${BucketName}" ] }
    ...

有关模板参数的详细信息here

聚会有点晚了。

如果您的存储桶在资源中声明,如下所示:

...
Resources:
  MyBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: my-bucket-name
...

...然后您可以使用 Fn::GetAtt:

轻松引用它的 ARN
Resource:
  Fn::GetAtt: [ MyBucket, "Arn" ]