
CloudFormationがリソースのインポートに対応しました!
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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の管理下にして整理していきたいと思います。











