[レポート] AWS CloudFormation 作成時のベストプラクティス #DOP302 #reinvent 2019

2019.12.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS事業本部 梶原@福岡オフィス(ラスベガスから帰ってきました)です。 AWS re:Invent 2019に参加していました

このエントリではAWS re:Invent 2019で開催されていましたの下記セッションを聴講しましたのでレポートします。また、現時点でYoutubeの方に同セッションもアップロードされておりましたので、以下のリンクから視聴できます。

セッション概要

DOP302 https://www.portal.reinvent.awsevents.com/connect/sessionDetail.ww?SESSION_ID=95555

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.

インフラストラクチャをコードとしてソフトウェア開発プラクティスに組み込むと、チームと組織が品質と稼働時間を犠牲にすることなく自動化とスループットを改善できます。このセッションでは、AWS CloudFormationテンプレートコードを記述、テスト、および保守するための複数のベストプラクティスについて説明します。 IDEプラグイン、再利用性、テストツール、スタックのモジュール化などについて学びます。また、セッション中に、いくつかのベストプラクティスを紹介するサンプルコードを確認し、より多くのコンテキストと明確さを提供します。

スピーカー

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

セッションレポート

アジェンダ

  • Intro to Infrasctucure as Code
  • Authoring
  • Testing
  • Deploying
  • Muliaccount/Mulitiregeon
  • Maintaing

Intro the Infrasctucure as Code

インフラストラクチャー as コードの紹介

  • どのくらいの頻度で本番環境にリリースをしていますか?
    • 2018年
      • 1日当たり複数回: 3%
      • 1週間に1回: 7%
      • 1ヶ月に1回: 19%
      • 四半期に1回またはそれ以下: 57%
      • 新しいOSバージョンまたはミドルウェアが更新された際: 15%
    • 今回はこの状況をもっと良くする方法をお伝えします。

Cloud Formation の概要

  • ハンバーガーの話
    • あなたは1つハンバーガを作るとします。
    • あなたは完璧に同じハンバーガーを作らないといけない。
    • 正確に同じハンバーガをつくることはとても大変な作業。
    • 上手くできたかもしれない。でもいつかミスをする可能性がある
    • 5人のエンジニアからハンバーガが欲しいといわれる正確に全く同じものを。これは無理な作業です。
    • ビルドスクリプトを作成しました。1行からなる4000文字のbashスクリプトを
    • 4年前に会社から去った人が作成しました。多分動作すると思います。
    • 上手くいかない場合はいろいろな人に聞いてまわらないといけない
    • そこで、こういった背景があり、AWS では宣言型の言語、Cloud Fromationを使用してこれらの問題に対応します
  • CloudFormation
    • JSON/YAML で記述する言語です
    • 宣言型の言語です。
    • EC2がどのようなインスタンスなのか、RDSがどのサブネットにあるのか確認できる
    • マクロ機能もあります。もっとハイレベルな言語が必要な場合はCDKがあります
    • CDKではサンプルテンプレートがあり、もっと速く構築することができます
    • CloudFormationはコード

Infrastrcuture as code is code

  • Infrastrcuture as code is code
    • Infrastrcuture as code とはコードです
    • コードとして管理する必要があります
    • 監査をうけまた、ロールバックできる必要があります
    • またどの環境でも動くようにテストする必要があります
    • テストを実施したあとに、実際にデプロイします。
    • おそらく手作業でも上手くいくと思いますが、自動化をやりましょう

Start with a pipeline

  • 自動化を行う際はこのような一般的なパイプラインが使用されます
    • CoddeCommitにpush を行います。
    • CodePilelineがCodeCommitのpusuが検知しビルドステージに進みます
    • CodeBuildでcfn-lint, cfn-nagなどのツールでテストされます
    • そして、ステージング環境、本番環境にデプロイされます。
    • より詳細なテストなどを挟むこともできます。
    • CodeCommit, CodeBuildを使用していますが、Github, BitBucketなども使用できます。
    • またJenkins, Travis CI/CDなどのツールも使用できます
    • より正確にまた継続的なデプロイが求められています

Authoring your template

Picking an editor

  • Visual Stuido Code
  • Sublime Text
  • Atom
  • Cloud9
  • IntelliJ
  • PyCharm
  • その他

Authoring your template

  • CloudFormatonを記述する際はこれらのエディターをお勧めします。
  • シンタックスハイライト、強調表示をしてくれます

Linting your templates

  • CloufFormation記述の際の文法エラーを検出してくれます
  • 複数ファイルをチェックすることが可能です
  • Cfn-lintはGithubで入手でき、300万回以上ダウンロードされています。

Adding autocompete

  • 生産性高める方法として、自動補完機能があります.
  • プラグインとして提供されVisuatulStudio Code またはPyCharmなどで使用できます
  • オートコンプリートで使用するリソースタイプはプロパティファイルを必要とします
  • https://github.com/aws-cloudformation/aws-cloudformation-template-schema

