Posted at

CloudFormation"Value of property SourceArn must be of type String"の解決方法

AWS LambdaFunctionPermissionの設定で、以下のようなエラーが発生した。

Value of property SourceArn must be of type String

このとき、原因となった部分は以下の通り。


problem.yml

  LambdaPermission:

Type: AWS::Lambda::Permission
Properties:
FunctionName:
!GetAtt MyLambda.Arn
Action: lambda:InvokeFunction
Principal: s3.amazonaws.com
SourceArn:
- !Join
- ''
- - 'arn:aws:s3:::'
- !Sub ${BucketPrefix}


原因と対策

- !Joinは、!Join以下がリスト型であることを示している。つまり、このymlは以下のように認識されている。


SourceArn.json

{

....,
"Properties":{
"SourceArn":['arn:aws:s3:::{BucketPrefix}']
},
....
}


しかし、この項目に入力すべきはStringであり、Listではない。これがエラーの原因だったようだ。

したがって、以下のように直した。


fixed.yml

  DataDeliverAndConvertPermission:

Type: AWS::Lambda::Permission
Properties:
FunctionName:
!GetAtt MyLambda.Arn
Action: lambda:InvokeFunction
Principal: s3.amazonaws.com
SourceArn:
!Join
- ''
- - 'arn:aws:s3:::'
- !Sub ${BucketPrefix}

これで通った。


参考

YAML 基本記法まとめ