Amazon RDS Custom for Oracle作成の手引き（その２：事前準備）

#はじめに

[前回の記事](https://qiita.com/asahide/items/f7a1822b039add53d27e)でRDS Custom for Oracleを作成するための、CEV(Custom Engine Vertion)を作成しました。CEVができていればRDS Customをプロビジョニングできますが、プロビジョニング実施時にCEVの参照権限やRDS Customに与えるためのロール等の準備ができていないとプロビジョニングできません。
基本的に設定はユーザガイドの[Setting up your environment for Amazon RDS Custom for Oracle](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-setup-orcl.html)の内容になりますが、一部現時点では誤っている部分等があったりしてそのまま実行してもうまくいかないため、こちらで記載します。


#RDS作成の流れ

CEV作成からRDS作成のイメージは以下になります。
といってもおおざっぱすぎてちょっとわかり辛いですね、、
[前回の記事](https://qiita.com/asahide/items/f7a1822b039add53d27e)が①と②の最初の部分、今回は②を行うための準備、みたいな位置づけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/652e8dde-2ccc-bebd-ba97-5533469d84ad.png)
([Amazon RDS Custom for Oracle – New Control Capabilities in Database Environment](https://aws.amazon.com/jp/blogs/aws/amazon-rds-custom-for-oracle-new-control-capabilities-in-database-environment/))

##前提条件の確認

利用できるリージョンは現時点(2021/12/5)では東京を含む以下9つになります。
最新は[ユーザガイド](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-reqs-limits.html#custom-reqs-limits.regions)を参照ください。

- Asia Pacific (Tokyo)
- Asia Pacific (Singapore)
- Asia Pacific (Sydney)
- Europe (Frankfurt)
- Europe (Stockholm)
- Europe (Ireland)
- US East (N. Virginia)
- US East (Ohio)
- US West (Oregon)

##RDS Custom作成のための事前準備

次の順序で実施していくことで、作成することができます。

1. CEV(Custom Engine Version)の作成
1. KMSキーの準備
1. IAMロールの作成
1. セキュリティグループの作成
1. エンドポイントの設定

####CEV作成

手引きは[こちら](https://qiita.com/asahide/items/f7a1822b039add53d27e)に記載してますので、参考にしてください。



####KMSキーの準備

ロールにアタッチできる対称Keyがあれば大丈夫です、必要な場合にはKMS側にも権限を追加します。
[Make sure that you have a symmetric AWS KMS key](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-setup-orcl.html#custom-setup-orcl.cmk)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/b8c5c935-1098-d9fb-ec8b-0d46c3d25f2c.png)


####IAMロールの作成

RDS Custom for Oracleを作成するためには、Custom RDSインスタンスにアタッチするためのIAMロールが必要になります。
IAMロールは AWSRDSCustom という名前で始まる必要があり、[ユーザガイドに記載のあるポリシー](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-setup-orcl.html#custom-setup-orcl.iam)がアタッチされている必要があります。

<details><summary>ポリシーの例</summary><div>

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeAssociation",
                "ssm:GetDeployablePatchSnapshotForInstance",
                "ssm:GetDocument",
                "ssm:DescribeDocument",
                "ssm:GetManifest",
                "ssm:GetParameter",
                "ssm:GetParameters",
                "ssm:ListAssociations",
                "ssm:ListInstanceAssociations",
                "ssm:PutInventory",
                "ssm:PutComplianceItems",
                "ssm:PutConfigurePackageResult",
                "ssm:UpdateAssociationStatus",
                "ssm:UpdateInstanceAssociationStatus",
                "ssm:UpdateInstanceInformation",
                "ssm:GetConnectionStatus",
                "ssm:DescribeInstanceInformation",
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "2",
            "Effect": "Allow",
            "Action": [
                "ec2messages:AcknowledgeMessage",
                "ec2messages:DeleteMessage",
                "ec2messages:FailMessage",
                "ec2messages:GetEndpoint",
                "ec2messages:GetMessages",
                "ec2messages:SendReply"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "3",
            "Effect": "Allow",
            "Action": [
                "logs:PutRetentionPolicy",
                "logs:PutLogEvents",
                "logs:DescribeLogStreams",
                "logs:DescribeLogGroups",
                "logs:CreateLogStream",
                "logs:CreateLogGroup"
            ],
            "Resource": [
                "arn:aws:logs:ap-northeast-1:*:log-group:rds-custom-instance*"
            ]
        },
        {
            "Sid": "4",
            "Effect": "Allow",
            "Action": [
                "s3:putObject",
                "s3:getObject",
                "s3:getObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::do-not-delete-rds-custom-*/*"
            ]
        },
        {
            "Sid": "5",
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "StringEquals": {
                    "cloudwatch:namespace": [
                        "RDSCustomForOracle/Agent"
                    ]
                }
            }
        },
        {
            "Sid": "6",
            "Effect": "Allow",
            "Action": [
                "events:PutEvents"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "7",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret"
            ],
            "Resource": [
                "arn:aws:secretsmanager:ap-northeast-1:xxxxxxxxxxxx:secret:do-not-delete-rds-custom-*"
            ]
        },
        {
            "Sid": "8",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketVersions"
            ],
            "Resource": [
                "arn:aws:s3:::do-not-delete-rds-custom-*"
            ]
        },
        {
            "Sid": "9",
            "Effect": "Allow",
            "Action": "ec2:CreateSnapshots",
            "Resource": [
                "arn:aws:ec2:*:*:instance/*",
                "arn:aws:ec2:*:*:volume/*"
            ],
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/AWSRDSCustom": "custom-oracle"
                }
            }
        },
        {
            "Sid": "10",
            "Effect": "Allow",
            "Action": "ec2:CreateSnapshots",
            "Resource": [
                "arn:aws:ec2:*::snapshot/*"
            ]
        },
        {
            "Sid": "11",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": [
                "arn:aws:kms:ap-northeast-1:xxxxxxxxxxxx:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
            ]
        },
        {
            "Sid": "12",
            "Effect": "Allow",
            "Action": "ec2:CreateTags",
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "ec2:CreateAction": [
                        "CreateSnapshots"
                    ]
                }
            }
        }
    ]
}
```

</div></details>


####セキュリティグループ・エンドポイント設定

次に、SSMで接続するためのセキュリティグループ・エンドポイント設定が必要になります。
RDS Custom for Oracleにアタッチするセキュリティグループは、RDS Custom自体がSSMを用いて管理されるため、[ポート443のアウトバウンド接続が許可されている必要があります](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-setup-orcl.html#custom-setup-orcl.vpc.sg)。
また、エンドポイントは以下を利用する必要があり、以下のエンドポイント側のセキュリティグループを設定する場合にはエンドポイント側でポート443のインバウンドが許可されている必要があります。

- Amazon CloudWatch
- Amazon CloudWatch Logs
- Amazon CloudWatch Events
- Amazon EC2
- Amazon EventBridge
- Amazon S3
- AWS Secrets Manager
- AWS Systems Manager

詳しくは[ユーザガイド](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-setup-orcl.html#custom-setup-orcl.vpc.endpoints)に記載がありますが、ユーザガイド中の表には一部足りない点があり(2021/12/7時点)、ec2, ec2messages, ssmmessages辺りを追加する必要があります。(S3はGateway型のエンドポイントである必要があります)

このあたりの設定が足りていないと、RDS Custom作成時にエラーメッセージが出力されます。
基本的にはSSMの通信なので、[SSMのユーザガイド](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/setup-create-vpc.html)とかを見ると解決できると思います。

あとは、細かいですが[インスタンスメタデータへのアクセス](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-setup-orcl.html#custom-setup-orcl.vpc.imds)も必要になってきます。

#まとめ

設定自体は難しくないですが、設定が足りていないとRDS Custom作成時にエラーが発生します。
特にセキュリティグループやエンドポイントは何が正しくないのかわかり辛いので、エラーを見ながら対応するか、ガバガバ設定で一度試して、成功したら少しずつ厳しくしていく、というようなアプローチが必要なのでは？と思います。
CEVが作成できて、事前準備も完了したら、RDS Customを作成することができます。