S3へのクロスアカウントアクセスを設定してみた

#はじめに
・S3（アカウントA）←EC2（アカウントB）というアカウントまたぎのアクセスを設定する機会があったので、設定方法を残しておきます。

#概要
そもそもS3へのアクセスを設定する方法は主に以下の２つ
①S3アクセス用のIAMユーザを発行し、
EC2にアクセスキー・シークレットアクセスキーを埋め込んでしまう
（セキュリティ的に非推奨：参照↓）
https://zenn.dev/yutaro1985/articles/daa2aaa6cc9907#%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%AD%E3%83%BC%E3%82%92%E5%85%B1%E6%9C%89%E3%81%97%E3%81%AA%E3%81%84
②IAMロールを作成し、IAMロールにS3へのアクセス権があるIAMポリシーをアタッチ、
作成したIAMロールをEC2にアタッチする。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/cross-account-access-s3/



①のやり方だと、アカウントまたぎでも関係なくアクセスできるが、
セキュリティ的にAWS公式では非推奨となっている。
②のやり方が使われるのが多いと思われるが、アカウントまたぎの場合、S3バケット側のバケットポリシーに作成したIAMロールを受け入れる設定が追加で必要になる。

#前提条件
・S3が存在する（アカウントA）
・EC2が存在する（アカウントB）

#①の設定方法
（１）S3アクセス用のIAMユーザを作成する

IAMの画面で「ユーザ」を選択し、「ユーザを追加」をクリック
![スクリーンショット 2021-08-14 12.15.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/a57e2827-a70e-05a5-a208-0469e297aa92.png)

任意のユーザ名を入力し、「プログラムによるアクセス」にチェック
![スクリーンショット 2021-08-14 12.16.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/a9803ab3-dcdf-4a33-0ff5-60a2e187cf18.png)

アクセス許可の設定で「既存のポリシー」から「AmazonS3FullAccess」を選択
（フルアクセスをつけたくない場合は、ご自身で作成したポリシーを選択してください。）
![スクリーンショット 2021-08-14 12.16.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/dde1ba08-342a-0496-834c-dac92531372c.png)

問題ないことを確認してIAMユーザを作成する
![スクリーンショット 2021-08-14 12.16.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/3f2baf9d-8692-2701-be6e-8a3dd10893b8.png)


最後に.csvのダウンロードをクリックし、アクセスキーとシークレットアクセスキーを取得する
![スクリーンショット 2021-08-14 12.16.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/e5371229-a8db-a96e-d976-b6399e22bf8e.png)


（２）上記で取得したアクセスキーとシークレットアクセスキーをEC2に設定する。

設定する前に、対象のS3にアップロードできないことを確認する。
s3://○○○○のところはご自身のS3名を入力してください。

```
$ touch test

$ ll
合計 0
-rw-rw-r-- 1 ec2-user ec2-user 0  8月 14 03:19 test

$ aws s3 cp test s3://20210814cross-account-test
upload failed: ./test to s3://20210814cross-account-test/test Unable to locate credentials
```
アップロードに失敗する

EC2に対して、先程取得したアクセスキーとシークレットアクセスキーを設定する。

```
$ aws configure
```

と入力すると

```
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]:
Default output format [None]:
```

の画面が出るので、「AWS Access Key ID」と「AWS Secret Access Key」に
先ほど取得した値を入力する。その他の項目はお好みで。

入力したら、もう１回S3へのアップロードを試す。

```
$ aws s3 cp test s3://20210814cross-account-test
upload: ./test to s3://20210814cross-account-test/test
```

アップロードできる。
コンソールでもアップロードされてるのが確認できる。
![スクリーンショット 2021-08-14 12.23.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/4189a852-9c95-57d7-b57e-3dabc1c2ce91.png)


#②の設定方法
（０）まず①のやり方をやった場合、aws configureの値が残ってしまっているので

```
$ rm -r ~/.aws
```

で設定値をリセットする。

（１）EC2用のIAMロールを作成する。

IAMの画面で「ロール」を選択し、「ロールを作成」をクリック
![スクリーンショット 2021-08-14 13.04.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/dd4ecfad-c99b-84d1-3f57-bb63774b6039.png)

「AWSサービス」の「EC2」を選択する
![スクリーンショット 2021-08-14 13.04.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/0fb3d5c8-ce80-9832-eeba-5bbf54c884f7.png)

アクセス許可の設定で「AmazonS3FullAccess」を選択
（フルアクセスをつけたくない場合は、ご自身で作成したポリシーを選択してください。）
![スクリーンショット 2021-08-14 13.04.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/01dbbedd-9d0f-64df-7af9-5decba8a7086.png)

ロール名に任意の名前を入力
![スクリーンショット 2021-08-14 13.05.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/9c152932-0f45-2e9b-3fa8-b14e4f77a4bb.png)

（２）作成したロールをEC2に設定する。
対象のEC2を選択して、「アクション」→「セキュリティ」→「IAMロールを変更」
![スクリーンショット 2021-08-14 13.06.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/a36e3957-8401-12c4-79a7-a670ad1dde7b.png)

さっき作ったIAMロールを選択して、保存
![スクリーンショット 2021-08-14 13.07.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/9530b8db-ae1c-d8fc-74e3-36c714bd3cf7.png)

EC2にIAMロールが設定されていることを確認する
![スクリーンショット 2021-08-14 13.07.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/8aed0033-aeb0-ad66-125a-b504838ebc41.png)

この時点でS3へのアップロードを試してみる。
s3://○○○○のところはご自身のS3名を入力してください。
（test2というファイルを作成しています）

```
$ aws s3 cp test2 s3://20210814cross-account-test
upload failed: ./test2 to s3://20210814cross-account-test/test2 An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
```

さっきとは違うエラー文が出てアップロードが失敗する。


（３）S3のバケットポリシーを編集する。

S3の画面の「バケット」→「対象バケット」→「アクセス許可」をクリック
![スクリーンショット 2021-08-15 16.46.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/effd8f65-f79a-c941-ca09-0e7fb58d5db7.png)

バケットポリシーの内容を編集する。


```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::アカウントID:role/作成したIAMロール名"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::対象バケット名/*"
        }
    ]
}
```

Principalのarnのところは、作成したIAMロールの画面からもコピーできる。
![スクリーンショット 2021-08-14 13.09.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/942e73c8-1d0b-e30a-9e44-2b441b8f18c7.png)

S3へのアップロードを試す。

```
$ aws s3 cp test2 s3://20210814cross-account-test
upload: ./test2 to s3://20210814cross-account-test/test2
```

成功して、コンソールからもアップロードされていることを確認できる。
![スクリーンショット 2021-08-14 13.11.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575134/15e74069-ea24-da2b-63e4-131a6fec8d5a.png)

#注意事項
アップロードしたオブジェクトの所有者がアップロードした側（今回だとEC2側のアカウント）になってしまいS3側のアカウントでは権限エラーになってしまい何もできないことがある。
アップロード時のオプションに--acl bucket-owner-full-controlをつければ良い。


#引用
https://aws.amazon.com/jp/premiumsupport/knowledge-center/cross-account-access-s3/