お久しぶりです。株式会社協栄情報システム3部所属の寺尾です。

今回は自身の勉強のためにS3をクロスアカウントでアクセスしてみたのでその過程を記事にしようと思います。

今回は

S3バケットとEC2を作成し、クロスアカウントでアクセス
1.アカウントA:S3バケット作成
2.アカウントB:EC2を作成
3.アカウントB:作成されたEC2でS3にアクセス→アクセス失敗

IAMロール、バケットポリシーの設定をしてクロスアカウントでアクセス
4.アカウントB:IAMロールを作成
5.アカウントB:EC2にIAMロールを割り当て
6.アカウントA:Bucketポリシーを作成しIAMロールにアクセスを許可
7.アカウントB:作成されたEC2でS3にアクセス→アクセス失敗

IAMロールにも許可を明示して、クロスアカウントでアクセス
8.アカウントB:IAMロールでアクセスを許可
9.アカウントB:作成されたEC2でS3にアクセス→アクセス成功

といった形でやっていきます。

S3バケットとEC2を作成し、クロスアカウントでアクセス

1.アカウントA:S3バケット作成

1.まずはS3バケットをアカウントAで作成していきます。
サービスからS3に入ってバケットを作成しましょう。

2.クロスアカウントでのアクセスはパブリックアクセスに含まれませんのでパブリックアクセスはすべてブロックしたままで大丈夫です。

3.作成に成功しました。

4.最後に確認するときのために適当なファイルをアップロードしておきます。

2.アカウントB:EC2を作成

1.Amazon Linux2でEC2を作成しましょう。
作成過程は省略しますが、Amazon Linux2をえらべば他はすべてデフォルト値で作成したもので大丈夫です。

3.アカウントB:作成されたEC2でS3にアクセス→アクセス失敗

2.出来たらパブリックIPを確認してアクセスします。

3.Teratermを使います。
ホスト名に先ほどのIPを入力し、OKを押して進んでいきます。

4.ユーザー名にec2-user、秘密鍵にEC2作成の際に選択した物を選んでアクセスします。

5.アクセス出来たらaws s3 ls s3://【S3バケットの名前】を入力してS3へのアクセスを試してみます。

しかしながら下のような表記がでてアクセスができませんでした。

IAMロール、バケットポリシーの設定をしてクロスアカウントでアクセス

4.アカウントB:IAMロールを作成

先ほどのアクセスはなぜ失敗したのでしょうか?
それはS3からアクセスの許可がされていないからです。
ですので早速アクセスの許可をしてみましょう。

1.IAMロールを作成しましょう。
サービスからIAM、ロール、ロールの作成へと進みます。

2.エンティティの種類はAWSサービス、ユースケースはEC2を選択しました。

3.アタッチするポリシーにはadministratorポリシーを付与しました。

4.お好きなタグと名前を追加して作成しましょう。

5.アカウントB:EC2にIAMロールを割り当て

1.テスト用のインスタンスを選択し、IAMロールを変更します。

2.先ほどのIAMロールを選んでアタッチしました。

6.アカウントA:Bucketポリシーを作成しIAMロールにアクセスを許可

1.アカウントAに一旦もどって作業しましょう。作成したS3に入り、アクセス許可からバケットポリシーを編集します


2.アカウントBのテスト用ユーザーに対してオブジェクトの読み書きとバケットの閲覧のアクセス許可を与えます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/S3Access"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::s3-sharetest-terao",
                "arn:aws:s3:::s3-sharetest-terao/*"
            ]
        }
    ]
}

3.12桁の数字のところに自らのアカウントBのIDを、S3Accessのところに自分のtest用ロールを入れてください。

7.アカウントB:作成されたEC2でS3にアクセス→アクセス失敗

EC2にアタッチしたロールにアクセス許可をしたので早速アクセスしてみました。

しかしアクセス失敗です…

IAMロールにも許可を明示して、クロスアカウントでアクセス

何故IAMロールに許可を付与し、管理者権限を持っていてもアクセスできないのでしょうか。
それはクロスアカウントでアクセスする際には、S3とIAMの両方で明示的な許可が必要だからです。
さて、原因も分かったので早速IAMロールにアクセス許可を明示してみましょう。

8.アカウントB:IAMロールにアクセスを許可

1.まずはポリシーを作成しましょう。
IAMからポリシーを選び、ポリシーの作成を選択します。

2.先ほどのS3バケットにアクセスする権限を付与しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::s3-sharetest-terao",
                "arn:aws:s3:::s3-sharetest-terao/*"
            ]
        }
    ]
}

3.このポリシーをtest用ロールにアタッチしましょう。


9.アカウントB:作成されたEC2でS3にアクセス→アクセス成功

EC2にアタッチしたロールにアクセス許可を明示したので早速アクセスしてみました。

成功です!

これでクロスアカウントでのS3のアクセスができましたので今回は以上となります。

おわりに

ここまで読んでいただきありがとうございました。
間違いなどあればぜひご指摘ください。
この記事が誰かの助けとなれば幸いです。

Last modified: 2021-06-23

Author