【レポート】AWS で始める Infrastructure as Code #AWS-31 #AWSSummit

AWSサービスのコード管理、IaCをまさにこれから検討しようとする人にはぴったりのセッションでした
2021.05.17

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

ちゃだいん(@chazuke4649)です。

AWS Summit JAPAN 2021 のセッションレポートです。今回は、AWS CloudFormation と AWS CDK に関するセッションを紹介したいと思います。

AWS Summit Online 2021 - 5/31までオンデマンドで公開中!| AWS

セッション概要

インフラストラクチャのコード管理(Infrastructure as Code, IaC)にソフトウェア開発手法を取り入れることで、品質や稼働時間を犠牲にすることなく、自動化と開発効率を向上させることができます。このセッションでは AWS CloudFormation と AWS Cloud Development Kit (CDK)による AWS 環境におけるコード管理を取り扱います。テンプレートコードの記述・テスト・保守のベストプラクティスについて解説し、更に統合開発環境のプラグインや再利用性、テストツール、スタックのモジュール化などについて学んで頂きます。

スピーカー

アマゾン ウェブ サービス ジャパン株式会社 技術統括本部 技術推進本部 テクニカルソリューション部 ソリューションアーキテクト 木村 友則氏

セッションページURL

https://summits-japan.virtual.awsevents.com/media/AWS%20%E3%81%A7%E5%A7%8B%E3%82%81%E3%82%8B%20Infrastructure%20as%20Code(AWS-31)/1_4zquduru

セッション内容

Agenda

  • AWS環境におけるコード管理とは
  • AWS CloudFormation で行うコード管理
  • AWS CDK で行うコード管理
  • 何から始めれば良いか

AWS環境におけるコード管理とは

クラウドアプリケーションの管理には、リソースのライフサイクル管理が含まれる。クラウドの場合、アプリケーションとインフラを同じライフサイクルで管理できるのがクラウドのメリット。 リソースのライフサイクル管理の方法

  • AWSマネジメントコンソール
  • AWS CLI
  • AWS SDKs
  • AWS CloudFormation

  • スタックをデプロイするためのテンプレート(スタック = リソースの集合体)

  • 複製、際デプロイ、再使用可能
  • インフラストラクチャとアプリケーションを同じ手法で管理が可能
  • デプロイに失敗した場合、正常な状態にロールバックできる

なぜコード管理が必要なのか?

  • アプリケーションはデプロイの自動化・簡易化を行っているのに、AWS環境の構築は手作業のまま
  • 環境を複製するときも、手順書を見ながら同じ作業の繰り返し
  • 構成情報がわからなくなってしまって、変更の影響が把握しづらくなってきている

あるある:前任者からシステムを引き継いだ後、構成図などは見つかったものの、構築後の設定変更が反映されておらず、結果環境を一つ一つ点検していかなければならない

コード管理を「目的」にしないために

皆様は何を目的にコード管理を検討されていますか?

  • アプリケーションのようにテストからデプロイまでを自動化すること
  • 環境の複製を容易にすること
  • 構成情報を把握できていないシステムを生み出さないこと etc

AWS CloudFormation で行うコード管理

コードのイメージ

CloudFormationのリソース

  • テンプレート: リソースを定義
  • チェンジセット: 影響範囲を確認
  • スタック: リソースの集合体

CloudFormation とは

  • テンプレートには、各リソースのある冪乗タオを宣言的に定義
  • CloudFormationは、定義された構成をAPI呼び出しに読み替える
  1. コードを定義する
  2. アップロードしチェンジセットを確認する
  3. スタックを作成し、チェンジセットを実行する
  4. 様々なリソースをスタックとして、管理していく

CloudFormationを使う利点

  • リソースの構成を、「あるべき状態」として定義できる
    • 例)「仮想サーバを1台追加」ではなく、「仮想サーバが1台存在している状態」
  • 安定的なAWS環境のデプロイ
    • 適切な構築順序、作業ミスや認識誤りを防ぐ
  • StackSetsによるマルチアカウント/マルチリージョンにデプロイが容易
    • 単一のテンプレートで多数のリソースを安全に管理可能
  • 定義からドリフト(差異)を検出できる
    • 手作業で行った変更をテンプレートに反映するために役立つ

テンプレートを効率的に作成するには

Linter

Linterを使ってCloudFormationの間違いに爆速で気づく | DevelopersIO

Former2

3rdパーティのFormer2を使用することで既存リソースからCloudFormationテンプレートを出力してくれるので、比較的簡単にコード管理に移せる

知らなかった事を後悔した。既存のリソースからCloudFormationのテンプレート生成 Former2 の紹介 #reinvent 2019 | DevelopersIO

テンプレートのコンプライアンス

