chikoblog

やってみたことの掃溜め

既存リソースをCloudFormation管理に取り込む機能でいろいろ試してみた。

この記事は,マイナビ Advent Calendar 2019 2日目の記事となります.

2019年11月11日 ポッキー&プリッツの日AWSがリリースした新機能

CloudFormation(以下CFn)管理外でAWSリソースを作成したリソースや、 CFn管理をおこなう前に作成した既存のリソースをCFn管理に取り込むことができるようになりました!

クラメソ様の記事(具体的な手順はこちらを参考にしていただければと思います。。。) dev.classmethod.jp

既存リソースを取り込めるとどんなことできるのか?

クラメソさんの記事を読み似たようなことをやってみると 確かに既存リソースが取り込めました!

ただ、以下のことをおこなうとどう動くのか気になったのでやってみました。
①ライフサイクルが同じAWSリソースごとにスタックは作成可能?
②この機能を利用しイケてないスタックを作ってしまった際切り戻しは可能なのか?

図ような環境でいろいろ試してみた。 f:id:Chiko_gorilla:20191202165115p:plain

図のテンプレートはここ

chikospescialneo.yml

AWSTemplateFormatVersion: 2010-09-09
Resources:
  tapiocatapitapiVPC:
    Type: 'AWS::EC2::VPC'
    "DeletionPolicy" : "Retain"
    Properties:
      Tags:
        - Key: Name
          Value: tapiocatapitapiVPC
        - Key: Owner
          Value: chiko
      CidrBlock: 10.10.10.0/24
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
  tapiocatapitapiEC2:
    Type: 'AWS::EC2::Instance'
    "DeletionPolicy" : "Retain"
    Properties:
      Tags:
        - Key: Name
          Value: tapiocatapitapiEC2
        - Key: Owner
          Value: chiko
      ImageId: ami-0064e711cbc7a825e
      InstanceType: t2.micro
      SubnetId: !Ref tapiocatapitapiVPCSubnet
      SecurityGroupIds:
        - !Ref tapiocatapitapiSecurityGroup
  tapiocatapitapiRT:
    Type: 'AWS::EC2::RouteTable'
    "DeletionPolicy" : "Retain"
    Properties:
      Tags:
        - Key: Name
          Value: tapiocatapitapiRT
        - Key: Owner
          Value: chiko
      VpcId: !Ref tapiocatapitapiVPC
  tapiocatapitapiVPCSubnet:
    Type: 'AWS::EC2::Subnet'
    "DeletionPolicy" : "Retain"
    Properties:
      MapPublicIpOnLaunch: 'true'
      AvailabilityZone: ap-northeast-1c
      VpcId: !Ref tapiocatapitapiVPC
      CidrBlock: 10.10.10.0/24
      Tags:
        - Key: Name
          Value: tapiocatapitapiVPCSubnet
        - Key: Owner
          Value: chiko
  tapiocatapitapiSecurityGroup:
    Type: 'AWS::EC2::SecurityGroup'
    "DeletionPolicy" : "Retain"
    Properties:
      GroupName: tapiocatapitapiSecurityGroup
      GroupDescription: Enable HTTPS access via port 443
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '443'
          ToPort: '443'
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: tapiocatapitapiSecurityGroup
        - Key: Owner
          Value: chiko
      VpcId: !Ref tapiocatapitapiVPC
  tapiocatapitapiS3Bucket:
    Type: AWS::S3::Bucket
    "DeletionPolicy" : "Retain"

①ライフサイクルが同じAWSリソースごとにスタックは作成可能?

上記の「chikospescialneo.yml」テンプレートを三つに分けてみる

chikospescial-VPC.yml

AWSTemplateFormatVersion: 2010-09-09
Resources:
  tapiocatapitapiVPC:
    Type: 'AWS::EC2::VPC'
    "DeletionPolicy" : "Retain"
    Properties:
      Tags:
        - Key: Name
          Value: tapiocatapitapiVPC
        - Key: Owner
          Value: chiko
      CidrBlock: 10.10.10.0/24
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'

chikospescial-NW.yml

