Amazon EC2 インスタンスに、別の AWS アカウントの Amazon S3 バケットへのアクセス権限を付与するにはどうすればよいですか?

最終更新日: 2021 年 4 月 15 日

Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを使用して、別のアカウントの Amazon Simple Storage Service (Amazon S3) バケットにアクセスしたいと考えています。インスタンスに認証情報を保存することなく、このアクセス権限を付与するにはどうすればよいですか?

解決方法

注: Amazon S3 バケットへのアクセス権をインスタンスに付与する手順は、別のアカウントの他の AWS リソースへのアクセスを許可する手順と同様です。

アカウント A の Amazon EC2 インスタンスに、別のアカウント (アカウント B) のバケットにアクセスするためのアクセス権限を付与するには、次の手順に従います。

アカウント B から IAM ロールを作成します

1.    アカウント B で AWS マネジメントコンソールにサインインします。

2.    AWS Identity and Access Management (IAM) コンソールを開きます。

3.    ナビゲーションペインで [ロール] を選択します。

4.    [Create role] (ロールの作成) を選択します。

5.    [信頼されたエンティティの種類を選択] で、[別の AWS アカウント] を選択します。

6.    [アカウント ID] で、アカウント A のアカウント ID を入力します。

7.    [Next: Permissions (次の手順: アクセス許可)] を選択します。

8.    ロールに、Amazon S3 へのアクセス権限を委任するポリシーをアタッチします。たとえば、次のポリシーは、バケットに格納されているオブジェクトに対する s3:GetObject のアクセスを許可します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
            ]
        }
    ]
}

注: IAM ポリシーは、ユースケースに必要な Amazon S3 バケットレベルおよびオブジェクトレベルのアクセス許可に基づいて変更できます。

9.    [Next: Add tags (次の手順: タグの追加)] を選択します。

10.    オプションのタグをロールに追加できます。または、フィールドを空白のままにして、[Next: Review (次へ: 確認)] を選択できます。

11.    [ロール名] に、ロールの名前を入力します。

12.    [Create role] (ロールの作成) を選択します。

アカウント B からロールの ARN を取得します。

1.    IAM コンソールのナビゲーションペインから [ロール] を選択します。

2.    作成した IAM ロールを選択します。

3.    [Role ARN] (ロール ARN) にリストされている値を書き留めます。

アカウント A から、別のロール (インスタンスプロファイル) を作成し、インスタンスにアタッチする

1.    アカウント A で AWS マネジメントコンソールにサインインします。

2.    IAM コンソールを開きます。

3.    ナビゲーションペインで、[ロール] を選択します。

4.    [Create role] (ロールの作成) を選択します。

5.    [Select type of trusted entity (信頼されたエンティティのタイプの選択)] で、[AWS サービス] を選択します。

6.    [このロールを使用するサービスを選択] で、[EC2] を選択します。

7.    [Next: Permissions (次の手順: アクセス許可)] を選択します。

8.    [Next: Tags (次の手順: タグ)] を選択します。

9.    オプションのタグをロールに追加できます。または、フィールドを空白のままにして、[Next: Review] (次へ: 確認) を選択できます。

10.    [ロール名] に、ロールの名前を入力します。

11.    [Create role] (ロールの作成) を選択します。

12.    ロールのリストから、作成したロールを選択します。

13.    [Add inline policy] を選択し、JSON ビューを選択します。

14.    以下のポリシーを入力します。arn:aws:iam::111111111111:role/ROLENAME を、アカウント B で作成した IAM ロールの Amazon リソースネーム (ARN) に置き換えます。

{ 
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::111111111111:role/ROLENAME"
        }
    ]
}

15.    [ポリシーの確認] を選択します。

16.    [名前] に、ポリシーの名前を入力します。

17.    [Create policy] を選択します。

18.    Amazon S3 バケットにアクセスするために使用する Amazon EC2 インスタンスに、IAM ロール (インスタンスプロファイル) をアタッチします。

Amazon EC2 インスタンスから、認証情報を使用してロールを設定します。

1.    Amazon EC2 インスタンスに接続します。詳細については、Linux インスタンスへの接続またはWindows インスタンスへの接続を参照してください。

2.    インスタンスに接続後、ディレクトリに既に ~/.aws という名前のフォルダがあることを確認します。

~/.aws フォルダを検索するには、次の ls コマンドを実行してディレクトリを一覧表示します。

ls -l ~/.aws

3.    ~/.aws フォルダが見つかった場合は、次のステップに進みます。ディレクトリに ~/.aws フォルダがまだない場合は、mkdir コマンドを実行してフォルダを作成します。

mkdir ~/.aws/

4.    ~/.aws 内で、テキストエディタを使用してファイルを作成します。ファイルに config という名前を付けます。

5.    ファイルに、次のテキストを入力します。enterprofilename を、インスタンスにアタッチしたロールの名前に置き換えます。次に、 arn:aws:iam::111111111111:role/ROLENAME を、アカウント B で作成したロールの ARN と置き換えます。

[profile enterprofilename]
role_arn = arn:aws:iam::111111111111:role/ROLENAME

credential_source = Ec2InstanceMetadata

6.    ファイルを保存します。

インスタンスプロファイルの確認

インスタンスのロール (インスタンスプロファイル) がアカウント B のロールを引き受け可能なことを確認するには、インスタンスに接続中に次のコマンドを実行します。profilename を、インスタンスにアタッチしたロールの名前に置き換えます。

$aws sts get-caller-identity --profile profilename

このコマンドでは次のようなレスポンスが返ります。

"Account": "11111111111",

"UserId": "AROAEXAMPLEID:sessionName",

"Arn": "arn:aws:sts::111111111111:assumed-role/ROLENAME/sessionName"

「Arn」 の値が、アカウント B で作成したロールの ARN と一致することを確認します。

Amazon S3 バケットへのアクセスを検証する

インスタンスが Amazon S3 バケットにアクセスできることを確認するには、インスタンスに接続中に次のリストコマンドを実行します。profilename を、インスタンスにアタッチしたロールの名前に置き換えます。

aws s3 ls s3://DOC-EXAMPLE-BUCKET --profile profilename

インスタンスが正常にバケットにアクセスできる場合、バケットのコンテンツをリストする次のようなレスポンスが返されます。

PRE Hello/
2018-08-15 16:16:51 89 index.html

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?