CloudFormationがリソースのインポートに対応しました!

CloudFormation(以降、CFnと呼びます)がリソースのインポートに対応しました!

個人的にはこの機能をすごく待っていました!
さっそく試してみたいと思います。

ちょっと長い前説

CFnスタックを削除した場合、CFnで作成したAWSリソースはすべて一緒に削除されます。

そのため、うっかり誤ってCFnスタックを削除してしまった場合、特にステートフルなサービス(RDS等)でやらかしてしまうと、中のデータもすべて消えて大事件になってしまいます。怖ろしい。

そんなうっかりを救済するため、CFnには DeletionPolicy 属性があります。
DeletionPolicyRetain を設定しておくことで、CFnスタックを削除してもAWSリソースをそのまま保持することができます。

詳しくは弊社ブログを御覧ください。

ちなみに、設定変更時にうっかりRDSのデータをふっとばさないために、 UpdateReplacePolicy 属性もあります。

DeletionPolicyのおかげで、RDSのデータは守られるのは良いことなのですが、ちょっと不満な点がでてきます。

図で説明します。こんな感じで、EC2AuroraをCFnスタックで管理しているとします。

そこで、CFnスタックを誤って削除してしまいました!と、いう状況になったとします。
DeletionPolicyにRetainを設定していたおかげで、Auroraのデータは守られました。良かった、良かった。

しかし、再度CFnで管理しようとすると、既存のリソースをCFnスタックに取り込めないので、AuroraはCFnスタックとは別管理にしなければいけません。
せっかくAuroraをCFnで作ったのに、一回誤ってCFnスタックを消してしまったら別で管理しなきゃいけないのかーと悲しい気持ちになります。

そこで、今回発表されたCloudFormationのImport機能です!既存のAWSリソースをCFnスタックにインポートして、CFnスタックに再度紐付けて管理することができます。

やってみた

CFnを利用したAuroraの構築

Auroraの環境をCloudFormationで作ってみます。
次のCFnテンプレートでCfnスタックを作成します。 誤ってCFnスタックを更新したり、消したりしてしまったときにリソースが削除されないよう、DeletionPolicyUpdateReplacePolicyを設定しておきます。

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-clusteraurora-instanceという名前でAuroraを作成しているのでその名前を入力して、次へ進みます。

新しく作るCFnスタックの名前を適当につけて、次へ進みます。

確認画面が表示されるので、importされるリソースを確認して「リソースをインポート」ボタンをクリックします。

しばらくすると、こんな感じにCFnスタックが作成されて、インポートが完了していることがわかります!

Auroraインスタンスのタグを確認すると、CFnが自動的に作成したタグが付いており、またCFnの管理下になったことがわかります。

ドリフトの検出も試してみると、既存のリソースがインポートされてドリフトの対象となっていることがわかります。

終わりに

CloudFormationにimport機能がついたことで、既存のリソースがCFnスタックに取り込めるようになりました!嬉しい限りです。

これでマネジメントコンソールで構築したリソースをそのままCFnスタックに取り込むことができるので、とっちらかっているAWSリソースをCFnの管理下にして整理していきたいと思います。