AdministratorAccess権限を持っているIAMユーザーでRDSの暗号化が何故かできなくて困っていました。
全てのIAMユーザーは (セキュリティ対策として) IAMグループのポリシーで以下の接続IP制限をつけていました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"xxx.xxx.xxx.xxx/32",
"yyy.yyy.yyy.yyy/32"
]
}
}
}
]
}
なんでか?
AWSリソースの管理に関するポリシーの例 に以下の注意書を発見しました。
Important
aws:SourceIp 条件キーは、テストされた API をユーザーとして直接呼び出す場合に IAM ポリシーでのみ機能します。代わりにサービスを使用してターゲットサービスを呼び出した場合、ターゲットサービスは元のユーザーの IP アドレスではなく呼び出し元サービスの IP アドレスを認識します。これは、AWS CloudFormation を使用して Amazon EC2 を呼び出すことでインスタンスを自動的に作成した場合などに生じることがあります。現在のところ、IAM ポリシーで評価を行うために、発信元サービスを通じて元の IP アドレスをターゲットサービスに渡す方法はありません。これらのタイプのサービス API 呼び出しでは、aws:SourceIp 条件キーを使用しないでください。
IP制限外したらRDSの暗号化付けてRDS作れたので、これが原因だった様子。
解決案
以下の様に、特定のサービス (今回はKMS) をIP制限から外しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "*",
"NotResource": "arn:aws:kms:*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"xxx.xxx.xxx.xxx/32",
"yyy.yyy.yyy.yyy/32"
]
}
}
}
]
}
除外したサービスには指定外の接続IPからでも操作出来るようになってしまうので、ちょっと微妙...