構成

別のAWSアカウント内のS3バケットにアクセスする設定を考える。
構成としては一方のAWSアカウントにアクセスするAWS Userがあり、他方のAWSアカウントにS3バケットがある。

構成

権限設定としては以下のようになる。

  • アクセス元AWSアカウント: アクセス先のS3バケットにアクセスするための権限をIAM Userに与える
  • アクセス先AWSアカウント: アクセス元のAWSアカウントのIAM Userがアクセスできるようにバケットポリシーを設定する

アクセス元AWSアカウントの設定

アクセス元のAWSアカウントにあるIAM Userへ以下の権限を与える。
権限を与えるIAM Userがまだ存在しない場合は作成する。

IAM Roleを作成し、以下のポリシーをアタッチする。

  • s3:GetObject
  • s3:ListBucket

その他、タグやバージョンへのアクセスが必要な場合はs3:GetObject*、書き込みが必要な場合はs3:PutObject*を与える。

また、アクセスを許可するResourceにはアクセス先のS3バケットを指定する。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:PutObjectTagging",
        "s3:GetObjectTagging",
        "s3:GetObjectVersion",
        "s3:GetObjectVersionTagging"
      ],
      "Resource": [
        "arn:aws:s3:::アクセス先バケット名/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::アクセス先バケット名"
      ] 
    }
  ]
}

IAM Policyを作成してIAM Roleにアタッチしてもいいし、IAM Roleのインラインとして設定してもいい。

アクセス先AWSアカウントの設定

アクセス先のS3バケットにアクセス元のAWSアカウントのIAM Userがアクセスできるようにバケットポリシーを設定する。

バケットポリシーへ設定する情報は以下のとおり。

  • アクセスを許可するIAM UserのARNをPrincipalで指定
  • アクセスを許可するActionを指定
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::アクセス元アカウントID:role/アクセス元AWSアカウントのロール名"
      },
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:PutObjectTagging",
        "s3:GetObjectTagging",
        "s3:GetObjectVersion",
        "s3:GetObjectVersionTagging"
      ],
      "Resource": [
        "arn:aws:s3:::バケット名/*"
      ]
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::アクセス元アカウントID:role/アクセス元AWSアカウントのロール名"
      },
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::バケット名"
      ]
    }
  ]
}

EC2から他AWSアカウントのS3にアクセスする

EC2から他AWSアカウントのS3にアクセスする場合は、EC2のInstance Profileにアクセス元のAWSアカウントのIAM Roleをアタッチする。

設定すればアクセスキーを使用しなくてもaws s3コマンドでアクセスできるようになる。