「AWS無料相談会」をオンラインで開催中

Amazon CloudWatch SyntheticsをCloudFormationで構築する

  • 2020.08.18
  • AWS

毎日リングフィットアドベンチャー生活で徐々に体型が変化してきました、
やっさんです。

Amazon CloudWatch Synthetics(以下、Synthetics)をCloudFormationで構築してみましたので、構築する際のヒントなどを書き綴っていきます。

Syntheticsとは

SyntheticsはREST API, URL, ウェブサイトコンテンツを監視するためのサービスです。CloudWatch アラームと連携し、監視結果に問題があればアラートを発することが可能です。VPCオプションが用意されており、VPCネットワーク内に閉じたコンテンツを監視できます。

SyntheticsをCloudFormationで構築する際のヒント

Syntheticsは比較的新しいサービスであるため、ハマりどころが多いです。CloudFormationでリソースを構築するにあたってのヒントを共有したいと思います。

1. Syntheticsのリソース構成

Syntheticsは複数のAWSリソースを組み合わせたサービスになります。
以下のリソースが作成されます。

  • Synthetics
  • IAMロール
  • S3バケット
  • Lambda
  • Lambda レイヤー

SyntheticsはLambdaを呼び出し、Lambdaはレイヤーに保管されたスクリプトを実行しますので、Lambdaは汎用的なSynthetics用リソースになり、ユーザーが作成したスクリプトの実体はレイヤーに保管されています。

2. ユーザー作成スクリプトをCloudFormationテンプレートで指定する方法

ディレクトリ構成を守る

CloudFormationテンプレートでユーザー作成スクリプトを指定する方法は以下の2種類があります。

  • S3バケットとキー名を指定する
  • テンプレートにコードを直書きする

テンプレートにコードを直書きする ことは運用上あまり利用しないと思いますので、 S3バケットとキー名を指定する 方法を見ていきましょう。S3バケットの場合は圧縮されたzipファイルを指定する必要があります。zipファイルにユーザー作成スクリプトを格納すればよいのですが、 ディレクトリ構成 を意識する必要があります。Lambdaレイヤーで利用されることを意識したディレクトリ構成である必要があります。

具体的には、以下のディレクトリ構成になります。

zipファイル
└ nodejs
  └ node_modules
    └ ユーザー作成スクリプトファイル

正しいディレクトリ構成でないと、ハンドラーが見つからない旨のエラーが発生してしまいます。

Lambdaハンドラーを正しく指定する

Lambdaハンドラーの指定方法は ユーザー作成スクリプトファイルのファイル名.ハンドラー名 になります。例えば、ファイル名が apiCanaryBlueprint.js 、ハンドラー名が handler だとします。この時のソースコードは以下のようなイメージです。

const apiCanaryBlueprint = async function () {
    // 処理内容
};

exports.handler = async () => {
    return await apiCanaryBlueprint();
};

この場合にLambdaのハンドラーは以下のようになります。

apiCanaryBlueprint.handler

正しくLambdaハンドラーを指定しないとデプロイ後にハンドラーが見つからないというエラーが発生してしまいます。

YAMLのサンプル

上記気を付ける箇所を反映したYAMLファイルは以下のようになります。

YAML例:

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  Synthetics:
    Type: AWS::Synthetics::Canary
    Properties:
      ArtifactS3Location: s3://test-artifact-bucket
      Code: {Handler: apiCanaryBlueprint.handler, S3Bucket: test-bucket, S3Key: file.zip}
      ExecutionRoleArn: 'arn:aws:iam::xxxxxxxxxxxx:role/service-role/role-name'
      Name: cfncanarytest
      RuntimeVersion: syn-1.0
      Schedule: {Expression: 'rate(30 minute)', DurationInSeconds: 3600}
      StartCanaryAfterCreation: false

ユーザー作成スクリプトをCloudFormationで更新する方法

CloudFormationテンプレートは、テンプレートファイルに変更がないと更新がないと判定されてしまいます。では、CloudFormationでユーザー作成スクリプトを更新するにはどうすればよいのかといいますと、 ユーザー作成スクリプトの更新ファイルをS3に配置するスクリプトを組んで、テンプレートファイルの S3Key も変更する という手段があります。

S3Keyを更新した場合の記述例:

      Code: {Handler: apiCanaryBlueprint.handler, S3Bucket: test-bucket, S3Key: file_updated_20200818.zip}

Synthetics完全に理解した

Syntheticsはまだまだ運用系のナレッジが世に出ていない感覚があります。少しでも運用のためのノウハウ収集の一助となれば幸いです。