AWS認定資格の試験対策に出てくるS3バケットへのクロスアカウントアクセスって結局どうやるの？ - シンプルに試したい人向け


# AWS認定資格の試験対策に出てくるS3バケットへのクロスアカウントアクセスって結局どうやるの？ - シンプルに試したい人向け

## はじめに

この記事では資格試験でよく見るクロスアカウントアクセスについて書きます。
「クロスアカウントアクセスっていろんなやり方あるよね？」

えぇ。ツッコミはごもっっともです。
そもそもクロスアカウントアクセス自体はプロフェッショナルレベルでようやく登場する内容です。※最近はアソシエイトでも見かけるようになった？？？

今回はクロスアカウントアクセスを実装したことがない人向けに簡単ではありますが、S3へのアクセスを他のアカウントに与える簡単な方法について書きました。

※ちなみに内容が内容なだけに初心者から少し脱して自分でAWS環境をカスタマイズしている人向けに書いています。

## 前提

2つ以上のAWSアカウントが必要です。
筆者の環境は2つのアカウントでorganizationsの組織を作成しています。
一つの組織、2つのアカウントで`AWS IAM Identity Center`を利用している環境です。

今回はEC2上にセッションマネージャーでログインしてEC2上で試しています。※EC2にSSMのポリシーを含むロールをアタッチ済み。

## S3にクロスアカウントアクセスしてみよう

### 準備するもの

- アクセス元のアカウントID
- 別のアカウントで作成したS3バケット
  - クロスアカウントアクセスを実行するS3バケットのARN
- AWS CLIが実行できる環境
  - ロールを割り当てたEC2またはターミナルによる実行が可能なコンピューティングサービス
  - ローカルPCから実行したい人は実行に使うIAMユーザーを作成しておくこと

## 利用するバケットのARN

AWSマネージメントコンソールからS3バケットを作成してS3バケットのARNをコピーします。※コピーする方法はなんでもいいです。

ちなみにS3のARNは`arn:aws:s3:::バケット名`という形式で表される文字列です。※コロンの数に注意

## バケットポリシー

以下のポリシーを作成したS3バケットに割り当てます。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "cross",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::{接続元のアカウントID}:root"
            },
            "Action": "*",
            "Resource": [
                "S3バケットのARN",
                "S3バケットのARN/*",
            ]
        }
    ]
}
```

## アクセス時のロール

以下のポリシーをロールに許可します。ロールはAWS CLIを実行する時のロールに追加します。
※IAMユーザーを利用している人はIAMユーザーにロールを追加してください。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "cross",
            "Effect": "Allow",
            "Action": "*",
            "Resource": [
                "S3バケットのARN",
                "S3バケットのARN/*",
            ]
        }
    ]
}
```

ポリシー名は`cross_acc`としてAWS CLIを実行するロールに割り当てます。

## AWS CLIから実行する - 動作確認

### 疎通確認

まずは、IAMのエラーが表示されることなくAWS CLIが実行できるかを確認します。
以下のコマンドを実行します。

```bash
aws s3 ls s3://バケット名
```

何もエラーがなく、プロンプトが返って来れば成功です。
※バケット内にすでにファイルが格納されている場合はファイルの一覧が表示されます。

### ファイルをコピーしてバケット内をチェックする

なんでも良いのでファイルを作成してS3にコピーしてみましょう。
まずはファイルを作成します。

```bash
touch test.txt
echo "test" > test.txt
```

作成したファイルをS3にコピーします。

```bash
aws s3 cp test.txt s3://バケット名/
```

問題なくコピーされたかどうかを確認する為にコピーしたファイルを参照します。

```bash
aws s3 ls s3://バケット名
```

ファイルの一覧に`test.txt`が表示されれば、問題なくコピーされています。

### バケットからファイルをコピーする

手元にある`test.txt`を削除します。

```bash
rm -rf test.txt
```

S3からファイルをコピーします。

```bash
aws s3 cp s3://バケット名/test.txt ./
```

ファイルがコピーされているかどうかをチェックします。

```bash
ls -la
```

### バケットからファイルを削除する

バケットからファイルを削除します。

```bash
aws s3 rm s3://バケット名/test.txt
```

削除できたか確認します。

```bash
aws s3 ls s3://バケット名
```

## まとめ

今回はとてもシンプルな方法でクロスアカウントアクセスを実装しました。
しかし、実際の業務では考慮すべきことがいくつかあります。

例えば今回の場合は、EC2上で今回の内容を実行すると通信経路はVPCエンドポイントを通過しない
つまりはプライベートな通信にはなりません。

AWS認定ではよく聞かれますが、エンドポイントアクセスはとても重要です。
また、今回は権限を絞っていませんが、厳密にはバケットポリシーやIAMポリシーで操作内容を制限する必要があります。

クラウドセキュリティにおいては「誰が誰の何にどんなアクションをするか。そして、どのようにして記録を残すか。」それを制限することがとても重要です。

## おまけ

### 課題

- IAMの権限を絞ってアクセスしてみましょう。
    - 例えば、PutObjectとGetObjectしかできないようにしてみる
- 他のアカウントのAWSサービスから自分のS3バケットにアクセスする
    - LambdaやEC2からアクセスしてみるなど

## 参考(別のクロスアカウントアクセスについて)

https://aws.amazon.com/jp/premiumsupport/knowledge-center/cross-account-access-iam/

## おわり