ウェブサイト検索

CloudFormationを使ってAWSインフラをコーディファイする


CloudFormationは、リソーススタック全体の作成、更新、管理を自動化するためのツールです。これは、インフラストラクチャをコードとして、YAMLファイルの形で表現する方法を提供し、ソフトウェアと共にバージョン管理を行うことができます。

CloudFormationとは何ですか?

CloudFormationの概念は非常にシンプルです---手作業でリソースを作成するのは手間がかかり、CLIやAPIリクエストを使って自動化できますが、将来的にスタックを更新する必要がある場合、結局はほとんど手動のプロセスになるでしょう。この手間を避けるために、CloudFormationはすべてのリソースの構造と設定をモデル化する方法を提供します。

これは、製品スタックに必要なすべての情報を含むYAMLまたはJSONテンプレートを使用して行われます。これには、作成する必要のあるリソース、これらのリソースのパラメーターと設定、およびそれらが返す出力が含まれます。このファイルはGitを介してバージョン管理でき、変更を自動的にプッシュする継続的デプロイメントパイプラインの作成に使用することもできます。

ただし、YAMLテンプレートを手動で作成する必要はありません。CloudFormationのウェブベースの「Designer」を使用する方がはるかに簡単で、製品スタック全体を視覚的に表示します。たとえば、ここにRDSインスタンスをデータベースとして使用するオートスケーリング、ロードバランスのWordPress展開のサンプルテンプレートの1つがあります。

提供されたカタログから新しいコンポーネントをドラッグして出し、コンポーネントをリンクすることができます。ビジュアルテンプレートの更新は、基盤となるYAMLテンプレートを更新します。このテンプレート内のリソースをクリックすると、YAMLリソースリストのエントリに自動的にスクロールします。非常に便利です。

このテンプレートをデプロイすると、それに関連するすべてのリソースがあなたのアカウントに作成されます。スタックの更新が必要な場合、既存のリソースは新しい構成で更新され、使用されなくなった古いリソースは削除され、新しいリソースが追加されると生成されます。

CloudFormationは、依存関係を正しい順序で作成することも処理してくれますので、自分で考える必要はありません。例えば、セキュリティグループを持つEC2インスタンスを作成したい場合、CloudFormationは最初にセキュリティグループを作成し、その後にそのセキュリティグループを使用してインスタンスを作成します。あなたがする必要があるのは、コンソールでそれらをリンクすることだけです。

CloudFormationの主な欠点は、インフラストラクチャのコード化にコミットする場合、完全にコミットしなければならないことです。CloudFormation以外でリソースの設定を手動で変更することは安全ではありません。なぜなら、CloudFormationの更新によって、あなたの手動の変更が上書きされて、テンプレートに記載されている内容が強制されるからです。たとえば、弾力的IPをデプロイして、別のインスタンスに指向させたい場合、EC2管理コンソールではなく、CloudFormationコンソールから行わなければなりません。技術的には、手動の変更は次回のCloudFormationの更新までは持続しますし、その間にテンプレートの設定が変更されなければ、CloudFormationはテンプレートのスキーマを強制しません。したがって、短期的には手動の変更を行うことができるかもしれませんが、それは推奨されず、完全に一時的です。

オンラインエディタの使用

CloudFormationコンソールに移動し、「スタックの作成」をクリックし、「新しいリソースで」を選択します。

これにより、CloudFormationテンプレートを選択するためのダイアログが開きます。既存のテンプレートをS3からインポートすることもできますが、まだ始めたばかりの場合は、サンプルテンプレートの1つを試すことをお勧めします。私たちは、単一のWebサーバーをデプロイするシンプルな「LAMPスタック」テンプレートを選択します。「デザイナーで表示」をクリックして、テンプレートを開いてください。

このテンプレートは非常に基本的です。EC2インスタンスと、そのインスタンスのためのセキュリティグループだけです。

