始めに
RailsアプリケーションのAction Textを使用した画像アップロード機能のテストを行なった際、
画像の削除処理がS3に反映されない現象が発生しました。
本記事は、調査に使用したコマンドと調査観点をメモしています。
インフラ構成
調査時点のインフラ構成図は下記となっています。
AppサーバーにIAMロールを付与しており、VPCエンドポイントを経由して、S3と通信を行う構成となっています。
調査内容
対象のEC2インスタンスからS3を操作することが可能か確認
下記コマンドを実行して、 AccessDenied
が表示されていることを確認しました。
# 指定のバケットから一覧を取得できるか
aws s3 ls s3://指定バケット名
# 指定のファイルの確認することができるか
aws s3 ls s3://指定バケット名/ファイル名
# 指定のファイルを削除できるか
aws s3 rm s3://指定バケット名/ファイル名
# => delete failed: s3://指定バケット名/ファイル名 An error occurred (AccessDenied) when calling the DeleteObject operation: Access Denied
RailsのコンソールからS3にアクセスが可能か確認する場合
Railsのコンソールから確認する場合は下記コマンドとなります。
# 初期化
client = Aws::S3::Client.new(region: 'ap-northeast-1' )
# => #<Aws::S3::Client>
# オブジェクトの取得
client.get_object(:bucket => '指定バケット名', :key => 'key番号').body.read
# オブジェクトの削除
client.delete_object(:bucket => 'bucket_name', :key => 'sample.txt')
ポリシーの見直し
調査の結果から、権限周りの問題と考え下記設定値を見直しました。
- EC2に追加されているIAMロール
- バケットポリシー
- VPC エンドポイントポリシー
今回の原因は VPC エンドポイントポリシー
に deleteObject
の設定がなく削除ができなかったようです。
設定追加してあげて無事画像ファイルを削除することができました。
参考URL