[レポート] AWS CloudFormation を作成するためのベストプラクティス #DOP302 #reInvent

2019.12.04

こちらはラスベガスで開催されている AWS re:Invent2019のセッション Best practices authoring AWS CloudFormation のレポートとなります。

目次

  1. セッション情報
  2. Infrastructure as code のイントロダクション
  3. テンプレートの作成
  4. テスト
  5. デプロイ
  6. マルチアカウント/マルチリージョン
  7. スタックの管理
  8. 所感

セッション情報

Incorporating infrastructure as code into software development practices can help teams and organizations improve automation and throughput without sacrificing quality and uptime.

In this session, we cover multiple best practices for writing, testing, and maintaining AWS CloudFormation template code.

You learn about IDE plug-ins, reusability, testing tools, modularizing stacks, and more.

During the session, we also review sample code that showcases some of the best practices in a way that lends more context and clarity.

▼意訳

  • Infrastructure as Code(IaC) をソフトウェア開発の手法まで落とし込むことで、 (クオリティや稼働時間の消費なしに) 自動化とスループット の改善が可能になる
  • このセッションでは AWS CloudFormationテンプレートコードの 記述・テスト・メンテナンス のベストプラクティスを複数紹介する
  • セッションで学習すること
    • IDEプラグイン
    • 再利用性を高める
    • テストツール
    • スタックのモジュール化

▼スピーカー

  • Olivier Munn: Sr Product Manager Technical, Amazon Web Services
  • Dan Blanco: Developer Advocate, Amazon Web Services

Infrastructure as code のイントロダクション

ざっくりとした AWS CloudFormation(CFn) の説明

  1. YAML/JSON のコードを書く
    • 直接編集する
    • or SAM、マクロを使う
    • or 高級な変換 (CDK) を使う
    • or サンプルテンプレートを使う
  2. テンプレートをアップロードする
    • マネジメントコンソール(from S3)経由
    • or Pipeline
  3. スタック(スタックセット)を作成する
    • スタック … マネジメントコンソール もしくは CLI, AWS SDKで作成
    • スタックセット … 複数アカウント/リージョンに作成
  4. 作成と管理
    • スタック、スタックセット
    • AWSリソース

Infrastructure as code

▼ 各要素で必要なこと・もの

  • Source: テンプレートと設定のバージョンコントロール
  • Build: 静的解析とテスト
  • Test: 統合テストを行う環境
  • Promote: 実際の環境へのデプロイ

まずパイプラインで始めよう

  1. テンプレートを作成して git push
  2. AWS CodeCommit → CodePipeline → CodeBuild
    • cfn-lint(後述)でチェック
    • TaskCat(後述) でチェック
  3. CloudFormation
    • チェンジセットの作成
    • スタック/スタックセットの作成

テンプレートの作成

まずはエディターを選ぼう

  • Visual Studio Code
  • Sublime Text
  • Atom
  • Cloud9
  • IntelliJ
  • PyCharm

cfn-lint でシンタックスチェックする

  • Atom, Visual Studio Code, Sublime, VIMなどにプラグインがある
  • 複数ファイルを取り扱い可能
  • GitHub で利用可能。 3,000,000ダウンロード

自動補完機能を追加する

aws-cloudformation-template-schema

  • Visual Studio Code/PyCharm で動作
  • リソースタイプと必要なプロパティを自動補完
  • リソースタイプのドキュメント参照へのリンク機能
  • など

エディタ環境を更に快適に

▼ Visual Studio Code の例

テンプレート作成のベストプラクティス

Parameters

  • ハードコーディングを避ける
  • 代わりに AWS Systems Manager Parameter Store, Secrets Manager を使う

Mappings

  • さまざまな環境の情報・リストをメンテナンスするのに有効

Conditions

  • シンプルな if/then 文にする

ほか

  • Imports/exports の利用
  • !Sub の利用
  • 最新のAMIの取得に SSM Parameter Store を利用

テスト

cfn-lint

cfn-python-lint

  • 文法ミスの発見
  • プルリクエスト, OSSプロジェクトなどで特に活躍

taskcat

taskcat

  • AWS QuickStart team が制作
  • オープンソース
  • シミュレーション上でマルチリージョンに複数スタックを生成してテンプレートを検証
  • 1テンプレートだけでは自明でない問題を発見できる
  • スタックセットに特に有効

デプロイ

変更セット(Change sets)

  • 作成/変更/削除されるリソースを確認

パイプラインの利用

  • AWS CodeCommit, CodePipeline, CodeBuild

マルチアカウント/マルチリージョン

スタックセットの利用

  • 最近のアップロード 1: スタックセット、インスタンスの上限緩和 ( 100スタックセット・2,000 インスタンス)
  • 最近のアップデート 2: Organizational Unit(OU) 内の新規アカウントへの自動的デプロイ
  • 最近のアップデート 3: OU経由の信頼関係の自動管理

スタックセットのユースケース

  • 新規アカウント追加の際に 必ず前もって必要なリソース を作成
  • 共通の目的 を持った複数のアカウントのセットアップ
  • マルチリージョン/アカウントに 水平展開した リソースのコントロール

スタックの管理

スタックを分け方、利用方法

  1. レイヤー、ライフサイクル でスタックを分ける
  2. 環境ごと にスタックを再利用
    • Dev, Test, Stage, Prog

既存リソースをインポート

こちら最近のアップデートですね。

【アップデート】ついに来た!CloudFormationで手動で作成したリソースをStackにインポート可能になりました

ドリフトの検出

  • 想定していた設定値と実際のリソースの設定値に差異がないかチェック

所感

そもそものテンプレートの効率的な書き方から始まり、 テンプレートのテスト方法、デプロイプロセスの説明、 さらにスタックセットの説明と CloudFormationを網羅的に学習できるセッションでした。

特に 複数スタックをテストしてくれる TaskCatは初めて聞きました。触ってみようと思います。

以上、 re:Invent2019 セッションレポートでした