SAMデプロイ時にPutObjectでAccess Denied
起こったエラー
Error: Unable to upload artifact app/ referenced by CodeUri parameter of ConvertLambdaFunction resource.
An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
状況
アカウントAにあるSAMで管理されたLambdaをアカウントBへコピーしたい。
※そもそもコピーはどうやってするのか、については以下のブログをご参照ください。
アカウントAのユーザ、アカウントBの(アカウントAのユーザがSwitchRoleする)Roleはそれぞれ必要な権限を持っている。PutObjectと関連しそうな、S3FullAccessも持っている。
原因
アカウントAのS3バケットにアップロードされたSAMのファイル群をアカウントBから取得しようとして、Access Deniedになった。
どういうことか
SAMの設定情報はsamconfig.tomlというファイルに書かれています。
この通り、スタック名やcapabilitiesについての設定情報をsamconfig.tomlに保存しておくことができます。
ここのS3_bucketというものが原因でした。s3_bucketパラメータはどのS3バケットにSAMファイル群をアップロードするかのパラメータです。デフォルトだと一番最初にSAMを使ったときに作られたS3バケットにアップロードされるはずです。
このバケットがアカウントAのバケットになっていました。
しかし使っているprofileはスイッチロールしているのでアカウントBのRoleです。
つまり、アカウントBの権限でアカウントAのバケットにアクセス(SAMファイル群をアップロード)しようとしていたので、PutObjectでエラーが出ていました。
対策
アカウントBのS3バケットから、SAMテンプレートがまとまっているバケットがあるので、そのバケット名をsamconfig.tomlのs3_bucketパラメータにして上げればOKです。
以上、権限足りてるはずなのにな―っと思ってたらほんとは権限が足りなかったエラーでした。
Discussion