AWS CloudFormation を使用して AWS::RDS::DBInstance リソースを作成しようとすると、「DBInstance xxxxxx を安定化できませんでした」というエラーが表示されます。
簡単な説明
AWS CloudFormation を使用して既存の RDS DB スナップショットから Amazon Relational Database Service (Amazon RDS) DB ンスタンス (AWS::RDS::DBInstance) を作成すると、以下の理由でエラーが発生することがあります。
- DB スナップショットのストレージタイプが DB インスタンスのストレージタイプと一致していない。
- DB スナップショットに無効なオブジェクトが含まれている。
注: RDS DB インスタンスの安定化の問題については、他にもいくつかの原因が考えられます。次の解決の手順は、RDS DB インスタンスが AWS CloudFormation のスナップショットから作成される場合における問題にのみ適用されます。
解決方法
DB スナップショットと DB インスタンスのストレージタイプを一致させる
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
1. Amazon RDS コンソールまたは describe-db-snapshots AWS CLI を使用して、DB スナップショットのストレージタイプを確認します。例:
aws rds describe-db-snapshots --db-snapshot-identifier MyRDSSnapShot --region us-east-1
{
"DBSnapshots": [
{
.......
"AllocatedStorage": 20,
"Status": "available",
"PercentProgress": 100,
"DBSnapshotArn": "arn:aws:rds:us-east-1:1234567890:snapshot:MyRDSSnapShot",
"EngineVersion": "12.1.0.2.v7",
"ProcessorFeatures": [],
"OptionGroupName": "default:oracle-ee-12-1",
"SnapshotCreateTime": "2019-03-16T17:43:41Z",
"AvailabilityZone": "us-east-1f",
"StorageType": "gp2",
.......
}
]
}
注: AWS CLI コマンドからの StorageType の値 gp2 は、Amazon RDS コンソールでの値 General Purpose (SSD) に対応します。
2. AWS CloudFormation の JSON または YAML テンプレートの AWS::RDS::DBInstance リソース定義で、StorageType の値を、スナップショットのストレージタイプと一致するように設定します。この場合、ストレージタイプは gp2 に設定されます。
JSON:
{
"MySampleDB": {
"Type": "AWS::RDS::DBInstance",
"Properties": {
"DBInstanceClass": "db.t2.small",
"StorageType": "gp2",
"Engine": "postgres",
"EngineVersion": "9.5.12",
........
}
}
}
YAML:
MySampleDB:
Type: 'AWS::RDS::DBInstance'
Properties:
DBInstanceClass: db.t2.small
StorageType: gp2
Engine: postgres
EngineVersion: 9.5.12
......
注: ストレージタイプが設定されていない場合、AWS CloudFormation は StorageType をデフォルトで standard に設定します。これは、参照されるスナップショットのストレージタイプと一致しない可能性があります。ストレージの種類が一致しない場合、ストレージ変換プロセスが追加されるため、RDS はデータベースの作成に時間がかかることがあります。また、この不一致は、大規模なデータベースのタイムアウトエラーを引き起こす可能性があります。AWS::RDS::DBInstance リソースでストレージタイプを明示的に定義するのがベストプラクティスです。また、スナップショットのストレージタイプと一致するようにストレージタイプを設定することを検討してください。
3. AWS CloudFormation スタックを起動して DB インスタンスを作成します。
DB スナップショットに無効なオブジェクトがないことを確認する
DB インスタンスの作成に使用された DB スナップショットに無効なオブジェクトが含まれている場合は、以下の手順を実行します。
1. 既存のデータベース内にある無効なオブジェクトを特定して、修正します。
たとえば、次の Oracle データベースクエリは無効なオブジェクトのリストを返します。
select owner,object_name,object_type,status from dba_objects where status='INVALID'
2. 既存のデータベースからスナップショットを再取得します。
重要: DBスナップショットを再取得するのは、必ずデータベースからすべての無効なオブジェクトを修正または削除した後だけです。
3. AWS CloudFormation スタックを起動し、既存の DB スナップショットを使用して DB インスタンスを作成します。