CloudFormationのCLI実行ツール Rain

記事タイトルとURLをコピーする

はじめに

PE部の谷です。
先日、AWS CloudFormationを触っていたら、たまたまRainというCLI実行ツールがあることを知りました。
使ってみたら便利だったので共有します。

Rain

Rainとは

AWS CloudFormationテンプレートとスタックを操作するためのコマンドラインツールです。

  • リソースを指定したら、そのリソースに合わせたテンプレートを自動で作成してくれる

  • デプロイ失敗後の再デプロイがめっちゃ楽

などの便利機能があります。

CloudFormationでありがちな、必要なパラメータを調べる、デプロイに失敗した際にスタックを一度消すという作業が必要なくなります。

公式ページ github.com

ドキュメント aws-cloudformation.github.io

おすすめポイント

$ rain build リソースタイプ > ファイル

このコマンドを実行するとCloudFormationの空のテンプレートが生成されます。
しかも、どれが必須のパラメータなのか、オプションなのかがわかるようになっているので、定義が楽チン♪

$ rain deploy <テンプレートファイル> スタック名

このコマンドを実行すると、パラメータを提示、差分リソース、進捗、エラーの表示をしてくれます。 また、スタックが重複していたら自動で消してくれます。

使ってみた

インストール

Rainを使うにはbrewが必要なので、先にインストールします。

環境

  • Linux
  • Homebrew 3.2.8

Rainをインストールします。

$ brew install rain

テンプレート作成

試しにDynamoDBのテンプレートを作成してみます。

$ rain build AWS::DynamoDB::Table > dynamodb.yml

dynamodb.ymlファイル

AWSTemplateFormatVersion: "2010-09-09"

Description: Template generated by rain

Resources:
  MyTable:
    Type: AWS::DynamoDB::Table
    Properties:
      AttributeDefinitions:
        - AttributeName: CHANGEME
          AttributeType: CHANGEME
      BillingMode: CHANGEME # Optional
      ContributorInsightsSpecification: # Optional
        Enabled: false
      GlobalSecondaryIndexes:
        - ContributorInsightsSpecification: # Optional
            Enabled: false
          IndexName: CHANGEME
          KeySchema:
            - AttributeName: CHANGEME
              KeyType: CHANGEME
          Projection:
            NonKeyAttributes: # Optional
              - CHANGEME
            ProjectionType: CHANGEME # Optional
          ProvisionedThroughput: # Optional
            ReadCapacityUnits: 0
            WriteCapacityUnits: 0
      KeySchema:
        - AttributeName: CHANGEME
          KeyType: CHANGEME
      KinesisStreamSpecification: # Optional
        StreamArn: CHANGEME
      LocalSecondaryIndexes:
        - IndexName: CHANGEME
          KeySchema:
            - AttributeName: CHANGEME
              KeyType: CHANGEME
          Projection:
            NonKeyAttributes: # Optional
              - CHANGEME
            ProjectionType: CHANGEME # Optional
      PointInTimeRecoverySpecification: # Optional
        PointInTimeRecoveryEnabled: false # Optional
      ProvisionedThroughput: # Optional
        ReadCapacityUnits: 0
        WriteCapacityUnits: 0
      SSESpecification: # Optional
        KMSMasterKeyId: CHANGEME # Optional
        SSEEnabled: false
        SSEType: CHANGEME # Optional
      StreamSpecification: # Optional
        StreamViewType: CHANGEME
      TableName: CHANGEME # Optional
      Tags:
        - Key: CHANGEME
          Value: CHANGEME
      TimeToLiveSpecification: # Optional
        AttributeName: CHANGEME
        Enabled: false

Outputs:
  MyTableArn:
    Value: !GetAtt MyTable.Arn

  MyTableStreamArn:
    Value: !GetAtt MyTable.StreamArn

どれが必須のパラメータなのか一目でわかるので、定義が簡単ですね。(# Optionalがついてるのがオプションです。)

これだとちょっと量が多いので、必須パラメータのみ表示するように--bareをつけます。

AWSTemplateFormatVersion: "2010-09-09"

Description: Template generated by rain

Resources:
  MyTable:
    Type: AWS::DynamoDB::Table
    Properties:
      KeySchema:
        - AttributeName: CHANGEME
          KeyType: CHANGEME

デプロイ

そのままデプロイしてみます。
パラメータを指定してないのでエラーになりますが、対話形式で進み、進捗も表示されます。

$ rain deploy dynamodb.yml dynamodb
Rain needs to create an S3 bucket called 'rain-artifacts-607869573801-ap-northeast-1'. Continue? (Y/n) Y
CloudFormation will make the following changes:
Stack dynamodb:
  + AWS::DynamoDB::Table MyTable
Do you wish to continue? (Y/n) Y
Deploying template 'dynamodb.yml' as stack 'dynamodb' in ap-northeast-1.
Stack dynamodb: ROLLBACK_COMPLETE
Messages:
  - MyTable: You must specify the AttributeDefinitions property.
failed deploying stack 'dynamodb'

CloudFormationのスタックも失敗しています。

f:id:swx-tani:20210819224530p:plain                                         必要なパラメータを入力して再度デプロイしてみます。

普通なら、前回エラーになったスタックを消さないといけませんが、Rainは自動で消してくれるので大丈夫です!
再度同じコマンドを実行します。

$ rain deploy dynamodb.yml 
Deleted existing, empty stack.
CloudFormation will make the following changes:
Stack dynamodb:
  + AWS::DynamoDB::Table MyTable
Do you wish to continue? (Y/n) y
Deploying template 'dynamodb.yml' as stack 'dynamodb' in ap-northeast-1.
Stack dynamodb: CREATE_COMPLETE
Successfully deployed dynamodb

  f:id:swx-tani:20210819225942p:plain       f:id:swx-tani:20210819225952p:plain

DynamoDBのテーブルが作成されたことを確認しました。

削除

$ rain rm dynamodb
Stack dynamodb: CREATE_COMPLETE
Are you sure you want to delete this stack? (y/N) y
Successfully deleted stack 'dynamodb'

まとめ

CloudFormationのテンプレート作成、少しでもめんどうだなと思っている方、
ぜひ一度お試しください。
個人的に雨のアニメーションがかわいくて好きです。