AWSのマルチアカウント管理で役立つノウハウ、 [マルチアカウントTIPS] をお届けします。
今回は「組織内のAWS利用者に対して特定ファイルを共有したい」ケースを考えます。
もう少し細かい要件は以下のとおりです。
- AWS利用者は IAM Identity Center から「利用者用AWSアカウント」にアクセスする
- AWS管理者は 共有ファイルを「管理者用AWSアカウント内のS3バケット」に格納する
- 利用者用AWSアカウントから共有ファイルを取得したい
共有できるようにS3バケットのバケットポリシーを設定します。
前提条件
以下環境は整備済みとします。
- IAM Identity Center によるアクセス環境
- S3バケット (バケットポリシー以外の基本的な設定)
- 共有したいファイル、つまりS3オブジェクト
S3バケットはマネジメントコンソールから作成する際のデフォルト設定でOKです。 ブロックパブリックアクセスは全て有効化しておきましょう。
準備するパラメータ
以下パラメータがバケットポリシーに必要です。
- 許可セット名 : 利用者がAWSアカウントへアクセスする際に利用する許可セットの名前
- S3バケット名 : 共有ファイルを格納しているS3バケットの名前
- S3オブジェクトキー : 共有ファイルのS3オブジェクトキー
- 組織ID : AWS Organizations の組織ID(
o-example
)
組織IDは管理アカウントのAWS Organizations コンソールから分かります。
設定するバケットポリシー
以下のようなバケットポリシーを設定します。 ハイライト部分を置き換えてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Principal": {
"AWS": "*"
},
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::${S3バケット名}/${S3オブジェクトキー}",
"Condition": {
"ArnLike": {
"aws:PrincipalARN": "arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/*/AWSReservedSSO_${許可セット名}_*"
},
"StringEquals": {
"aws:PrincipalOrgID": [
"${組織ID}"
]
}
}
}
]
}
試してみる
以下のようなパラメータで各種設定をしました。
- 許可セット名 :
test-s3-access
- S3バケット名 : 適当に作成 (以降
DOC-EXAMPLE-BUCKET
) - S3オブジェクトキー :
hoge.txt
- 組織ID : 検証環境の組織ID (以降
o-example
)
バケットポリシーは以下のように設定しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Principal": {
"AWS": "*"
},
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/hoge.txt",
"Condition": {
"ArnLike": {
"aws:PrincipalARN": "arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/*/AWSReservedSSO_test-s3-access_*"
},
"StringEquals": {
"aws:PrincipalOrgID": [
"o-example"
]
}
}
}
]
}
test-s3-access
許可セットでメンバーアカウントに入ります。
$ aws sts get-caller-identity --output yaml
Account: '111111111111' # → 利用者用AWSアカウントID
Arn: arn:aws:sts::111111111111:assumed-role/AWSReservedSSO_test-s3-access_example/kawahara.masahiro
UserId: AROAEXAMPLE:kawahara.masahiro
s3api を使ってオブジェクトを取得してみます。
$ aws s3api get-object --bucket DOC-EXAMPLE-BUCKET --key hoge.txt ./hoge.txt --output yaml
AcceptRanges: bytes
ContentLength: 5
ContentType: text/plain
ETag: '"c5954example"'
LastModified: '2023-06-26T01:10:09+00:00'
Metadata: {}
ServerSideEncryption: AES256
$ cat ./hoge.txt
hoge
管理者用AWSアカウント内のS3オブジェクトを取得できました。
おわりに
組織内でファイルを共有する1手段でした。 参考になれば幸いです。
ちなみにポリシー設計でハマったポイントは以下のとおりです。
- Principal 部分のワイルドカードは「すべて」を指す
"*"
しか使えない - Condition 部分で指定するIAM Identity Center ロールのARN