CloudFormationをコマンドラインで操作するツール
「rain」を使ってみました

はじめに

表題の通り、CloudFormationをコマンドラインで操作できるツール「rain」を使ってみましたので紹介させていただきます。

目次

  1. rainとは?
  2. rainを使ってみようと思ったきっかけ
  3. Windows PCへの導入方法
  4. 使ってみた
  5. よかったところ
  6. いまいちだったところ
  7. 最後に

rainとは?

「rain」を一言でいうと、CloudFormationスタックを操作したり、テンプレートの作成・管理を便利に行ったりできるコマンドラインツールです。具体的には、スタックや変更セットの作成・更新・削除、テンプレートの作成・差分比較・フォーマットなどなど、CloudFormationに関わる様々な操作をコマンドベースで多機能に行うことができます。

コマンドベースでCloudFormationを操作するならAWS CLIのCloudFormationコマンドで良いじゃんと思う方もいるかもしれませんが、rainはCloudFormationコマンドよりも短いコマンドで比較的簡単に扱えるのが嬉しいです。また、テンプレート作成の補助にも使えるのでCloudFormationを使った構築全体を楽にしてくれます。

rain公式ページ

rainを使ってみようと思ったきっかけ

CloudFormationのベストプラクティスについて調べていた際、Blackbelt資料内で紹介されていたのを見つけました。もともとTerraformに憧れがあり、CloudFormationもTerraformのようにコマンドラインで使えたらいいのにと思っていた所だったので試しに使ってみました。

Windows PCへの導入方法

GitHubのリリースページからWindows向けのzipファイルをダウンロードします。ダウンロードしたファイルを展開して任意のフォルダに配置し、rain.exeにパスを通せば使えるようになります。※前提としてAWS CLIが必要になります。

使ってみた

使用時の例としてVPCを含むスタックを作成→サブネットを追加してスタックを更新→スタックの削除までの流れを紹介します。

rain使ってみた.png

テンプレート作成

rain buildコマンドで設定値が空のテンプレートを作成します。-oオプションで指定したファイル名でテンプレートを出力できます。

  • $ rain build AWS::EC2::VPC -o testvpc.yml

以下のようなテンプレートファイルが作成されます。

testvpc.yml

  • AWSTemplateFormatVersion: 2010-09-09
  • Description: Generated by rain
  • Resources:
  •  VPC:
  •   Type: AWS::EC2::VPC
  •   Properties:
  •    CidrBlock: STRING
  •    EnableDnsHostnames: BOOLEAN
  •    EnableDnsSupport: BOOLEAN
  •    InstanceTenancy: STRING
  •    Ipv4IpamPoolId: STRING
  •    Ipv4NetmaskLength: INTEGER
  •    Tags:
  •     - Key: STRING
  •     Value: STRING
  •     - Key: STRING
  •      Value: STRING

Propertiesに求められる値の形式(STRING/INTEGER/BOOLEAN)が提示されていますので記載します。


スタックの作成

rain deployコマンドで環境にvpcをデプロイします。

  • $ rain deploy ./testvpc.yml

コマンドを実行するとデプロイされるリソースの一覧が表示され、続行してよいか聞かれます。このとき裏では変更セットが作成されているようです。

yを入力して続行すると、環境にスタックがデプロイされます。

  • CloudFormation will make the following changes:
  • Stack testvpc:
  •  + AWS::EC2::VPC Vpc
  • Do you wish to continue? (Y/n) y
  • Deploying template 'testvpc.yml' as stack 'testvpc' in ap-northeast-1.
  • Stack testvpc: CREATE_COMPLETE
  • Successfully deployed testvpc

リソース「Vpc」を含むスタック「testvpc」の作成に成功しました。rain lsコマンドでデプロイされているスタックの一覧を確認可能です。

  • $rain ls
  • CloudFormation stacks in ap-northeast-1:
  •  StackSet-AWSControlTowerBP-BASELINE-CLOUDWATCH-xxxxxxxxxxxxxx: CREATE_COMPLETE
  •  StackSet-AWSControlTowerBP-BASELINE-CONFIG-xxxxxxxxxxxxxx: CREATE_COMPLETE
  •  StackSet-AWSControlTowerBP-BASELINE-ROLES-xxxxxxxxxxxxxx: CREATE_COMPLETE
  •  StackSet-AWSControlTowerBP-BASELINE-SERVICE-LINKED-ROLE-xxxxxxxxxxxxxx: CREATE_COMPLETE
  •  StackSet-AWSControlTowerBP-BASELINE-SERVICE-ROLES-xxxxxxxxxxxxxx: CREATE_COMPLETE
  •  StackSet-AWSControlTowerExecution-xxxxxxxxxxxxxx: CREATE_COMPLETE
  •  StackSet-AWSControlTowerGuardrailAWS-GR-ROOT-ACCOUNT-MFA-ENABLED-xxxxxxxxxxxxxx: CREATE_COMPLETE
  •  StackSet-StackSetsAlertRootUsedTokyo-xxxxxxxxxxxxxx: CREATE_COMPLETE
  •  testvpc: CREATE_COMPLETE


