В моем шаблоне 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]
Это не работает и приводит к ошибке:
Invalid bucket policy syntax. (Service: Amazon S3; Status Code: 400; Error Code: MalformedPolicy;
Кто-нибудь знает, как я могу это сделать или почему это не удается?
ps Параметр EnvType действительно существует:
Parameters:
EnvType:
Description: Environment Name
Default: test
Type: String
AllowedValues: [dev, test, prod]





Согласно этой статье синтаксис должен иметь Service. https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html
JSON:
"Principal": {
"Service": [
"elasticmapreduce.amazonaws.com",
"datapipeline.amazonaws.com"
]
Однако, следуя некоторой другой документации, я разработал ее AWS not Service:
JSON:
"Principal": {
"AWS": [
"elasticmapreduce.amazonaws.com",
"datapipeline.amazonaws.com"
]
Решение в YAML:
Principal:
AWS:
!FindInMap [EnvironmentToIAMInstanceProfileARN, !Ref 'EnvType', Profile]