Supercharing your editor

Authging best prattices

  • パラメータセクション
    • テンプレートを再使用可能にするために、固有の値をハードコーディングせずにパラメータにします
    • 最小値、最大値また、正規表現を用いて値を検証することができます。
    • パラメータをグループ化、また説明やラベルを付与することでわかりやすくできます
    • パラメータセクションでは、SSMやSecretManagerの値を使用することができます
    • 機密情報をパラメータに補完しないでください
  • マッピングセクション、 条件セクション
    • リージョンに依存する値(例えばAMIIDなど)
    • 開発環境、検証環境に依存する条件などを設定できます
  • 出力セクション
    • インポートまたエクスポート(クロススタック参照)で使用します。
    • テンプレートを分割し、影響範囲を小さくする場合、クロススタック参照が必要になってきます
    • 顧客が定期的に更新するスタックは別にすることが可能です

Commit your temmplate

  • パイプラインを使って、テンプレートを管理することを進めたい
  • バージョンを管理することで、現在のバージョンを確認することができる
  • また、監査を実施することができる

Testing your templates

how do you test infrastructure?

  • どのようにして、インフラストラクチャーをテストしますか?
    • 通常のテストとはすこし違った考え方が必要になります。

Linting headlessly

  • Cfn-lintはヘッドレスモードで使用できます。
  • テストにはいるまえに、事前に実施することで無駄な労力が減ります

Testing with TaskCat

Deploying

Change sets

  • デプロイする際にはChangeSetsを使用することをお勧めします。
  • ChangeSetsは実際に動作する前に変更内容を確認することが可能です。

Pipelines

  • パイプラインを使用することにより
    • 自動化
    • 安全に(手作業のミスがなく)
    • 再実行可能
    • デプロイするリソースに厳密な制限下の(Lock Down)アクセスすることができる
      • 制限されたロールで実行すれば、意図しない変更を防ぐことができる

Muliaccount/Mulitiregeon

AWS CloudFormation StackSets

  • StacksSetsを使用することで、マルチリージョンまたは複数のアカウントへの適用を行うことができます
  • まだ、GAされていませんが、アカウント作成時に自動デプロイする機能を提供予定です

AWS CloudFormation StackSets use case

  • CloudTrail や IAM, AWS Configなどの共通設定を設定する
  • 開発者、QA、管理者などのIAMアカウントを設定する
  • マルチリージョンの環境を生成する

AWS CloudFormation StackSets best practices

  • 少ない影響範囲で安全に動く事を確認してから、展開してください
  • スピードが優先される場合は同時実行数を上げてください(すべて同時に実行できる(100%)まで可能です。
  • なるべく小さい影響範囲で行うことを心がけてください。

Maintaing

Maintaing your stacks

  • 最初は1つでも少しづつ増えていったとても多くのリソース、スタックを管理するのはとても大変なことです
  • スタックをレイヤーまた、ライフサイクルで分割します。
  • そして環境ごとに再利用可能なようにスタックを作成してください

Refactoring existing stacks

  • リソースインポートの機能を利用して、スタックを分割します。
  • CLIまたはコンソールで作成した、スタック範囲外のリソースを含めるようにします。

Detecting drift

  • テンプレートの値とリソースの値が一致しないことがあります。ドリフト検出で変更を確認することができます
  • 一度テンプレート配下よりはずして、再インポートすることにより状態を一致させることで、スタックとリソースの状態を一致されることができます

Summary

  • ソースをバージョンコントール配下に置く事から始めましょう
  • モダンなエディタや、プラグインを使用します
  • あなたのCloudFormationに最適化しましょう
  • パイプラインを使用します
  • cfn-lint などのツールをパイプラインに組み込みましょう
  • TaskCatを使用します
  • チェンジセットを使用して、実際に展開する前に確認しましょう
  • 再利用をするためにスタックセットをリファクタリングします
  • 小さいテンプレートの方がテストや維持が簡単です。影響範囲も小さく、デプロイ時間も短くなります
  • 大きなテンプレートはリソースのインポートを使用してリファクタリングしましょう
  • スタックセットを使用して、組織的な戦略を行いましょう。

感想

今までは結構大き目なテンプレートで一発な方がわかりやすい気がしていましたが、IaCをすすめていくと、管理するリソースや影響範囲が無視できなくなってきて 限界がきます。最近のCloudFormationのアップデートでリソースインポートが可能になり、この機能を用いることでリファクタリングまた、IaC配下に含めることが可能になりました また、Bestpractisで紹介されたCfn-lint, Cfn-nag, TaskCat、各種プラグインなど便利なツールを試してみたいと思います。

同セッションレポート

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

[レポート] AWS CloudFormationのベストプラクティス #DOP302 #reinvent