クロスアカウントで共有されたS3バケットはAWSコンソール上から参照可能なのか

クロスアカウントで共有されたS3バケットはAWSコンソール上から参照可能なのか
目次

AWS S3はバケットポリシーを設定することで、クロスアカウントでのバケット共有ができます。 設定により、複数のアカウントからバケットに対して操作を行うことができるため、大変便利な機能です。 しかし、バケットのオーナーアカウントではAWSコンソール上でバケットを確認できるのですが、 共有された側ではS3バケットのコンソールにバケットが表示されません。 今回はなんとかして閲覧する方法はないものかと試行錯誤してみました。

やりたいこと

S3をファイルストレージサービス的にファイル共有に使いたい

今回やろうとしていたことを簡単に説明します。 以下の図にまとめました。

share_bucket

既に本番環境で稼働しているサービスがあり(アカウントA)、 アカウントA内にあるS3バケットにストアしているデータを他部門に提供する必要が出てきました。

でもバケットのあるAWSアカウントにログインさせたくない

普通に考えれば、アカウントAで他部門向けのIAM GroupとIAM Userを作成する、というのが簡易な解になるのですが、少し事情があります。 アカウントA自体が社内のセキュリティレベルが高めに規定されているため、他部門のIAM UserをアカウントAの中に作るのが難しいのです。 そのため、 他部門向けの 別のAWSアカウントBを作成し、アカウントBに対して対象のバケットのみを共有するようにすれば要求が充足されるのではないか、という話になり、その方法を中心に検討をすることになりました。

課題

ユーザはブラウザしか使えない

今回のケースでは他部門の人間がエンジニアではないため、ブラウザでのファイルダウンロードしかできない という制約がありました。 AWS CLIのインストールも嫌がられてしまったため、 「AWSのS3コンソールからファイルを見せる」 必要がありました。

コンソール上のバケットリストはバケットのオーナーアカウント側でしか見れない

アカウントAで soudegesu-bucket-foo というS3バケットを作成し、以下のようにバケットポリシーを作成することで アカウントBにバケット共有の設定をしました。

 1{
 2    "Version": "2012-10-17",
 3    "Statement": [
 4        {
 5            "Sid": "GetObject",
 6            "Action": [
 7                "s3:GetObject"
 8            ],
 9            "Effect": "Allow",
10            "Resource": "arn:aws:s3:::soudegesu-bucket-foo/*",
11            "Principal": {
12                "AWS": [
13                    "アカウントBのAWSアカウントID"
14                ]
15            }
16        },
17        {
18            "Sid": "ListBucket",
19            "Action": [
20                "s3:ListBucket"
21            ],
22            "Effect": "Allow",
23            "Resource": "arn:aws:s3:::soudegesu-bucket-foo",
24            "Principal": {
25                "AWS": [
26                    "アカウントBのAWSアカウントID"
27                ]
28            }
29        }
30    ]
31}

アカウントAのS3コンソールからは共有対象のバケットを確認できるのですが、

account_a_bucket_list

アカウントBでのS3コンソールから共有されたバケットを確認できないのです。

account_b_bucket_list

実は S3のバケットリストはバケットを作成したオーナー側にしか表示されない というAWSのS3の仕様があります。 これは AWS CLIでも同様で、 aws s3 ls コマンドを実行しても、自分のアカウントで作成されたバケットの一覧しか取得できません。

なんてこったい。

解決策

案1 バケットのURLを直接叩かせる[非公式]

一瞬「やばい」と思いましたが、どうにかなりそうな方法が見つかりました。 それは 共有バケットのURLを直接ブラウザに入力する という方法です。

AWSコンソール上のS3のURLのルールは以下のようになっていて、 AWSコンソールにログインしたセッション上で直叩きするとブラウザ上で表示することができます。

1https://s3.console.aws.amazon.com/s3/buckets/{バケット名}/

今回の例で言えば、AWSアカウントBにログインした状態で下のURLを直叩きします。

1https://s3.console.aws.amazon.com/s3/buckets/soudegesu-bucket-foo/

find_bucket

見えました。やったぜ。

ただし、この方法は現時点(2018年4月現在)でのS3コンソールの仕様ということらしく、公式でサポートされている仕様ではありません。 一応AWSのサポートにも聞いてみましたが、結果的に見えているけど、今後変わるかもしれない、ということでした。

案2 Switch Roleを使う[正攻法]

結局、マルチアカウント間でコンソール上でいい感じに見せたい場合の正攻法はSwitch Roleになりそうです。 Switch Roleを使ったアカウントの切り替えは記事にされている方がいっぱいいらっしゃるのでそちらを参考にいただいた方が良いです。

参考までにいくつかリンクを貼っておきます。

まとめ

「クロスアカウントで共有されたS3バケットはAWSコンソール上から閲覧可能なのか」 というタイトルで今回書きましたが、 結論を言うと

可能

しかし、以下の条件を知っておく必要がありそうです。

  • 共有されたバケットがS3コンソールのバケット一覧で参照可能なのはバケットのオーナーアカウントのみ
  • バケットのURLを直接入力することで、共有先のアカウントでもブラウザ上で確認ができる
  • ただし、URL直接入力の方法は公式サポートされていないので、真面目にやるならSwitch Roleで対応する

今回はURLを直接入力する方法で大丈夫そうだったので、よかったよかった。