テンプレートに新しいものを追加したい場合、最も簡単な方法はサイドバーでリソースを見つけてドラッグすることです。たとえば、この新しいインスタンスに関連付けるためにElastic IPを追加したい場合は、「EC2」セクションで「EIP」を探し、これをドラッグします:

デフォルトでは、何にも接続されていません。それが効果を持つためには、EC2インスタンスに接続する必要があります。紫色の点はプロパティです。これらのプロパティからドラッグして、他のリソースへのリンクを形成できます。Elastic IPをリンクするには、上部のコーナーにある「EIPAssociation」をインスタンスにドラッグします。ドラッグ中に互換性のあるリソースは緑色にハイライトされます。

リソースをクリックすると、YAMLテンプレートのエントリに移動します。このテンプレートに対する変更はデザイナーに反映されますが、右上隅のリフレッシュボタンを押す必要があるかもしれません。

YAMLフォーマット

全体として、YAMLテンプレートにはいくつかの異なるセクションがあります:

メタデータ、主にCloudFormation Designerによって視覚的に物の位置を追跡するために使用されますが、一般的なメタデータとしても使用できます。

パラメータ、CloudFormationコンソールに渡され、実行時にテンプレートに渡すことができる引数です。たとえば、デフォルトのテンプレートには、MySQLデータベース名、ユーザー名、パスワードを指定するためのいくつかのパラメータが含まれています。

DBName:

Default: MyDatabase

Description: MySQL database name

Type: String

MinLength: '1'

MaxLength: '64'

AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*'

ConstraintDescription: must begin with a letter and contain only alphanumeric characters.

マッピングは少し複雑ですが、基本的にはcaseステートメントのようなものです。キーに基づいてパラメータの値を変更するために使用できます。例えば、AWSは、このマッピングを使用して、テンプレートがデプロイされるリージョンに基づいてAMI IDを変更します。Fn::FindInMapの内蔵関数を使用して、テンプレート内の他の場所でこれらの値を検索できます。この件については、AWSのドキュメントをもっと読むことをお勧めします。

Mappings: 

RegionMap:

us-east-1:

"HVM64": "ami-0ff8a91507f77f867"

us-west-1:

"HVM64": "ami-0bdb828fd58c52235"

eu-west-1:

"HVM64": "ami-047bb4163c506cd98"

ap-southeast-1:

"HVM64": "ami-08569b978cc4dfa10"

ap-northeast-1:

"HVM64": "ami-06cd52961ce9f0d85"

条件は、CloudFormationが条件が満たされた場合にのみリソースをデプロイできるようにします。たとえば、特定のリソースを本番、テスト、ステージング環境でデプロイできますが、開発環境ではデプロイできません。

Conditions: 

CreateProdResources: !Equals [ !Ref EnvType, prod ]

トランスフォームは、テンプレートが展開される前にカスタム処理を行うことを可能にします。これは少しニッチな機能ですが、SAMがLambda関数を展開するために使用します。これを手動で設定する必要がありますので、名前を呼び出してください:

Transform: [MyMacro, AWS::Serverless]

出力は、スタック間でリソースをリンクさせたり、単に応答を返すことを可能にします。これらは、公開変数とプライベート変数のように考えることができます。

Outputs:

BackupLoadBalancerDNSName:

Description: The DNSName of the backup load balancer

Value: !GetAtt BackupLoadBalancer.DNSName

Condition: CreateProdResources

InstanceID:

Description: The Instance ID

Value: !Ref EC2Instance

最後に、リソースについてです。これは単にテンプレート内のすべてのリソースの配列です。使用しているものによって大きく異なる場合があります。各サービスには独自のプロパティがあるためです。例えば、カスタムAMIを使用したEC2インスタンスは次のように見えるかもしれません:

Resources:

MyEC2Instance:

Type: "AWS::EC2::Instance"

Properties:

ImageId: "ami-0ff8a91507f77f867"

使用している特定のサービス、またはリソースとプロパティのリファレンスに関する詳細情報については、AWSの完全なスキーマリファレンスを参照できます。

関連記事: