S3初心者向け『例 2 : バケット所有者がクロスアカウントのバケットのアクセス許可を付与』をやってみた
概要
大阪オフィスのちゃだいんです。
手を動かして学ぶために、公式ドキュメントのチュートリアルをやってみました。
今回も、Amazon S3です。前回の続編で、内容は以下のものです。
例 2: バケット所有者がクロスアカウントのバケットのアクセス許可を付与 - Amazon Simple Storage Service
ある AWS アカウント (たとえば、アカウント A) で、バケットやオブジェクトなど、そのリソースにアクセスするためのアクセス許可を、別の AWS アカウント (アカウント B) に付与できます。アカウント B では、そのアカウントのユーザーに、付与されたアクセス許可を委任できます。この例のシナリオでは、バケット所有者が、特定のバケットオペレーションを実行するためのクロスアカウントアクセス許可を別のアカウントに付与します。
前提条件
AWS CLIが使用できる環境で行ってます。
また、2つのアカウントはドキュメントと同様に以下のように記載します。
AWSアカウントID | アカウントの呼び方 | アカウントの管理者ユーザー |
---|---|---|
1111-1111-1111 | アカウント A | AccountAadmin |
2222-2222-2222 | アカウント B | AccountBadmin |
早速やってみた
1. S3バケットを作成する
- まずは、
AccountA
側にS3バケットを作成します。 -
バケット名を
190827testbucket
として、作成しました。
2. バケットポリシーを付与する
- 作成したバケットにポリシーを付与します。
-
明示的に
AccountB
からのアクセスを許可するポリシーを記載します。 -
ポリシーの内容はこちら。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Example permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::222222222222:root" }, "Action": [ "s3:GetBucketLocation", "s3:ListBucket" ], "Resource": "arn:aws:s3:::190827testbucket" } ] }
- 実際にS3のコンソールにて下記にように挿入します。
3.AccountBのユーザーを作成する
- ドキュメントの流れとは少し違いますが、ここで
AccountA
のバケットにアクセスする、AccountB
のTestAdminB
とTestUserB
を作成します。 -
AccountB
のroot権限にてIDとパスワードを使って、マネジメントコンソールにログインします。 -
IAMコンソールを開き、
TestAdminB
ユーザーを作成します。
- ユーザーを作成後、アクセスキーとシークレットアクセスキーをダウンロードします。(下図の例は
TestUserB
で行ってます)
- これで、
TestAdminB
が作成できました。 -
同様の手順で
TestUserB
も作成します。
4. IAMユーザーにポリシーを付与する
-
まずは
TestAdminB
にadmin
権限を付与します。 -
これはデフォルトで存在するものを使用します。
AdministratorAccess
をTestAdminB
にアタッチしました。
- 次に、
TestUserB
にドキュメントに記載のポリシーを付与します。 -
インラインポリシーはIAMユーザーの画面から作成することができます。
- ポリシーの内容はこんな感じです。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Example", "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::190827testbucket" ] } ] }
- コンソールに入れるとこんな感じです。
- インラインポリシーですが、一応名前をつけます。
- これで準備はできました。
5.テスト
- まずは、
AccountB
のTestAdminB
がAccountA
のバケットにアクセスできるか試してみます。 -
先ほどダウンロードしたアクセスキーとシークレットアクセスキーを、
~/.aws/credentials
に書き込んでおきます。
[AccountBadmin] aws_access_key_id = access-key-ID aws_secret_access_key = secret-access-key [AccountBuser] aws_access_key_id = access-key-ID aws_secret_access_key = secret-access-key
- では、実際にlsコマンドを実行すると、ちゃんとバケットの中身が見れました。
$ aws s3 ls s3://190827testbucket --profile accountBadmin 2019-08-27 21:00:04 1817289 SpiceCurry.jpg
- (記事には書いてませんがバケットにSpiceCurrry.jpgという画像をアップロードしてました。)
-
さて、
TestAdminB
がいけたのはよしとして、TestUserB
はどうでしょう? -
先ほどのコマンドのprofileオプションを変えます。
$ aws s3 ls s3://190827testbucket --profile accountBuser 2019-08-27 21:00:04 1817289 SpiceCurry.jpg
- ちゃんと
TestUserB
でもいけましたね。 -
ちなみにじゃあ
TestUserB
のインラインポリシーを削除するとどうなるでしょうか? -
ひと思いにポリシーを削除します。
- もう一度さっきと同じコマンドを実行します。
$ aws s3 ls s3://190827testbucket --profile accountBuser An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
- ちゃんと拒否されましたね。よって
TestUserB
については、インラインポリシーにて許可されていることがわかりました。
感想
この記事を見てるだけだとピンとこないかもですが、ちゃんと異なるAWSアカウントからアクセスできたというのは、個人的には「おおっ」ってなりました。
両者のポリシーの設定だけで、簡単にクロスアカウントのアクセスを実現することができました。
誰かのお役に立てば幸いです。それではまた、大阪オフィスのちゃだいんでした。