#はじめに
・S3(アカウントA)←EC2(アカウントB)というアカウントまたぎのアクセスを設定する機会があったので、設定方法を残しておきます。
#概要
そもそもS3へのアクセスを設定する方法は主に以下の2つ
①S3アクセス用のIAMユーザを発行し、
EC2にアクセスキー・シークレットアクセスキーを埋め込んでしまう
(セキュリティ的に非推奨:参照↓)
https://zenn.dev/yutaro1985/articles/daa2aaa6cc9907#%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%AD%E3%83%BC%E3%82%92%E5%85%B1%E6%9C%89%E3%81%97%E3%81%AA%E3%81%84
②IAMロールを作成し、IAMロールにS3へのアクセス権があるIAMポリシーをアタッチ、
作成したIAMロールをEC2にアタッチする。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/cross-account-access-s3/
①のやり方だと、アカウントまたぎでも関係なくアクセスできるが、
セキュリティ的にAWS公式では非推奨となっている。
②のやり方が使われるのが多いと思われるが、アカウントまたぎの場合、S3バケット側のバケットポリシーに作成したIAMロールを受け入れる設定が追加で必要になる。
#前提条件
・S3が存在する(アカウントA)
・EC2が存在する(アカウントB)
#①の設定方法
(1)S3アクセス用のIAMユーザを作成する
IAMの画面で「ユーザ」を選択し、「ユーザを追加」をクリック
任意のユーザ名を入力し、「プログラムによるアクセス」にチェック
アクセス許可の設定で「既存のポリシー」から「AmazonS3FullAccess」を選択
(フルアクセスをつけたくない場合は、ご自身で作成したポリシーを選択してください。)
最後に.csvのダウンロードをクリックし、アクセスキーとシークレットアクセスキーを取得する
(2)上記で取得したアクセスキーとシークレットアクセスキーをEC2に設定する。
設定する前に、対象のS3にアップロードできないことを確認する。
s3://○○○○のところはご自身のS3名を入力してください。
$ touch test
$ ll
合計 0
-rw-rw-r-- 1 ec2-user ec2-user 0 8月 14 03:19 test
$ aws s3 cp test s3://20210814cross-account-test
upload failed: ./test to s3://20210814cross-account-test/test Unable to locate credentials
アップロードに失敗する
EC2に対して、先程取得したアクセスキーとシークレットアクセスキーを設定する。
$ aws configure
と入力すると
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]:
Default output format [None]:
の画面が出るので、「AWS Access Key ID」と「AWS Secret Access Key」に
先ほど取得した値を入力する。その他の項目はお好みで。
入力したら、もう1回S3へのアップロードを試す。
$ aws s3 cp test s3://20210814cross-account-test
upload: ./test to s3://20210814cross-account-test/test
アップロードできる。
コンソールでもアップロードされてるのが確認できる。
#②の設定方法
(0)まず①のやり方をやった場合、aws configureの値が残ってしまっているので
$ rm -r ~/.aws
で設定値をリセットする。
(1)EC2用のIAMロールを作成する。
IAMの画面で「ロール」を選択し、「ロールを作成」をクリック
アクセス許可の設定で「AmazonS3FullAccess」を選択
(フルアクセスをつけたくない場合は、ご自身で作成したポリシーを選択してください。)
(2)作成したロールをEC2に設定する。
対象のEC2を選択して、「アクション」→「セキュリティ」→「IAMロールを変更」
この時点でS3へのアップロードを試してみる。
s3://○○○○のところはご自身のS3名を入力してください。
(test2というファイルを作成しています)
$ aws s3 cp test2 s3://20210814cross-account-test
upload failed: ./test2 to s3://20210814cross-account-test/test2 An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
さっきとは違うエラー文が出てアップロードが失敗する。
(3)S3のバケットポリシーを編集する。
S3の画面の「バケット」→「対象バケット」→「アクセス許可」をクリック
バケットポリシーの内容を編集する。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::アカウントID:role/作成したIAMロール名"
},
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::対象バケット名/*"
}
]
}
Principalのarnのところは、作成したIAMロールの画面からもコピーできる。
S3へのアップロードを試す。
$ aws s3 cp test2 s3://20210814cross-account-test
upload: ./test2 to s3://20210814cross-account-test/test2
成功して、コンソールからもアップロードされていることを確認できる。
#注意事項
アップロードしたオブジェクトの所有者がアップロードした側(今回だとEC2側のアカウント)になってしまいS3側のアカウントでは権限エラーになってしまい何もできないことがある。
アップロード時のオプションに--acl bucket-owner-full-controlをつければ良い。
#引用
https://aws.amazon.com/jp/premiumsupport/knowledge-center/cross-account-access-s3/