2016-07-24 51 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

相關問題