AWSTemplateFormatVersion: 2010-09-09
Resources:
  tapiocatapitapiRT:
    Type: 'AWS::EC2::RouteTable'
    "DeletionPolicy" : "Retain"
    Properties:
      Tags:
        - Key: Name
          Value: tapiocatapitapiRT
        - Key: Owner
          Value: chiko
      VpcId: 対象のVPCIDを書く
  tapiocatapitapiVPCSubnet:
    Type: 'AWS::EC2::Subnet'
    "DeletionPolicy" : "Retain"
    Properties:
      MapPublicIpOnLaunch: 'true'
      AvailabilityZone: ap-northeast-1c
      VpcId: 対象のVPCIDを書く
      CidrBlock: 10.10.10.0/24
      Tags:
        - Key: Name
          Value: tapiocatapitapiVPCSubnet
        - Key: Owner
          Value: chiko
  tapiocatapitapiSecurityGroup:
    Type: 'AWS::EC2::SecurityGroup'
    "DeletionPolicy" : "Retain"
    Properties:
      GroupName: tapiocatapitapiSecurityGroup
      GroupDescription: Enable HTTPS access via port 443
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '443'
          ToPort: '443'
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: tapiocatapitapiSecurityGroup
        - Key: Owner
          Value: chiko
      VpcId: 対象のVPCIDを書く

chikospescial-INS.yml

AWSTemplateFormatVersion: 2010-09-09
Resources:
  tapiocatapitapiEC2:
    Type: 'AWS::EC2::Instance'
    "DeletionPolicy" : "Retain"
    Properties:
      Tags:
        - Key: Name
          Value: tapiocatapitapiEC2
        - Key: Owner
          Value: chiko
      ImageId: ami-0064e711cbc7a825e
      InstanceType: t2.micro
      SubnetId: 対象のサブネット ID
      SecurityGroupIds:
        -   対象のセキュリティグループID
  tapiocatapitapiS3Bucket:
    Type: AWS::S3::Bucket
    "DeletionPolicy" : "Retain"

実際にやってみる

まずは、「chikospescial-VPC.yml」を使い既存のVPCのみスタック化
(作業手順は省きますクラメソ様の記事をご確認ください)

コンソールの指示通り進めた結果
スタック:ChikoTesttapiocatapitapiVPC完成 f:id:Chiko_gorilla:20191202183420j:plain

同じ要領で「chikospescial-NW.yml」を使い既存のNW周りをスタック化
スタック:ChikoTestTapiocatapitapiNWが同じくできた f:id:Chiko_gorilla:20191202183604j:plain

ここまでくると残りのインスタンスたち「chikospescial-INS.yml」も問題なくスタック化が可能
スタック:ChikoTesttapiocatapitapiINS f:id:Chiko_gorilla:20191202183613j:plain

AWSのスタック管理ポリシー通り、
ライフサイクルが同じものはまともてスタック化は可能でした!
これはいろいろ使い勝手がいい気がします!

②この機能を利用しイケてないスタックを作ってしまった際切り戻しは可能なのか?

「chikospescialneo.yml」テンプレートを使い、
一度すべての環境を1つのスタックにしてみる

スタック:ChikoTest f:id:Chiko_gorilla:20191202191753j:plain

このスタックを削除する

f:id:Chiko_gorilla:20191202192651j:plain

ChikoTestを抹消した f:id:Chiko_gorilla:20191202192703j:plain

AWSリソースは無事かな? f:id:Chiko_gorilla:20191202192844j:plain f:id:Chiko_gorilla:20191202192902j:plainf:id:Chiko_gorilla:20191202192913j:plain

問題なく生きてそう…
(サービス的な影響度は現状わからんが)
CloudWatchのアラートも上がってない

あとは、①で話した感じに設定していけば
無事にスタック化の切り戻しから
意図したスタック構成に変更可能ですね!

やってみた結果

テンプレートを見ていただければわかりますが、
今回のCFnの機能で既存リソースをもとに作成したスタックは
「"DeletionPolicy" : "Retain"」の設定が必須です。

これによりスタックの削除をおこなうとスタックのみの削除として
CFnの管理外に外れるってことですね…

これはいい使い道がありそうです!

過去にCFnで作成した全部一緒の500行テンプレートがあって
そのスタックを分割したいって時
「"DeletionPolicy" : "Retain"」が設定されていれば、
一度スタック管理から外してスタックの分割も可能ですね。

ただ、「"DeletionPolicy" : "Retain"」していないと無理ですが…