S3 オブジェクトにタグをつけようとして躓いたメモ
表題の通りで putObject するときにTaggingというオプションがあったので使ってみたら新規オブジェクト登録時にそのまま使えなかったのでメモに残すことにしました。
結論的にはかんたんなことでしたIAMの権限の不足でした。
私はSDK用のユーザーをアプリケーションごとに作成して各アプリケーションごとにバケットを作成します。ユーザーはアプリケーションのバケットに対して最小限の必要な権限を付与していくのですが、今回はファイルをS3にアップロードして必要時にダウンロード(両方WEBアプリケーションから)するために対象WEBアプリケーション用にユーザーを作成しています。
付与した権限は
GetObject
PutObject
DeleteObject
これを許可していました。
これで運用していたのですがスマートフォンから送信してきたファイルと、同じ機能でWEBアプリケーションからデータをファイルにしたときのファイルが同一にできなくて。。
バケットやプレフィックスも分けるわけには行かなかったので悩んでいると
PutObjectにTaggingというオプションがあったので
おっ!これだ
なので諦めてタグでアプリケーションからわかるようにしようと思い早速試してみる
送り方は
$option + ['Bucket' => $bucket, 'Key' => $prefix_and_objectname, 'ContentType' => $content_type, 'Body' => $resorce, 'Tagging' => $tags];
$response = $awsS3client->putObject($option);
ちなみに SDK for PHP
$tagの部分はURLに含めるクエリストリング
key1=value1&key2=value2
こんな感じ
よしこれでいいと送信してみましたがエラー
エラーの内容は
AccessDenied
権限がないときに出るエラーですがPutObject許可しているしなー
って思っていたらもしかして・・・
PutObjectTagging
この権限を付与したらできました。
IAMの権限ってPutObjectアクションを許可したらそのアクションのオプションが使えるのかと思っていたら違うんですね。
PutObjectTaggingは既存のオブジェクトにタグを付けるのに使うので違うだろと思っていたらPutObjectのタグを付けるときにもPutObjectTaggingを許可しないとできないみたい。。。
あー英語のマニュアル読めるようになりたいです。。。
以上です。
コメント
コメントを投稿