LoginSignup
7
4

More than 5 years have passed since last update.

AWS CloudFormationスタックをCUI(Python Fabric)から操作するライブラリを作りました

Last updated at Posted at 2017-03-05

AWS CloudFormation のスタックを、Python製のコマンドラインツール Fabric を使ってCUIから作成/更新/削除/確認できるライブラリを作りました。

fabricawscfn・・・Fabric task generator for AWS CloudFormation.

AWSリソースの管理には CloudFormation を使う機会が多いですが、AWSコンソールからのGUI操作では手間も多く自動化も難しくなります。
AWS CLIなどのAPIを使うことで自動化できますが、いちいち定型的なスクリプトを書くのも面倒です。

fabricawscfn を使うと、Fabricスクリプト(fabfile.py)でスタックの名前やテンプレートファイルを指定するだけで、スタックを操作するための基本的なタスクが自動的に生成されます。

fabfile.py
from fabricawscfn import *

StackGroup('my-cfn-templates', 'example', 'templates')\
  .define_stack('foo', 'example-foo', 'foo.yaml')\
  .define_stack('bar', 'example-bar', 'bar.yaml', Tags=[{'Key':'example', 'Value':'EXAMPLE'}])\
  .generate_task(globals())

これだけで、スタックの作成/更新/削除/一覧表示/詳細表示などのFabricタスクが自動的に生成されて利用可能になります。

各タスクの実行結果は、基本的にAWSコンソールのUIをそのままCUI化した感じになるようになっています。

$ fab -l
Available commands:

    create_bar         create stack bar.
    create_foo         create stack foo.
    delete_bar         delete stack bar.
    delete_foo         delete stack foo.
    desc_stack         Describe existing stack.
    list_exports       List exports.
    list_resources     List existing stack resources.
    list_stacks        List stacks.
    params             Set parameters. (Applies to all tasks)
    sync_templates     Synchronize templates local dir to S3 bucket.
    update_bar         update stack bar.
    update_foo         update stack foo.
    validate_template  Validate template on local dir.

セットアップ

必要なソフトウェアのインストール

  • Python 2.x と pip をインストールしておきます。
    Python 3.x は動作確認していません。

  • AWS CLI をインストールします。

  • Fabricをインストールします。

    $ pip install fabric

fabricawscfn のインストール

$ pip install git+https://github.com/crossroad0201/fabric-aws-cloudformation.git

使用例

Fabricスクリプト fabfile.py を作成し、前述の例のように fabricawscfn を使ってスタックを定義します。

詳細は GitHubのREADME を参照してください。

スタックの一覧を確認する

$ fab list_stacks
Stacks:
+------------+----------------------+-----------------+----------------------------------+-------------+-------------+
| StackAlias | StackName            |      Status     |           CreatedTime            | UpdatedTime | Description |
+------------+----------------------+-----------------+----------------------------------+-------------+-------------+
| foo        | fabricawscfn-dev-foo | CREATE_COMPLETE | 2017-03-05 04:35:12.823000+00:00 |      -      | Foo bucket. |
| bar        | fabricawscfn-dev-bar |   Not created   |                -                 |      -      | -           |
+------------+----------------------+-----------------+----------------------------------+-------------+-------------+

スタックの詳細を確認する

$ fab desc_stack:foo
Stack:
+----------------------+-----------------+----------------------------------+-------------+-------------+
| StackName            |      Status     |           CreatedTime            | UpdatedTime | Description |
+----------------------+-----------------+----------------------------------+-------------+-------------+
| fabricawscfn-dev-foo | CREATE_COMPLETE | 2017-03-05 04:35:12.823000+00:00 |     None    | Foo bucket. |
+----------------------+-----------------+----------------------------------+-------------+-------------+
Parameters:
+---------+--------+
| Key     | Value  |
+---------+--------+
| Param4  | PARAM4 |
| Param3  | PARAM3 |
| Param2  | PARAM2 |
| Param1  | PARAM1 |
| EnvName | dev    |
+---------+--------+
Outputs:
+--------+-----------------+-------------+
| Key    | Value           | Description |
+--------+-----------------+-------------+
| Bucket | sandbox-dev-foo | Foo bucket. |
+--------+-----------------+-------------+
Events(last 20):
+----------------------------------+--------------------+----------------------------+----------------------+-----------------------------+
| Timestamp                        |       Status       | Type                       | LogicalID            | StatusReason                |
+----------------------------------+--------------------+----------------------------+----------------------+-----------------------------+
| 2017-03-05 04:35:55.694000+00:00 |  CREATE_COMPLETE   | AWS::CloudFormation::Stack | fabricawscfn-dev-foo | None                        |
| 2017-03-05 04:35:53.009000+00:00 |  CREATE_COMPLETE   | AWS::S3::Bucket            | Bucket               | None                        |
| 2017-03-05 04:35:32.308000+00:00 | CREATE_IN_PROGRESS | AWS::S3::Bucket            | Bucket               | Resource creation Initiated |
| 2017-03-05 04:35:31.102000+00:00 | CREATE_IN_PROGRESS | AWS::S3::Bucket            | Bucket               | None                        |
| 2017-03-05 04:35:12.823000+00:00 | CREATE_IN_PROGRESS | AWS::CloudFormation::Stack | fabricawscfn-dev-foo | User Initiated              |
+----------------------------------+--------------------+----------------------------+----------------------+-----------------------------+

スタックを作成する

$ fab create_bar
Creating stack...
  Stack Name: fabricawscfn-dev-bar
  Template  : https://s3.amazonaws.com/crossroad0201-fabricawscfn/example/dev/subdir/bar.yaml
  Parameters: [{'ParameterValue': 'dev', 'ParameterKey': 'EnvName'}]
Waiting for complete...
Finish.

おわりに

  • ここのところ何かちょっとした自動化をするとなると、もっぱら Fabric を使うようになりました。今回もあれこれとトライアンドエラーを繰り返しながらでしたがだいぶ理解が深まりました。
  • CUIで表を出力するPythonライブラリ prettytablle がナイスです。
  • 作ったPythonライブラリを、GitHubから pip で配布できるのが便利。

まだ荒削りで実際のプロダクト開発で使うと細かい改善点が出て来るはずなので、随時改善していきます。

参考にさせていただいたサイト

関連リンク

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4