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

最終更新日: 2018 年 12 月 21 日

Amazon Elastic Compute Cloud (Amazon EC2) インスタンスが別の AWS アカウントの Amazon Simple Storage Service (Amazon S3) バケットにアクセスできるようにしたいと考えています。インスタンスに認証情報を保存せずにこのアクセスを許可するにはどうすればよいですか?

解決方法

注意: この例は Amazon S3 バケットへのアクセスに固有ですが、別のアカウントの他の AWS リソースへのアクセス権をインスタンスに付与する手順は似ています。

あるアカウント (アカウント A) の Amazon EC2 インスタンスに、別のアカウント (アカウント B) の Amazon S3 バケットへのアクセス許可を付与するには、以下の手順に従います。

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

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

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

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

4.    [Create role] を選択します。

5.    [Select type of trusted entity] で、別の AWS アカウントを選択します。

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

7.    [Next: Permissions] を選択します。

8.    Amazon S3 へのアクセスを委任するロールにポリシーをアタッチします。たとえば、このポリシーは、特定のバケットおよびバケットに保存されているオブジェクトへのすべてのアクションへのアクセスを許可します。

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

9.    [Next: Add tags] を選択します。

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

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

12.    [Create role] を選択します。

アカウント B から、ロールの ARN を取得する

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

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

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

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

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

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

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

4.    [Create role] を選択します。

5.    [Select type of trusted entity] で、[AWS service] を選択します。

6.    [Choose the service that will use this role] で、[EC2] を選択します。

7.    [Next: Permissions] を選択します。

8.    [Next: Tags] を選択します。

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

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

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.    [Name] にポリシーの名前を入力します。

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

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

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

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

2.    インスタンスに接続したら、ディレクトリに ~/.awsという名前のフォルダがすでにあるかどうかを確認します。このフォルダを見つけるには、次のようなディレクトリを一覧表示するコマンドを実行します。

ls -l ~/.aws

3.    ~/.aws フォルダが見つかったら、次の手順に進みます。ディレクトリに ~/.aws フォルダがない場合は、以下のようなコマンドを実行してフォルダを作成します。

mkdir ~/.aws/

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

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

[profile profilename]

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 バケットにアクセスできることを確認するには、インスタンスに接続されているときにこの list コマンドを実行します。profilename を、インスタンスにアタッチしたロールの名前に置き換えます。

aws s3 ls s3://awsexamplebucket --profile profilename

インスタンスがバケットに正常にアクセスできる場合、次のようなバケットの内容をリストするレスポンスを受け取ります。

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