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されていることが確認できます。
今回はこれで終了です。お疲れ様でした!