0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

別アカウントのS3にファイルを置く方法

Last updated at Posted at 2025-04-02

環境

アカウントA:111122223333
アカウントB:777788889999
リージョン:東京
EC2:AmazonLinux 2023

構成としては以下です。
スクリーンショット 2025-04-02 170105.png

EC2にアタッチしたIAMロールでアカウントBのロールをAssumeRole出来るようにし、
アカウントBのロールでAssumeRoleの許可と、S3バケットへPut出来る権限を付与します。

簡単に言うと、アカウントAのEC2でアカウントBのロールを使ってS3にファイルを置くということです。
たびたび出てくるAssumeRoleの意味が分からなければ、脳内でAssumeRoleする=借りると変換してください。

やってみた

EC2は作成されている前提で進めます。
今回はパブリックサブネットに配置されている前提ですが、プライベートにある場合はSTSとS3のエンドポイントが必要になります。
S3エンドポイント:com.amazonaws.ap-northeast-1.s3
STSエンドポイント:com.amazonaws.ap-northeast-1.sts

アカウントAの作業

まずはポリシーを作成します。
以下JSONに記載します。
アカウントBのロール(S3を操作するための権限)をAssumeRole先として記載します。

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::777788889999:role/S3-trance-role"
    }
}

ここでは仮に、「accountA-S3-Policy」とします。

続いて作ったポリシーを使うためにロールも作成します。

ロールでは、使用するのがEC2のため、「信頼するエンティティタイプ」にはEC2を選択します。
スクリーンショット 2025-04-02 173828.png

アタッチするポリシーは先ほど作成した「accountA-S3-Policy」です。

ロール名は「accountA-S3-Role」とします。

あとはこの作成した「accountA-S3-Role」をEC2にアタッチしてあげます。

アカウントBの作業

続いてアカウントBの作業です。
アカウントBでは、先ほどのアカウントAで作成した「accountA-S3-Role」を受け入れてあげて、S3にファイルを置くための権限を許可してあげます。

まずはポリシーを作成します。
ファイルを置くための権限として「s3:PutObject」を許可。
ターゲットとするS3バケットは「test-s3-backet」とします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::test-s3-backet/*"
            ]
        }
    ]
}

ポリシー名は「accountB-S3-Policy」とします。

続いて「accountB-S3-Policy」を使うためにロールも作成します。

先ほどは「信頼するエンティティタイプ」にEC2を指定しましたが、ここでは「accountA-S3-Role」を指定します。
アカウントAが「accountA-S3-Role」を使ってアカウントBのロールを借りてS3を使おうとしているため、「accountA-S3-Role」を信頼してあげる設定をします。
カスタム信頼ポリシーを選択して、以下のように記述します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:role/accountA-S3-Role"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

そして、先ほど作成した「accountB-S3-Policy」をアタッチして作成します。

ロール名は、アカウントAのポリシーで書いた「S3-trance-role」にします。

ここまでで、アカウントAがアカウントBの「S3-trance-role」を使ってS3にファイルを置く権限を持つことが出来るようになりました。

ただもう一つ設定しなければいけないのがS3のバケットポリシーです。
普段自分のアカウントのS3を使用する時は、IAMかバケットポリシーのどちらかが許可されていればいいのですが、他のアカウントからS3へアクセスする時は、IAMの許可とS3のバケットポリシーの許可の両方が必要です。

S3のバケットポリシーにも許可を書いてあげます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::7777788889999:role/S3-trance-role"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::test-s3-backet/*"
        }
    ]
}

※注意
記載するロールはアカウントBのロールです。
アカウントAの「accountA-S3-Role」はアカウントBの「S3-trance-role」を借りるために使用しているので、実際にS3にアクセスするのはアカウントAが借りている「S3-trance-role」になります。

Put以外にも操作したい権限がある場合は、「accountB-S3-Policy」とS3バケット両方に記載を増やしてください。

S3にファイルを置くためのEC2内での操作

EC2でアカウントBの「S3-trance-role」を使うためには、必要な作業があるのでまとめておきます。

ls -l ~/.aws
# ディレクトリがなければ「mkdir ~/.aws」で作成
vi ~/.aws/config
# 以下を記載
================================
[profile ToS3-Role]
role_arn = arn:aws:iam::777788889999:role/S3-trance-role
credential_source = Ec2InstanceMetadata
================================

## UserIdやAccountなどの情報が出力されることを確認
aws sts get-caller-identity --profile ToS3-Role

## ファイルを作成してアカウントBのS3にtest.txtファイルを置く
cd /tmp
touch test.txt
aws s3 cp /tmp/test.txt s3://test-s3-backet --profile ToS3-Role

「ToS3-Role」は任意なのでどんな名前でもいいです。
変更する場合は、S3にファイルを置くコマンドで指定する--profileの後の部分も変えて下さい。
role_arnは借りるロールを記載します。
credential_sourceは、変える必要はありません。

読んでくださってありがとうございました!
誰かのためになれば幸いです。

以上!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?