AWS Cloudformation Elastic Load Balancing 账户 ID

Posted

技术标签:

【中文标题】AWS Cloudformation Elastic Load Balancing 账户 ID【英文标题】:AWS Cloud Formation Elastic Load Balancing Account ID 【发布时间】:2016-11-28 04:05:44 【问题描述】:

我正在尝试使用云形成创建一个模板,该模板设置一个将日志写入 S3 存储桶的负载均衡器。我不想让每个人都拥有完全访问权限(例如 *),而是想限制 PutObject 仅访问负载均衡器帐户或服务:


  "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 提供各个地区 ELB 实例的账户 ID。但是,我正在创建的模板有一个可用区参数,用户可以在其中选择一个可用区来部署堆栈。所以我最理想的做法是在我的存储桶策略中使用某种ref 变量,该变量根据可用区获取负载均衡器的帐户ID。

我还查看了official documentation 中的示例,但使用Ref 的示例并没有真正定义变量。

我如何做到这一点?

编辑:我指的是可用区而不是区域。输入参数为用户提供区域中可用区域的下拉列表。

【问题讨论】:

【参考方案1】:

我想通了。它不是真正的动态,但比直接硬编码 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"
        
      
    
  

【讨论】:

docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html 感谢您提出此解决方案。但是,列出的“PolicyDocument”部分无效。它不包含“语句”块。在“PolicyDocument”之后应该有一个“Statement”部分,如下所示: “Statement” : [ //policy statement// ] 如果这可以帮助我创建此要点的人:gist.github.com/Yanal-Yves/ed6244326f521fb5d7e051447275da41,其中包含当前 25 个可用区域的所有 ELB 帐户 ID。【参考方案2】:

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

要将它们包含在您的政策中,您必须:

    对这些帐户 ID 进行硬编码, 在模板中为它们使用输入变量,或者 尝试使用 CloudFormation“映射”来设置区域到帐户 ID 列表的映射,然后使用 AWS::Region 变量选择适当的列表。

【讨论】:

嗨..谢谢您的回复。我的意思是可用区而不是区域。我尝试了您的建议,但出现错误:Access Denied for bucket: xxxxxxxxxxx.development. Please check S3bucket permission 我创建了一个输出变量来转储 `"Ref":"AWS::AccountId" 的值,结果它写入了我的帐户 ID 的值..创建堆栈并且不是用于运行 ELB 的帐户 ID,如下所示:docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/… 好的。我明白你想做什么。你想要的没有变量。您必须对这些帐户 ID 进行硬编码,或者在模板中为它们使用输入变量。

以上是关于AWS Cloudformation Elastic Load Balancing 账户 ID的主要内容,如果未能解决你的问题,请参考以下文章

将现有 AWS 资源整合到 CloudFormation 堆栈中

AWS Cloudformation的相关概念

CloudFormation - 将标签应用于其他 AWS 资源

AWS CloudFormation:Cognito LambdaTrigger CustomEmailSender - 属性“AWS CloudFormation 目前不支持。”和 CDK 的使用

AWS学习笔记--利用CloudFormation管理AWS资源

AWS — AWS CloudFormation