BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

AWS Lambda から CloudWatch Events を呼ぶ

AWS Lambda から CloudWatch を呼ぶ際の実装メモです。

(2017/10月時点 =.NET Core 1.0しかサポートしてない時点の話です)

Overview

 1 開発環境の準備 (その1)
 2 .NET Core 1.0 対応の .NET Standard 1.6 のクラスライブラリの作成(その1)
 3 簡易なクラスライブラリー実装(その1)
 4 Console プロジェクトの作成(その2)
 5 Autofac の実装(その2)
 6 AWS Labmda プロジェクトの作成(その2)
 7 AWS Labmda の環境変数を読み込む
 8 API Gateway から Lambda - プロキシ統合 の使用とか
 9 AWS Lambda から AWS Lambda の呼び出し
 10 AWS Lambda から CloudWatch を呼ぶ(←今回ココ)

CloudWatch とは

ログやアラーム等の機能がありますが詳しくは、ドキュメントを。

AWS CloudWatch (クラウドおよびネットワークモニタリング)| AWS

今回やりたいこと

CloudWatch Eventsで、イベントを起動(無効から有効に変更する)を AWS Lambda から起動するってお話です。

(CloudWatch Events のイベントなのか、CloudWatch イベントなのかって言い方はさておき...)

イベントからLambdaを起動することは、GUIでできます。各種イベントをトリガーにして実行したりスケジューラーで起動したり。 スケジューラーでの起動は、例えば5分間隔でLambdaを実行したりできますが、25時~26時までの間だけ5分おきに起動とかはできません。

例えばイベントを3つ用意し、

  • イベント1: イベント2を一日に一回(例えば25時に)起動(=有効化)
  • イベント2: 5分おきに特定のLambdaを起動
  • イベント3: 一日に一回(例えば26時に)イベント2を停止(=無効化)

をすると特定のLambdaを25時~26時の間だけ起動することができるなと思い、今回の機能を試しました♪

(ほかにベターなやりかたあるのかな...)

CloudWatch Events の作成

デモ用に AWS のマネジメントコンソールで event-demo1 というイベントを作成しておきました。
(GUIでぽちぽちするだけなので手順は省きます)

f:id:beachside:20171127104721p:plain


プロジェクトの作成

ガチで開発する場合は、以前の記事で書いたようにクラスライブラリで実装して、DIをした方が楽です。

今回はざっくり Lambda のプロジェクトに実装してしまいます。プロジェクトをサクッとつくります。

AWS Labmda プロジェクトの作成

Nuget のインストール

「AWSSDK.CloudWatchEvents」というパッケージをインストールします。VSの上部メニューの ツール > NuGet パッケージ マネージャー > ソリューションの Nuget パッケージ の管理 を開きます。

参照をクリックし、検索に「AWSSDK.CloudWatchEvents」と入力すると対象のパッケージが表示されるのでインストールします。

f:id:beachside:20171127104737p:plain


実装

AmazonCloudWatchEventsClient クラスを使って簡単にアクセスできます。

前提として、キーとかは環境変数とかに埋め込んだ方がいいですし、AmazonCloudWatchEventsClient とかはDIで制御しておいた方がいいです。14行目でメソッドの引数は適当です(デフォルトのまま)

22行目のAmazonCloudWatchEventsClient の初期化の方法はたくさんありますので、状況に合わせて良しなにやればよいです。

実際にイベントを起動している部分は、25行目になります。イベントを無効化しているのは30行目になります。 特に解説するほどのコードでもないですね....。

補足があるとすれば、エラーが起きると HttpStatusCodeで判断ってよりは、SDKがException を吐いちゃいますので、例外処理は実装には注意です。

おわりに

Lambdaのエントリーポイントのメソッドに処理を書くとテストが微妙に面倒なので、以前の記事で紹介したような.NET Standardのクラスライブラリ作って実装した方が色々と効率的だと感じます。

書いてて思いましたが、書くほどの内容がなかった感を感じました...