サラリーマンエンジニアブログ

大企業で働くなんちゃってITエンジニアのブログです。

クロスアカウントにおけるs3へのオブジェクトの書き込み方のベストプラクティス

cross

クロスアカウントにおけるs3へのオブジェクトの書き込み方のベストプラクティスをお教えしたいと思います。Netflixもこのやり方です。

特にアカウントを3つ以上している場合は参考になるかと思います。

下記のようにAccount1からAccount2 s3にPut Objectをし、Account3からGet Objectをしたい場合みなさんどうします?

 

f:id:yarite_parker:20190102001248p:plain

やりたいこと

Account1からAccount2 s3にオブジェクトを書き込んで、Account3からget Objectする。

前提条件

  • Account2のバケットポリシーは適切に設定されている。

ベストプラクティス

まずはベストプラクティスを書きたいと思います。

ベストプラクティスはAccount1からAssume roleでAccount2のロールに一時的に切り替えてAccount2のロールでAccount2のs3に書き込む。

これがベストプラクティスです。

 

なぜこれがベストプラクティスなのかと言うのは下記に記載します。

ベストプラクティスではないやり方

 

まず私が最初にやろうとしたことは、Account1から --acl bucket-owner-full-control と言うオプションをつけてAccount2のs3書き込みました。

「--acl bucket-owner-full-control」はオブジェクトにフルコントロール権限をつけて書き込むオプションです。

Account2のs3バケットポリシーもちゃんと設定しているので、これでいけるだろうと思い、Account3からAccount2のs3オブジェクトに対してGet Objectした結果、エラーが生じてしまいました。

2つのアカウントだけのやりとり場合は、s3書き込み時に「--acl bucket-owner-full-control」のオプションを追加すれば問題は起こらないのですが、なぜ3つ以上のアカウントではエラーが生じてしまうかと言うと...。

  1. バケットポリシーでAccount3のアクセスを許可してもオブジェクトのowner(Account1)とバケットのowner(Account2)が一致しないためバケットポリシーは適用されない。
  2. --acl bucket-owner-full-controlはAccount 2に対してのフルコントロール権限なのでAccount3には適用されない。

この二つの理由でエラーが生じました。

 

オブジェクトの権限をAccount3にすればいいのではないか?と最初は考えました。技術的には可能です。

しかし、下記のようにアカウントがもっと増えた場合、いちいちオブジェクト一個一個のオーナーを変える必要があります。それはめんどくさいですよね。

f:id:yarite_parker:20190102005951p:plain

 

従って、「バケットのオーナーとオブジェクトのオーナーを揃えることによってバケットポリシーで権限を管理しましょう」と言うのがベストプラクティスです。

そのため、Account1からAssume roleでAccount2のロールを使用し、Account2のs3に書き込むことでバケットポリシーを適用させるって言うのが権限の管理も簡単で、ベストプラクティスと言うことです。  

まとめ

複数のアカウントを使用している場合は、Assume roleでs3 Bucket Ownerのアカウントのロールに切り替えてオブジェクトを書き込み、Bucket OwerとObject Ownerを揃えバケットポリシーで権限を管理しよう。

参考文献

qiita.com