スタックの更新

testvpc.ymlテンプレートにサブネットを追加しました。スタック作成時と同じrain deployコマンドでスタックを更新できます。

  • $ rain deploy ./testvpc.yml

コマンドを実行すると、rainは現在デプロイされているスリソース群とこれから更新後スタックに含まれるリソース群を比較し、増えるリソース・削除されるリソースの一覧を提示したうえで続行するか確認してくれます。

yを入力して続行すると、スタックが更新されます。

  • CloudFormation will make the following changes:
  • Stack testvpc:
  •  + AWS::EC2::Subnet Publicaz1Subnet
  • Do you wish to continue? (Y/n) y
  • Deploying template 'testvpc.yml' as stack 'testvpc' in ap-northeast-1.
  • Stack testvpc: UPDATE_COMPLETE
  • Successfully updated testvpc

リソース「Publicaz1Subnet」が追加されました。

他にも、作成に失敗したスタックがある状態で修正したテンプレートを指定してrain deployコマンドを使うと、自動的に失敗スタックを削除して新しいスタックを作成してくれるなど、rain deployコマンドはかなり便利に使うことができます。


スタックの削除

rain rmコマンドでスタックを削除できます。

  • $ rain deploy testvpc

コマンドを実行すると本当に削除してよいか確認が挟まります。

  • Stack testvpc: UPDATE_COMPLETE
  • Are you sure you want to delete this stack? (y/N) y
  • Successfully deleted stack 'testvpc'

スタック「testvpc」が削除できました。

よかったところ

気に入った点としては以下の通りです。


①簡単なCLIでCfnスタックを操作できる

せっかくIaCを導入しているのに最終的なデプロイがGUIでは再現性を高めきれず、もったいない感じがありました。かといってAWS CLIのaws cloudformationコマンドは微妙に扱いづらく・・・rainは簡単に扱えて高機能な点がとてもよいと思いました。


②vscodeで編集したファイルをvscodeからデプロイできる

rainを使う以前はvscodeでテンプレートを編集した後ウィンドウを移動してブラウザ上のコンソールからデプロイする必要がありましたが、テンプレートを編集した後そのままvscodeのターミナルからデプロイできるのは些細なことながら便利でした。


③vscodeから簡単にコンソールに移動できる

rain consoleコマンドでターミナルからAWSコンソールのCloudFormation画面を開くことができます。rainは便利ではあるものの、デプロイ後のスタックやリソースの確認はGUIが優れています。コマンド一つですぐにコンソールに移動し、デプロイ後のリソースを確認できるのはとてもよかったです。


④パラメータをファイルで一元管理できる

rain deployコマンドの-cオプションを使うと、デプロイするテンプレートのParametersの値を指定したファイルから参照させることができます。パラメータ用ファイルを用意して環境内の全てのリソースのパラメータをそこに集約すれば、パラメータの変更を一つのファイルで一元管理可能です。検証で繰り返しリソースをデプロイしていた際は、パラメータファイルを指定するだけでいちいちパラメータの入力や確認をしなくてもよくなるのが便利でした。また、環境ごとにパラメータファイルだけ分けて作成し、テンプレート自体は環境間で使いまわしということも可能でした。実運用を考えた場合にもパラメータのバージョン管理をできるのはよいのではないでしょうか。

いまいちだったところ

逆にいまいちだった点をあげると、デプロイ時のパラメータ入力がひどく面倒でした。テンプレート内でパラメータの値を指定しないままデプロイしようとすると、1つずつ順不同に出てくるパラメータの値を全て入力していく必要があります。1つでも入力を間違えると最初からやり直しになるため、パラメータ入力時は気が抜けませんでした。テンプレート内でパラメータの値を指定しない場合は、コマンドの中に含めたりパラメータ用ファイルを参照させたりするのがよいと思います。

最後に

CloudFormationを操作するためのCLIツール、「rain」について紹介させていただきました。今回紹介したのは基本的なコマンド・オプションのみでしたが、rainには他にも多くのコマンド・オプションがあり、活用することでCloudFormationを更に便利に使うことができそうです。ぜひお試しください。

クラウド基盤ソリューション