【AWS】CloudFormation実行ツール”rain”がとても素晴らしい件

2月 12, 2022

えっ!?コマンド一発でテンプレート作成!?


どもども、お気に入りのスーツが入らなくなり歳を感じるsaisaiです。


本日はCloudFormation実行ツールの一つである"rain"をご紹介しようと思います。


普段CloudFormationを用いて一からテンプレートを作成する際、公式ドキュメントから各パラメータが必須であるかどうかやそのパラメータが何を定義しているのかを追いかけっこしています。


さらに、実際にコンソール画面からテンプレート起動、リソースの作成状況確認、失敗した場合はスタックを削除してテンプレートを修正し、再度実行…とCloudFormationは便利であるものの作業が煩雑になりがちです。


今回はそんな悩みを解決してくれそうなツールの存在を知りましたので、早速使用してみました。そんな記事です。

rainとは

今回試すCloudFormation実行ツールは冒頭にも紹介した"rain"です。


rain公式リポジトリ(下記URL)によると"Rainは、AWSCloudFormationテンプレートとスタックを操作するためのコマンドラインツール"と紹介されています。

https://github.com/aws-cloudformation/rain

インタラクティブなデプロイや、テンプレートの準備・フォーマットの整形、ログ関連の操作などCloudFormationを使用する上で欲しかった機能が満載です。JSONとYAMLの変換もできるらしい…。


これはますますワクワクしてきました。百聞は一見に如かず、早速試してみましょう。

rainを使用してみる

まずはクライアント(ローカル)PCにrainをインストールします。(AWSクレデンシャル情報も事前に登録しておいてください!)


今回使用するPCはMacOSのため、インストール手順としては以下のようになります。(お使いのOSに合わせてインストール方法を調べてみてください。)

$ brew install rain
$ rain --version

バージョンが表示されたら準備OKです!


てなわけで、早速rainを使用してAWSリソースを作成してみたいと思います。今回はあくまで使用感を探るだけなのでEC2インスタンスを一台立ち上げるに留めておきます。


それでは早速EC2インスタンスを立ち上げるCloudFormationテンプレートをrainを使って作成してみましょう。


実行するコマンドはたったこれだけ。

rain build AWS::EC2::Instance > ec2.yml

これだけでEC2インスタンスを立ち上げるCloudFormationテンプレートがec2.ymlというファイル名で作成されます。便利すぎるやろ…。


原理としては"rain build"でテンプレート内容をを出力してファイルに書き込んでいるので

rain build AWS::EC2::Instance | grep -v "# Optional" > ec2.yml

このように指定することで必須ではないパラメータを排除したテンプレートを作成することもできました。


ご丁寧にOutputsの設定までしてくれてるよ…。これは別のスタックへのパラメータ受け渡しも簡単にできますね!

Outputs:
  MyInstanceAvailabilityZone:
    Value: !GetAtt MyInstance.AvailabilityZone

  MyInstancePrivateDnsName:
    Value: !GetAtt MyInstance.PrivateDnsName

  MyInstancePrivateIp:
    Value: !GetAtt MyInstance.PrivateIp

  MyInstancePublicDnsName:
    Value: !GetAtt MyInstance.PublicDnsName

  MyInstancePublicIp:
    Value: !GetAtt MyInstance.PublicIp

とはいえ流石にまだまだパラメータの項目が多いので必要に応じ追加、削除してください。


今回使用するテンプレートは以下のように必要最低限で用意しました。AMIとサブネットは既存のものを使用します。

AWSTemplateFormatVersion: "2010-09-09"

Description: Template generated by rain

Resources:
  EC2: 
    Type: AWS::EC2::Instance
    Properties: 
      ImageId: 使用するAMIのID
      KeyName: キーペア名
      InstanceType: t2.micro
      NetworkInterfaces: 
        - AssociatePublicIpAddress: "true"
          DeviceIndex: "0"
          SubnetId: サブネットID
          GroupSet:
            -  セキュリティグループのID
      Tags:
          - Key: Name
            Value: ec2-rain-test

早速テンプレートをデプロイしてみましょう!(クレデンシャルの登録状況に応じてProfileも使用してください。)

$ rain deploy ec2.yml

おお…雨が降っておる…。


テンプレートのチェックが完了すると、これから変更されるリソースが表示されます。親切!

CloudFormation will make the following changes:
Stack ec2:
  + AWS::EC2::Instance EC2
Do you wish to continue? (Y/n) 

yを入力して実行すると、コンソール画面上でリソースの作成が進んでいることが確認できます。


ちなみにテンプレートに不備があった場合はRollBackされます。例えばImageIdがセットされていない場合はこのようなエラーメッセージとともにRollBackが開始されます。コンソールでみるよりずっと見やすいですね!

Stack ec2: ROLLBACK_COMPLETE
Messages:
  - EC2: Property ImageId cannot be empty.
failed deploying stack 'ec2'



さらにすごいのがここからです。本来であればCloudFormationは実行失敗の場合でもスタックは残り続けるため"スタックの削除"->"修正したテンプレートのデプロイ"という2段工程を踏む必要があり地味に面倒です。


しかし、例えばRollBack後初回デプロイと全く同じコマンドを実行してみると

$ rain deploy ec2.yml

自動的にスタックの削除からはじまり、続けて今回のテンプレートがデプロイされます。テンプレートの更新も上記コマンドで可能です。便利すぎるぜ…。


下記メッセージから無事作成されたことが読み取れます。

Stack ec2: CREATE_COMPLETE
Successfully deployed ec2

コンソール画面を見てみると無事EC2インスタンス が作成されていることがわかります!


CloudFormationスタック名はテンプレートファイル名に依存していそうですね。


rainはCloudFormationスタックの管理にも役立ちます。例えば

$ rain ls

で現在稼働しているCloudFormationスタック名が確認できます。

他にも

$ rain cat スタック名

で該当スタックからテンプレートを取得することも可能です。


テンプレートの管理においても非常に便利です。例えば、

rain diff テンプレートA テンプレートB

のようにして差分をチェックしたり

rain fmt テンプレート > 出力ファイル名

とすればフォーマットを整形することもできます。


他にも様々な機能がrainにはありますので、使いこなせるようになった暁にはCloudFormationスタックを爆速で作成・管理することができそうですね!!


いろいろ遊んだら最後にスタックの削除をしましょう。

$ rain rm スタック名
Are you sure you want to delete this stack? (y/N) y

作成したリソースが削除されていることを確認してください。

さいごに

今回は超便利なCloudFormation実行ツール、rainを使用してみました。


正直想像以上に便利で驚いています。IaCの波が押し寄せる現在において必ず習得しておきたいツールですので、これから積極的に使用していこうと思いました。


あと、処理中の雨描写がとてもかわいいですね!


最後まで読んでいただきありがとうございました!


↓オススメ教材

AWS

Posted by CY