テンプレートがポリシーを満たしているかどうかを確認する

  • ポリシーコンプライアンスをチェックする CloudFormation Guard
  • リソースが満たすべき条件を指定してチェックする
  • cfn-guard-rulegen コマンドで、テンプレートからルールの雛形を生成
  • cfn-guard コマンドでチェック実行
  • Lambdaで実行可能なライブラリもあり、パイプラインを組みやすい

デプロイ前のコンプライアンスチェック!CloudFormation Guardを試してみた | DevelopersIO

ベストプラクティス:スタックの分割方針

テンプレートの巨大化を防ぐために、スタックを整理する

ベストプラクティス:クロススタック参照

例えば、下位レイヤのベースネットワークのテンプレートで サブネットIDを Exportし、上位レイヤのフロントエンドのテンプレートのALBで Import し、スタックをまたいだ値の参照を実現する

ベストプラクティス:リファクタリング

テンプレートの管理範囲の適正化、ドリフトの是正を行う

  • リソースのインポートによって、リソースをより適切なスタックに移動する
  • テンプレートの修正前に、ドリフト検出を適用し、スタック更新の失敗を防ぐ
  • ドリフト検出されたリソースを再インポートすることで差異を修正する

ベストプラクティス:機密情報の動的な参照

SSMパラメータストアやSecrets Managerを使用して、機密情報をテンプレートに埋め込まない

CloudFormation レジストリとCLI

AWS以外のリソースのリソースでも、Resource Provider を開発し、CloudFormation レジストリに登録することで、スタックによる管理が可能

AWS CDK で行うコード管理

まずはコードサンプル

CDK とは

AWS環境を一般のプログラミング言語で記述できるツールキット

一般のプログラミング言語であるため、エディタによる強力なサポート(コード補完など)の恩恵を受けられる

CDKの主なコンポーネント

  • Core Framework
    • CDKを構成する基本要素
    • App: 最上位要素。複数のスタックとその依存関係を定義
    • Stacks: デプロイ可能な最小単位。CloudFormationスタックと同義
    • Rreserces: AWSリソース群
  • AWS Construct Library
    • CDKアプリケーションの基本要素。クラウドコンポーネントを表す
  • AWS CDK CLI
    • CDKアプリケーションを操作するツール。CloudFormationテンプレートを生成、デプロイする

Constructからクラウドへ

Construct

  • L1 - CloudFormationの全ての仕様が含まれる
    • CloudFormationの仕様に基づき自動生成される
    • CloudFormationがサポートしたリソースはCDKでもすぐに使用可能
  • L2 - 推奨するデフォルトを採用した高レベルの抽象化
    • CDKチームが特定のユースケースのために開発
    • 適切なデフォルトとセキュリティポリシーのベストプラクティスを含む
    • ただし、存在しないリソースもある(無理にL2を使わず、L1でもいい)
  • L3 - 複数のAWSサービスを使用する一般的なアーキテクチャ
    • 特定のユースケースのためにアーキテクチャ全体を構成する複数のリソースを含む

ApplicationLoadBalancerdFargateService

その名の通り、下図のような構成が、3行のコードでデプロイ可能

CDK と CloudFormation コード比較

CDK 高水準言語でコンパクトな表現が可能。言語に合わせたツールや機能の活用が可能。ただし開発のためにプログラミングの知識が必要。

CLoudFormation 宣言型のYAMLフォーマットは、理解・使用しやすい。ただし命令型の機能が少なく、冗長な表現になる可能性がある。

AWS環境のコード管理

コード管理との付き合い方

  • 100%を目指さない。コード化できないもの、しないものがあって良い
    • 全てを CloudFormation、CDKだけで管理しようとしない
    • 構成ではなく、環境操作の手続きを定義する場合は、CLIやシェルスクリプトを使う
  • 巨大にしない。適切なサイズ・範囲に分割する
    • 大きすぎるものは把握しづらい
    • 修正するときの影響範囲も大きくなりがち
  • 大事なこと
    • みなさまの状況・立場に合わせて、コード化の要否を判断してください
    • コード管理する目的はなんですか?どんな課題を解決したいですか?に立ち帰って考える

これから始めようとする方へ

AWS Hands-on for Beginners - AWS 環境のコード管理 AWS CloudFormationで Web システムを構築する | AWS

さらに詳しく知りたい方へ

終わりに

CloudFormation と CDK を1つのセッションでそもそもコード管理を検討する背景からコンパクトに説明された良いセッションでした。AWSのコード管理をこれから検討しようとする人にはぴったりのダイジェストだと思います。詳細はぜひ本セッションや公式資料も合わせてご覧ください。

それではこの辺で。ちゃだいん(@chazuke4649)でした。