はじめに
好物はインフラとフロントエンドのかじわらゆたかです。 Informatica Intelligent Cloud Services(IICS) CDIで異なるAWSアカウントのS3バケットに書き込んで見たいと思います。 もちろんAccessKeyとSecretAccessKeyを払い出すというやり方はありますが、AWSのベストプラクティスに基づきIAM RoleとAssume Roleを用いた構成になります。
構成図
構成は上記となります。 SecureAgentが入っているAWSアカウントとそれとは別のAWSアカウントのS3にAssume Roleをして参照・書き込みをしたいと思います。 Assume元のアカウントをSource Account、Assume先のアカウントをTarget Accountと呼んでいます。
Target Account側の設定 - 1
Target Account側のIAM RoleにはS3の操作をできるPolicyを付与します。 クロスアカウントの設定となるので、操作対象のバケットのみを操作できるポリシーが良いかと思います。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::{target-account-bucket-name}",
"arn:aws:s3:::{target-account-bucket-name}/*"
]
}
]
}
上記で作ったIAM Roleを仮に以下とします。
arn:aws:iam::210987654321:role/target-role
Source Account側の設定
SecureAgentを入れているEC2に以下のPolicyを追加します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::210987654321:role/target-role"
}
]
}
上記で作ったIAM Roleを仮に以下とします。
arn:aws:iam::123456789012:role/source-role
Target Account側の設定 - 2
Target Account側にSource Account側のIAM RoleからAssumeできるように先程作ったIAM Roleの信頼関係に以下を追加します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/source-role"
},
"Action": "sts:AssumeRole"
}
]
}
IICS CDIの設定
IICS CDI上から接続を追加し、タイプでAmazon S3 v2を選択します。 ランタイム環境ではSource RoleがアタッチされているSecureAgent環境を選択し、IAM Role ARN:にTarget AccountのIAM RoleのARNを入力します。 Use EC2 Role to Assume Roleにチェックを入れ、Folder Pathには対向のバケット名を入れておきRegionは必要に応じて変更します。
正しく設定されていれば、テスト接続が成功し、異なるAWSアカウントのS3バケットにアクセスが可能となります。
結論
このように設定することでSecureAgentが入っているEC2のAWSアカウントとは異なるAWSアカウントにAssume RoleしてS3にアクセスすることができます。
AccessKeyID / SecretAccessKey の組み合わせによるアクセス自体は非常に容易ではありますが、逆に漏洩時の影響や対応等を考えると、異なるAWS アカウントへのアクセスはなおさらAssume Roleを用いたアクセスで行いたいものです。