2017-02-15 4 views
0

Я пытаюсь создать IAM Policy для ограничения доступа к выбранным кодам S3. Есть по умолчанию S3 Bucket ARNs, который должен быть всегда присутствует, оператор шаблона может добавить список дополнительных Bucket ARNs, чтобы предоставить доступ через Parameter.Как добавить обязательные значения для CommaDelimitedList

В моем шаблоне BucketARNsParameter, позволяет оператору указывать список ARN, который не ограничен по длине.

BucketARNs: 
    Type: CommaDelimitedList 
    Description: 'Add the ARN of S3 Buckets that the Get* and List* 
     access to. When specifying a Bucket 2 values should be supplied one for the 
     bucket and for objects within that bucket, for example: arn:aws:s3:::MyContentBucket,arn:aws:s3:::MyContentBucket/* . 
     This defaults to all buckets.' 
    Default: arn:aws:s3:::*, arn:aws:s3:::*/* 

Документ политики, который использует это Parameter выглядит

PolicyDocument: 
    Version: '2012-10-17' 
    Statement: 
    - Effect: Allow 
    Action: 
    - s3:Get* 
    - s3:List* 
    Resource: 
     !Ref BucketARNs 

я хочу сделать, это убедиться, что, например

arn:aws:s3:::MyMustHaveBucket, 
arn:aws:s3:::MyMustHaveBucket/* 

ВРНС являются всегда в списке от BucketARNs. Default в Parameter может быть удален оператором - это единственное решение, которое добавляет их как значения Default и добавляет информацию в Description, предупреждая пользователей о том, что они не удаляют необходимые АРН? Который, как это можно легко сломать.

Кто-нибудь знает способ обеспечения, чтобы у меня всегда были эти возможности? учитывая список BucketARN, указанный через Parameter, является переменной?

В идеале я хотел бы функцию список конкатенации

ответ

1

Два варианта:

  1. Вы можете использовать AllowedPattern на String Параметр вместе с значением Default для обеспечения того, чтобы предоставленное значение по умолчанию всегда включалось в поставляемый параметр, а затем используйте Fn::Split для разрешения параметра в массив при использовании в вашем Шаблон:

    Parameters: 
        BucketARNs: 
        Type: String 
        Default: arn:aws:s3:::*, arn:aws:s3:::*/* 
        AllowedPattern: arn:aws:s3:::\*, arn:aws:s3:::\*\/\*.* 
    Resources: 
        Dummy: 
        Type: AWS::CloudFormation::WaitConditionHandle 
    Outputs: 
        Result: 
        Value: !Join [',', !Split [',', !Ref BucketARNs]] 
    
  2. Вы можете использовать Fn::Split вместе с Fn::Sub и Fn::Join добавлять свои фиксированные значения для поставляемого пользователем параметра:

    Parameters: 
        BucketARNs: 
        Type: CommaDelimitedList 
    Resources: 
        Dummy: 
        Type: AWS::CloudFormation::WaitConditionHandle 
    Outputs: 
        Result: 
        Value: !Join [',', !Split [',', !Sub [ 
         "arn:aws:s3:::*,arn:aws:s3:::*/*,${Buckets}", 
         {Buckets: !Join [',', !Ref BucketARNs]} 
        ]]] 
    

Окончательный !Join в приведенных выше примерах, являются только для вывода массива в выводе стека, они не нужны при использовании параметров в действительном вводе свойств в ваш шаблон.

+0

Мне это действительно нравится. Я думаю, ваше решение также будет работать по этому вопросу: http://stackoverflow.com/questions/32082228/add-a-parameterized-list-of-security-groups-to-another-security-groups-ingress?rq = 1 – georgealton

0

Использование FN :: присоединиться к конкатенации константы с параметрами