S3 バケットを異なるアカウント間で共有してみた その2

# はじめに

Amazon S3 を使っている中で、他の AWS アカウント上にある S3 バケットのデータを利用したくなるときがあります。この時は、主に以下の3つの方法が利用可能です。

- S3 バケットのクロスアカウントレプリケーション
- バケットポリシー
- スイッチロール

今回は、「S3 バケットのクロスアカウントレプリケーション」について、設定手順の確認をしていきます。

[前回の記事](https://qiita.com/sugimount-a/items/415e0672832868611829)では、「S3 バケットのクロスアカウントレプリケーション」を取り上げました。今回の記事は「バケットポリシー」と「スイッチロール」の方法を確認していきましょう。



# バケットポリシー

## 構成図

構成図はこんな感じです。S3 Bucket の共有元でバケットポリシーを設定し、共有先のユーザーに紐づく IAM Policy でアクセス許可を行う形です。

![image-20220402153250377.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/dc497c11-5f77-2496-bbb8-7f3de08b4354.png)



## アカウント1 : S3 Bucket の作成

クロスアカウントアクセス用の S3 Bucket を作成します。

![image-20220402154333009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/66e274e4-8240-1649-fc3d-e4ff2d8034f3.png)



ファイルの中身はこんな感じです。

![image-20220402161855217.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a555163d-8696-b8b1-62e9-075da6fb95ab.png)



## アカウント1: バケットポリシーでクロスアカウントを許可

他のアカウントにアクセスさせたい S3 バケットを開いて、Bucket Policy の個所で Edit を押します。

![image-20220402155133268.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/70e64848-6cf6-c97e-6c48-e2e8c4641a62.png)



以下のポリシーを指定します。

- アクセスを許可する、異なる AWS アカウントの IAM User ARN を指定
- アクセス許可の操作種別を指定

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::xxxxxxxxxxxxx:user/cliuser"
            },
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::s3-crossaccount-bucket01",
                "arn:aws:s3:::s3-crossaccount-bucket01/*"
            ]
        }
    ]
}
```



## アカウント2 : IAM Policy について

アクセスを行う IAM User は、既に AdministratorAccess を付与しており、S3 Bucket へのアクセスが出来る状態になっています。

![image-20220402160623000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/6a8eaddb-bcea-2173-73f4-f4b5899c8026.png)



## アカウント2 : 動作確認

バケットポリシーをつかったクロスアカウントアクセスは、マネージメントコンソールからアクセスできません。AWS CLI や SDK を利用して API 経由でアクセスをします。今回は。AWS CLI を使っていきましょう。

まず、AWS CLI で利用しているユーザーを確認します。たしかに AWS アカウント2 側で、アクセス許可を設定したユーザーです。

```
> aws sts get-caller-identity --profile sub1
{
    "UserId": "AIDA4DSZG6OWJQFTUCNOH",
    "Account": "xxxxxxxxxx",
    "Arn": "arn:aws:iam::xxxxxxxxx:user/cliuser"
}
```



`s3 ls` コマンドで、異なるアカウントのバケットの中身を確認します。正常に実行ができましたね。

```
> aws s3 ls s3://s3-crossaccount-bucket01 --profile sub1
2022-04-02 15:42:55         18 crossaccount-file01.txt
```



実際にファイルをダウンロードしてみます

```
> aws s3 cp s3://s3-crossaccount-bucket01/crossaccount-file01.txt test.txt --profile sub1
download: s3://s3-crossaccount-bucket01/crossaccount-file01.txt to ./test.txt
```



ファイルの中身も確認できます

```
> cat test.txt
見えますか？
```



# スイッチロール

## 構成図

構成図はこんな感じです。アクセスを共有したい AWS アカウント 1 の方で、スイッチロール用の IAM Role を準備します。スイッチロールは、AWS アカウント2 に限定が可能なので、セキュアに構成可能です。

![image-20220402164217732.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fc8005e4-0c5f-0c05-5ac5-7dd98c98a7fc.png)



## アカウント1 : IAM Role の作成

Create role で スイッチロール用の IAM Role を作成します。

![image-20220402163459556.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/2e1cd518-8156-1aa7-0949-99ced8397e57.png)



スイッチロールを許可させたい AWS アカウント2 側の Account ID を指定します。

![image-20220402163547641.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7b6fe6e6-ebd3-f61c-2160-2a8f6293f4a3.png)



今回は、作業を簡単にするために、すべての S3 Bucket にアクセス可能な `AmazonS3ReadOnlyAccess` を指定します。実際の環境では、`Resource` の指定で具体的なバケットに限定したアクセスを設定するとよいでしょう。

![image-20220402163752854.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/8c27ea2b-c648-8bf5-6835-3bf608051312.png)



名前を指定します

![image-20220402163929041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/1d575af0-d7b8-f1cc-1f58-147370b2d9ea.png)



スイッチロール用の IAM Role が作成されました

![image-20220402164041035.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/dea9fe6a-b4b4-3ce3-5634-b487701cab2b.png)



## アカウント2 : スイッチロール

アカウント2 側でスイッチロールを行います。

![image-20220402164859952.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/25b1262e-cc1c-90af-3fed-e7edc96ab866.png)



ロールの切り替えを選択します

![image-20220402164945581.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b7809be4-2720-cc7d-b299-188b25b54f3e.png)





せってい

![image-20220402165050551.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/bfe70cc0-86af-c17f-b353-0511c5fd56f3.png)

スイッチロールが出来ました。このまま S3 のページに移動します。

![image-20220402165203608.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/565f8902-8d05-18df-e3be-fcb0b4edb51d.png)



AWS アカウント1 側のバケットが参照できます。

![image-20220402165312219.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4ef2fa47-3440-75d8-e7d8-6bd5ef0d9312.png)



バケットの中のファイルも確認可能です

![image-20220402165345676.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c3f2a976-cd42-5e17-5b84-5c449d1ce462.png)



正常にファイルの中身も確認できました。

![image-20220402165419719.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/80939ff6-252c-2de6-1cab-1f7d499b5285.png)



# 検証を通じてわかったこと

- 「バケットポリシー」を使ったクロスアカウントアクセスの方法は、マネージメントコンソールのバケット一覧に表示されない。AWS CKI や SDK などで API を経由してアクセスする必要がある
- 「スイッチロール」の場合はマネージメントコンソールから GUI アクセスが可能