【入門編】AWS CloudFormationのテンプレートを書いてみる


from aws_lambda_powertools.logging.formatter import JSONFormatter class CustomJSONFormatter(JSONFormatter): def format(self, record): log_record = super().format(record) log_record.pop("level", None) # levelを除外 log_record.pop("location", None) # locationを除外 return log_record


はじめに

突然ですが、みなさんAWSの環境構築はどのように実施しているでしょうか。



sam local start-api
は、ローカル環境でAPI GatewayとLambda関数を起動し、実際にリクエストを送信することができるコマンドです。これにより、ローカルでAPIの動作を確認することができます。
一方、 sam local invoke は、ローカルでLambda関数を起動して、指定したイベントをシミュレートし、関数の動作を確認することができるコマンドです。API Gatewayや他のAWSサービスとのインタラクションはシミュレートされません。
つまり、sam local start-api は実際にAPI Gatewayを起動してリクエストを送信できるため、API Gatewayを通じてLambda関数が実行される様子をローカルで確認できます。一方、sam local invoke はLambda関数自体を直接呼び出すため、Lambda関数自体の動作を確認することができますが、API Gatewayを通じた動作を確認することはできません。



普段はコンソールにてEC2やELBなどの設定を1つずつ実施していくと思います。もし、EC2やセキュリティグループの作成要件が何十個もある場合、手作業で行っていくと時間もかかり、ミスも起きるかもしれません。そういうときはCloudFormationの活用を選択肢にいれてみてはいかがでしょうか。CloudFormationはコードでAWS環境が構築できるツールです。
今回はこのCloudFormationについてご紹介させていただきます。

AWS CloudFormationとは?

CloudFormationはプログラミング言語やテキストファイルを使用してAWSリソースを自動で構築するサービスです。所望のAWS環境をテンプレート化しておくことで、同じ環境を作成する時間を削減することができます。CloudFormation特徴としては以下があげられます。

  • AWSリソースを自動で作成できる

  • テンプレートを作成すると、同じ構成を何度も構築できる

  • 利用料金は無料(利用するのに必要なリソース分の料金がかかる)

AWS CloudFormationの使い方

CloudFormationを使用するにはます「スタックの作成」からになります。スタックを作成するためにはリソース情報を記述したテンプレートを準備する必要があります。テンプレートはjsonまたはyamlで記述していきます。

  • テンプレートは分割して作成

  • 規模が大きくなると管理に手間がかかる

  • 変更時の影響も小さくすることができる

  • スタックを削除するとリソースも削除される

テンプレートの作成方法

テンプレートの作成方法は以下の3つあります。

  • クイックスタート
    ・AWSのベストプラクティスに基づいてセキュリティや可用性を考慮してあるテンプレート
    ・15分程度でアプリケーションをAWS上に展開可能

  • サンプルテンプレート&テンプレートスニペット
    ・独自のテンプレートを短時間で作成したい場合使用する
    ・サンプルを用いて独自に作成する際の参考にする

  • 自らテンプレートを作成
    ・JSON、YAML形式でテンプレートをゼロから作成する

導入のしやすさはクイックスタートになりますが、本記事では柔軟性が高い方に注目し、自らテンプレートを作成していく方法について説明させていただきます

テンプレートは以下の要素で構成されます。以下のうちの「Resources」がテンプレートを作成するうえで必須の項目となります。

AWSTemplateFormatVersion:
  "version date"  =>  テンプレートのバージョンを記載
Description:
  "String"  =>  テンプレートの説明文
Metadata:
  template metadata  =>  テンプレートに対する追加情報
Parameters:
  set of parameters  =>  実行時にユーザ入力を求めるパラメータ
Mappings:
  set of mappings  =>  キーと値のマッピング
Conditions:
  set of conditions  =>  条件名と条件判断内容
Transform:
  set of transforms  =>  サーバレスアプリケーションの場合に必要
Resources:
  set of resources  =>  スタックを構成するリソースやプロパティ
Outputs:
  set of Outputs  =>  スタック構築後にCFnから出力させる値

リソースの指定には以下の項目を入力する必要があります。

Resources:
  Logical ID:  =>  論理ID
  Type: Resource type  =>  リソースタイプ
  Description: Set of properties  =>  リソースごとのプロパティ

ここでは、例として以下にEC2インスタンスの作成するときのテンプレートを表示します。「Type」にてEC2インスタンスの作成を宣言し、「Properties」にてAMIを宣言することでOSタイプを指定します。

テンプレートを作成してみる

テンプレートの作成はリファレンスページを参考にして作成しましょう。AWS CloudFormation でサポートされているすべての AWS リソースタイプおよびプロパティタイプのリファレンス情報が含まれています。

Type: AWS::EC2::SecurityGroupProperties:
  GroupDescription: String
  GroupName: String
  SecurityGroupEgress:
    - Egress
  Tags:
    - Tag
      VpcId: String

以下が今回作成するセキュリティグループの設定になります。

セキュリティグループ名  =>  security-group01
説明  =>  test-create
VPC  =>  vpc-xxxxxxxxxxxxxxxxx
インバウンド①  =>  タイプ:SSH プロトコル:TCP ポート範囲:22 ソース:カスタム、xxx.xxx.xxx.xxx/xx
タグ  =>  キー:Name:security-group01

上記内容を組み込んだYAMLファイルは以下のようになります。

AWSTemplateFormatVersion: "2010-09-09"
Description: sg-create
Resources:
  SG1:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      GroupDescription: "test-create"
      GroupName: "security-group01"
      VpcId: "vpc-xxxxxxxxxxxxxxxxx"
      Tags:
        - Key:"Name"
          Value:"secg-01"
      SecurityGroupIngress:
        - IpProtocol:tcp
          FromPort:22
          ToPort:22
          CidrIp : "xxx.xxx.xxx.xxx/xx"

完成です!
上述のコードをCloudFormationに取り入れることで、セキュリティグループが作成されます。


この記事が気に入ったらサポートをしてみませんか?