1. HOME
  2. ブログ
  3. S3
  4. AWS S3 クロスアカウント環境でのファイル共有方法

BLOG

ブログ

S3

AWS S3 クロスアカウント環境でのファイル共有方法

こんにちは!
AWSアカウントが異なる環境(クロスアカウント)でのファイル共有方法を説明します。

構成

アカウントA (アカウントID:123456789123)
アカウントB (アカウントID:987654321098)

アカウントAでポリシー作成

IAMのポリシー設定画面より、「ポリシーの作成」をクリックします。

「JSON」タブを選択し、以下ポリシーをコピーして、JSONテキストボックスに貼り付け、
「次のステップ:タグ」をクリックします。

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

「次のステップ:確認」をクリックします。

ポリシー名を入力し「ポリシーの作成」をクリックします。

Policy-TANUKIが作成されたことを確認できます。

アカウントAでロール作成

IAMロールの設定画面より「ロールの作成」をクリックします。

信頼されたエンティティの種類を選択:別のAWSアカウント
アカウントID:アカウントBのIDを入力

「次のステップ:アクセス権限」をクリックします。

先程作成したポリシーを選択し「次のステップ:タグ」を選択します。

「次のステップ:確認」をクリックします。

ロール名を入力し「ロールの作成」をクリックします。
これでロールの作成は完了です。

ロール一覧より、先ほど作成したロールをクリックし、概要を開きます。
アカウントB側の作業で使用しますので、ロールARNをコピーしておきます。

アカウントBでポリシー作成

アカウントAのRole-TANUKIに一時クレデンシャルを要求(AssumeRole)できるポリシーを作成します。

アカウントBでのIAMのナビゲーションペインよりポリシーをクリックし、「ポリシーの作成」を
クリックします。

「JSON」タブを選択し、以下ポリシーをコピペして「次のステップ:タグ」をクリックします。

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::123456789123:role/Role-TANUKI"
  }
}

「次のステップ:確認」をクリックします。

ポリシー名を入力し「ポリシーの作成」をクリックします。

ポリシー作成が完了しました。

アカウントBでロール作成

IAMのナビゲーションペインより、ロールを選択し「ロールの作成」をクリックします。

信頼されたエンティティの種類を選択:AWSサービス
ユースケースの選択:EC2

上記を選択後、「次のステップ:アクセス権限」をクリックします。

先程作成したポリシーのチェックボックスにチェックを付け、「次のステップ:タグ」をクリックします。

「次のステップ:確認」をクリックします。

ロール名を入力し、「ロールの作成」をクリックします。
ロール作成はこれで完了です。

EC2(Amazon Linux 2)にロールをアタッチ

先程作成したロールをEC2にアタッチします。

ロールをアタッチするEC2を選択した状態で、「アクション」→「セキュリティ」→
「IAMロールを変更」をクリックします。

先程作成したロールを選択し「保存」をクリックします。

アカウントBのEC2でクレデンシャル取得

$ aws s3 ls s3://tanukikitune-bucket
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

「アカウントBのEC2」から「アカウントAのS3バケット一覧」を確認しようと試みたところ、
errorが出力され、コマンドが弾かれました。EC2にてAWS CLIの準備を行います。

$ aws configure
AWS Access Key ID [None]: AAAAAAAAAAAAAAAAAAAAAAAA
AWS Secret Access Key [None]: BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
Default region name [None]: ap-northeast-1
Default output format [None]: json

EC2上で「aws configure」コマンドを実施し、アカウントBのKey情報を入力していきます。

$ cat ~/.aws/credentials
[default]
aws_access_key_id = AAAAAAAAAAAAAAAAAAAAAAAA
aws_secret_access_key = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
$

~/.aws/credentials配下に上記ファイルが作成されていることを確認できます。

[Role-TANUKI-Profile]
role_arn = arn:aws:iam::123456789123:role/Role-TANUKI
credential_source=Ec2InstanceMetadata

~/.aws/credentials配下ファイルに上記のプロファイルを設定します。

$ aws s3 ls s3://tanukikitune-bucket –profile Role-TANUKI-Profile
PRE tanuki/
2021-02-12 07:41:16 6 tanuki.txt

プロファイル設定後にアカウントA側のバケット参照が行えるようになったかを確認します。
上記の通り、アカウントA側のS3 tanukikitune-bucketバケット内にtanuki.txtが
格納されていることを確認できました。

$touch abcdefg.txt
$
$ ls
abcdefg.txt
$
$ aws s3 cp abcdefg.txt s3://tanukikitune-bucket/abcdefg.txt –profile Role-TANUKI-Profile
upload: ./abcdefg.txt to s3://tanukikitune-bucket/abcdefg.txt

abcdefg.txtを作成し、アカウントA側のS3バケットへuploadを行いました。

アカウントA側のバケットにabcdefg.txtが無事にuploadされていることが確認できます。
今回はこれで終了です。お疲れ様でした!

関連記事