1

Cloud Formation テンプレートには、さまざまな環境用の IAM マッピングがあります。

Mappings:
  EnvironmentToIAMInstanceProfileARN:
    dev:
      Profile: [ "arn:aws:iam::0000000000:role/AnInstanceProfile" ]
    test:
      Profile: [ "arn:aws:iam::0000000001:role/AppServerInstanceProfile", 
                  "arn:aws:iam::0000000001:role/AppProvisioningRole"]

S3 バケットを作成しており、プリンシパルに IAM プロファイルを提供する必要があります。

 AppS3BucketPolicy:
    Type: 'AWS::S3::BucketPolicy'
    Properties:
      Bucket: !Ref S3NameParam
      PolicyDocument:
        Statement:
          - Sid: 'Restrict access to the IAM Instance ARN'
            Effect: Allow
            Principal: '*' # !FindInMap [EnvironmentToIAMInstanceProfileARN, !Ref 'EnvType', Profile]
            Action: 
              - 's3:GetBucketAcl'
              - 's3:GetBucketLocation'
              - 's3:GetObject'
              - 's3:ListBucket'
              - 's3:PutObject'
            Resource:
              - !Join 
                - ''
                - - 'arn:aws:s3:::'
                  - !Ref S3NameParam
                  - ''
              - !Join 
                - ''
                - - 'arn:aws:s3:::'
                  - !Ref S3NameParam
                  - /*

'*'を Prinicpalに割り当てる と動作しますが、マッピングを調べようとしています:

Principal: !FindInMap [EnvironmentToIAMInstanceProfileARN, !Ref 'EnvType', Profile]

これは機能せず、エラーが発生します。

バケット ポリシーの構文が無効です。(サービス: Amazon S3; ステータス コード: 400; エラー コード: MalformedPolicy;

これを行う方法、または失敗する理由を誰かが知っていますか?

ps EnvType パラメータは存在します。

Parameters:
  EnvType:
    Description: Environment Name
    Default: test
    Type: String
    AllowedValues:  [dev, test, prod]
4

1 に答える 1

1

この記事によると、構文には Service が必要です。 https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html

JSON:

 "Principal": {
        "Service": [
          "elasticmapreduce.amazonaws.com",
          "datapipeline.amazonaws.com"
        ]

ただし、他のドキュメントに従って、サービスではなく AWS を解決しました。

JSON:

  "Principal": {
        "AWS": [
          "elasticmapreduce.amazonaws.com",
          "datapipeline.amazonaws.com"
        ]

YAML での解決策:

  Principal:
     AWS: 
       !FindInMap [EnvironmentToIAMInstanceProfileARN, !Ref 'EnvType', Profile]
于 2018-07-19T01:10:07.077 に答える