👏

SAMデプロイ時にPutObjectでAccess Denied

2021/12/14に公開

起こったエラー

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へコピーしたい。
※そもそもコピーはどうやってするのか、については以下のブログをご参照ください。
https://zenn.dev/fffukken/articles/c0a2a9e35f0a50

アカウント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