2016-07-24 97 views
2

我正在尝试创建一个模板,其中包含设置将日志写入S3存储桶的负载平衡器的云阵列。而不是给全面进入每个人(例如*),我想限制PutObject只能访问负载平衡器帐户或服务:各地区ELB实例AWS Cloud Formation Elastic Load Balancing帐户ID

{ 
    "Resources": { 
    "LoggingBucketPolicy": { 
     "Type": "AWS::S3::BucketPolicy", 
     "Properties": { 
     "Bucket": { 
      "Ref": "LoggingBucket" 
     }, 
     "PolicyDocument": { 
      "Action": [ 
      "s3:PutObject" 
      ], 
      "Effect": "Allow", 
      "Resource": { 
      "Fn::Join": [ 
       "", 
       [ 
       "arn:aws:s3:::", 
       { 
        "Ref": "LoggingBucket" 
       }, 
       "/*" 
       ] 
      ] 
      }, 
      "Principal": { 
      "Ref": "ElasticLoadBalancingAccountID" //How do I set this dynamically? 
      } 
     } 
     } 
    } 
    } 
} 

documentation提供帐户ID的。但是,我创建的模板具有可用区参数,用户可以在其中选择可用区来部署堆栈。所以我最想做的是在我的存储桶策略中使用某种ref变量,该变量根据可用区域获取负载均衡器的帐户ID。

我也看过official documentation中的例子,但使用Ref的一个例子并没有真正定义变量。

我该如何做到这一点?

编辑:我的意思是可用性区域而不是区域。输入参数为用户提供区域中可用区域的下拉菜单。

回答

4

没有包含ELB帐户ID的变量。这些是AWS的各种帐户标识符。

将它们包含在你的政策,你必须要么:

  1. 硬编码的帐户ID,
  2. 使用的输入变量到您的模板对他们来说,或
  3. 尝试使用CloudFormation“地图“来设置地区到账户ID列表的地图,然后使用AWS::Region变量选择适当的列表。
+0

Hi..thank大家的响应。我的意思是可用区而不是区域。我尝试了你的建议,但是我得到一个错误:'拒绝存取桶:xxxxxxxxxxx.development。请检查S3bucket权限' – MojoJojo

+0

我创建了一个输出变量来转储'{“Ref”:“AWS :: AccountId”}的值,并证明它写入了我的账户id的值。用于创建堆栈和* not *用于运行ELB的帐户ID,如以下标识所示:http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-access-logs.html#enable-access-logs-console – MojoJojo

+1

好的。我明白你想要做什么。没有可变因素。您必须硬编码这些帐户ID,或者将输入变量用于您的模板。 –

2

我想通了。它不是真正的动态,但比直接硬编码id更好。按照this Amazon re-invent presentation,正确的方法是先定义一个映射:

{ 
    "Mappings": { 
    "RegionalConfigs": { 
     "us-east-1": { 
     "AMI": "", 
     "ELBAccountId": "127311923021", 
     "ArnPrefix": "arn:aws:" 
     }, 
     "us-west-1": { 
     "AMI": "", 
     "ELBAccountId": "027434742980", 
     "ArnPrefix": "arn:aws:" 
     }, 
     "us-west-2": { 
     "AMI": "", 
     "ELBAccountId": "797873946194", 
     "ArnPrefix": "arn:aws:" 
     } 
    } 
    } 
} 

,然后在策略中使用它:

{ 
    "Resources": { 
    "LoggingBucketPolicy": { 
     "Type": "AWS::S3::BucketPolicy", 
     "Properties": { 
     "PolicyDocument": { 
      "Version": "", 
      "Resource": { 
      "Fn::Join": [ 
       "", 
       [ 
       { 
        "Fn::FindInMap": [ 
        "RegionalConfigs", 
        { 
         "Ref": "AWS::Region" 
        }, 
        "ArnPrefix" 
        ] 
       }, 
       "s3:::", 
       { 
        "Ref": "LoggingBucket" 
       }, 
       "/", 
       "Logs", 
       "/AWSLogs/", 
       { 
        "Ref": "AWS::AccountId" 
       }, 
       "/*" 
       ] 
      ] 
      }, 
      "Principal": { 
      "AWS": { 
       "Fn::FindInMap": [ 
       "RegionalConfigs", 
       { 
        "Ref": "AWS::Region" 
       }, 
       "ELBAccountId" 
       ] 
      } 
      }, 
      "Action": [ 
      "s3:PutObject" 
      ] 
     }, 
     "Bucket": { 
      "Ref": "LoggingBucket" 
     } 
     } 
    } 
    } 
} 
+0

http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html感谢您提供此解决方案。但是列出的“PolicyDocument”部分无效。它不包含“语句”块。在“PolicyDocument”之后,应该有一个如下所示的“Statement”部分:“Statement”:[ {// policy policy //}] – CarlR

相关问题