2016-07-24 3 views
2

Я пытаюсь создать шаблон с облачным формированием, который устанавливает балансировщик нагрузки, который записывает журналы в ведро S3. Вместо того чтобы дать полный доступ к всем (например, *), я хочу, чтобы ограничить доступ к PutObject только балансировки нагрузки счета или услуги:AWS Cloud Formation Упругая балансировка нагрузки 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 предоставляет счета идентификаторы экземпляров Elb в различных регионах. Однако шаблон, который я создаю, имеет параметр зоны доступности, в котором пользователь может выбрать зону доступности для развертывания стека. Поэтому мне хотелось бы, чтобы в моей политике ведра была какая-то переменная ref, которая получает идентификатор учетной записи балансировки нагрузки на основе зоны доступности.

Я также рассмотрел примеры в official documentation, но один пример, который использует Ref, на самом деле не определяет переменную.

Как это достичь?

Редактировать: Я имел в виду зоны доступности вместо региона. Входной параметр предоставляет пользователю возможность сброса зон доступности в регионе.

ответ

4

Нет переменной, включающей идентификаторы учетных записей ELB. Это различные идентификаторы учетной записи AWS.

Чтобы включить их в вашей политике, вы должны либо:

  1. жесткий код эти идентификаторы учетных записей,
  2. использовать входные переменные в шаблоне для них, или
  3. попробуйте использовать CloudFormation «на карте ", чтобы настроить карту списка регистровых идентификаторов, затем выберите соответствующий список, используя переменную AWS::Region.
+0

Hi..thank Вас за ответ. Я имею в виду зону доступности вместо региона. Я попробовал ваше предложение, но я получаю сообщение об ошибке: 'Access Denied for bucket: xxxxxxxxxxx.development. Пожалуйста, проверьте разрешение S3bucket. – MojoJojo

+0

. Я создал выходную переменную, чтобы сбрасывать значение '{" Ref ":" AWS :: AccountId "} и получается, что он записывает значение моего идентификатора учетной записи ... учетную запись, используемую для создания stack и * not * идентификатор учетной записи, используемый для запуска ELB, как указано здесь: http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-access-logs.html#enable-access-logs-console – MojoJojo

+1

ОК. Я понимаю, что вы пытаетесь сделать. Нет никакой переменной для того, что вы хотите. Вы должны либо жестко закодировать эти идентификаторы учетных записей, либо использовать входные переменные в свой шаблон для них. –

2

Я понял. Это не очень динамично, но лучше, чем просто hardcoding 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» недействителен. Он не содержит блок «Statement». После «PolicyDocument» должен быть раздел «Statement», который выглядит следующим образом: «Statement»: [ {// policy statement //}] – CarlR