CloudFormationがリソースのインポートに対応しました!
CloudFormation(以降、CFnと呼びます)がリソースのインポートに対応しました!
- AWS CloudFormation Launches Resource Import
- New – Import Existing Resources into a CloudFormation Stack | AWS News Blog
個人的にはこの機能をすごく待っていました! さっそく試してみたいと思います。
ちょっと長い前説
CFnスタックを削除した場合、CFnで作成したAWSリソースはすべて一緒に削除されます。
そのため、うっかり誤ってCFnスタックを削除してしまった場合、特にステートフルなサービス(RDS等)でやらかしてしまうと、中のデータもすべて消えて大事件になってしまいます。怖ろしい。
そんなうっかりを救済するため、CFnには DeletionPolicy
属性があります。
DeletionPolicy
に Retain
を設定しておくことで、CFnスタックを削除してもAWSリソースをそのまま保持することができます。
詳しくは弊社ブログを御覧ください。
ちなみに、設定変更時にうっかりRDSのデータをふっとばさないために、 UpdateReplacePolicy
属性もあります。
DeletionPolicyのおかげで、RDSのデータは守られるのは良いことなのですが、ちょっと不満な点がでてきます。
図で説明します。こんな感じで、EC2とAuroraをCFnスタックで管理しているとします。
そこで、CFnスタックを誤って削除してしまいました!と、いう状況になったとします。 DeletionPolicyにRetainを設定していたおかげで、Auroraのデータは守られました。良かった、良かった。
しかし、再度CFnで管理しようとすると、既存のリソースをCFnスタックに取り込めないので、AuroraはCFnスタックとは別管理にしなければいけません。 せっかくAuroraをCFnで作ったのに、一回誤ってCFnスタックを消してしまったら別で管理しなきゃいけないのかーと悲しい気持ちになります。
そこで、今回発表されたCloudFormationのImport機能です!既存のAWSリソースをCFnスタックにインポートして、CFnスタックに再度紐付けて管理することができます。
やってみた
CFnを利用したAuroraの構築
Auroraの環境をCloudFormationで作ってみます。 次のCFnテンプレートでCfnスタックを作成します。 誤ってCFnスタックを更新したり、消したりしてしまったときにリソースが削除されないよう、DeletionPolicyとUpdateReplacePolicyを設定しておきます。
Auroraを起動させるために必要なVPC, Subnet, SecurityGroup, DB SubnetGroupは、あらかじめ構築しておいてください。
AWSTemplateFormatVersion: '2010-09-09' Parameters: DBSecurityGroupId: Description: Select a security group for Aurora Type: AWS::EC2::SecurityGroup::Id DBSubnetGroupName: Description: Input DB subnet group Name for Aurora Type: String AuroraPassword: Description: Input password for Aurora Type: String NoEcho: true Resources: AuroraCluster: Type: AWS::RDS::DBCluster DeletionPolicy: Retain Properties: BackupRetentionPeriod: 1 DBClusterIdentifier: aurora-cluster DBClusterParameterGroupName: default.aurora-mysql5.7 DBSubnetGroupName: !Ref DBSubnetGroupName Engine: aurora-mysql EngineMode: provisioned EngineVersion: 5.7.mysql_aurora.2.05.0 MasterUserPassword: !Ref AuroraPassword MasterUsername: admin Tags: - Key: Name Value: aurora-cluster AuroraInstance: Type: AWS::RDS::DBInstance DeletionPolicy: Retain Properties: DBClusterIdentifier: !Ref AuroraCluster DBInstanceClass: db.t2.small DBInstanceIdentifier: aurora-instance Engine: aurora-mysql MultiAZ: false Tags: - Key: Name Value: aurora-instance
このCFnテンプレートでCFnスタックを作成すると、次のようにAuroraクラスターとインスタンスが構築できます。
Auroraインスタンスのタグを確認すると、CFnが自動的に作成するタグが付いており、CFnで管理されていることがわかります。
参考: リソースタグ - AWS CloudFormation
ここで操作を誤って、CFnスタックを削除してしまいました。あぁー。
でも、大丈夫。DeletionPolicyにRetainを設定していたので、Auroraは削除がスキップされて残っています。
ただし、CFnが自動的に作成したタグは消え、CFnスタックの管理下でなくなったことがわかります。
AuroraをインポートしたCFnスタックの作成
それでは、既存AWSリソース(Aurora)をimportして、CFnスタックを作りなおしてみます。
まずは、マネジメントコンソールのCloudFormationの画面から「スタックの作成」を選択して、「既存のリソース使用(リソースをインポート)」を選択します。
必要なものを確認して、次へを選択します。
CFnテンプレートファイルをアップロードして、次へ進みます。
インポートするリソースは、CFnテンプレート内でDeletionPolicy属性を指定する必要があることに注意してください。 今回のCFnテンプレートはあらかじめDeletionPolicyを設定しているので、特に問題はありません。
参考: Bringing Existing Resources Into CloudFormation Management - AWS CloudFormation
インポートするリソースの識別子を入力します。 今回は、aurora-clusterとaurora-instanceという名前でAuroraを作成しているのでその名前を入力して、次へ進みます。
新しく作るCFnスタックの名前を適当につけて、次へ進みます。
確認画面が表示されるので、importされるリソースを確認して「リソースをインポート」ボタンをクリックします。
しばらくすると、こんな感じにCFnスタックが作成されて、インポートが完了していることがわかります!
Auroraインスタンスのタグを確認すると、CFnが自動的に作成したタグが付いており、またCFnの管理下になったことがわかります。
ドリフトの検出も試してみると、既存のリソースがインポートされてドリフトの対象となっていることがわかります。
終わりに
CloudFormationにimport機能がついたことで、既存のリソースがCFnスタックに取り込めるようになりました!嬉しい限りです。
これでマネジメントコンソールで構築したリソースをそのままCFnスタックに取り込むことができるので、とっちらかっているAWSリソースをCFnの管理下にして整理していきたいと思います。