【AWS】CloudFormation実行ツール”rain”がとても素晴らしい件
えっ!?コマンド一発でテンプレート作成!?
どもども、お気に入りのスーツが入らなくなり歳を感じる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の波が押し寄せる現在において必ず習得しておきたいツールですので、これから積極的に使用していこうと思いました。
あと、処理中の雨描写がとてもかわいいですね!
最後まで読んでいただきありがとうございました!
↓オススメ教材