aws cdkでEventBridge,lambdaのインフラコードを書きたい。
ので、手探りで手順をまとめてみました。
・aws cdkとは
手始めにcdkを理解しようと思いまして、改めて下記ページを読み、ざっくりまとめました。
https://aws.amazon.com/jp/cdk/
いわゆるインフラコードを自分の慣れた言語を使用して定義するためのフレームワーク。
CDkではEventBridgeを使ってリソースをプロビジョニングできる。
利点
・クラウドへの簡単デプロイ
・カスタマイズ、共有可能(コードなので)
想定しているもの。
EventBridgeのスケジューラでlambdaを定期実行する。
・目次
・cdk のプロジェクトを作成
・EventBridge、Lambdaの書き方
・デプロイについて
・デプロイ後のlambdaが動いてるかの確認。
・cdk のプロジェクトを作成
まずはcdkのコマンドが使えるように、グローバルのオプションをつけてインストールする。
npm install -g aws-cdk
この時自分は最初は怒られました。
npm WARN notsup Unsupported engine for aws-cdk@2.12.0: wanted: {"node":">= 14.15.0"} (current: {"node":"12.16.1","npm":"6.13.4"})
この場合、
バージョン1系であればインストールできるので、バージョンを指定してインストールするか -> バージョンを指定する場合は、npm install -g aws-cdk@1.xx.xなどmoduleの後ろに@でバージョンを指定します。
nodeのバージョンを上げてからCDKをインストールするか。
自分はnodeのバージョンを上げました。
今度は問題なくインストールできました。
added 212 packages, and audited 213 packages in 4s
found 0 vulnerabilities
次に、肝心のプロジェクト作成ですが、下記コマンドになります。
プロジェクト管理する適当なディレクトリで
cdk init app --language typescript
自分はtypescriptがよかったのでこのような書き方になります。
問題なくプロジェクトが作成されていることが確認できました。
補足:typescriptをインストールしていない方はこのタイミングでinstallしときましょう。
npm install -g typescript
・EventBridge、Lambdaの書き方
基本的にはこのlib配下のxxx-stack.tsにあれこれ手を加えていくことになります。
下は手を加えたあとになります。
加えた内容
・aws-events,aws-event-target
import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as events from "aws-cdk-lib/aws-events";
import * as target from 'aws-cdk-lib/aws-events-targets';
import * as lambda from 'aws-cdk-lib/aws-lambda';
export class EventLambdaStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
// lambdaの作成
const lambdaFunction = new lambda.Function(this, 'lambdaの名前', {
runtime: lambda.Runtime.NODEJS_12_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('./lambda'),
});
// eventのtargetとして上記のlambdaを定義
const eventTarget = new target.LambdaFunction(lambdaFunction);
// eventのルールを指定
const eventRule = new events.Rule(this, 'eventの名前', {
schedule : events.Schedule.cron(
{
minute:'0',
hour:'9',
weekDay:'MON-FRI',
month:'*',
year:'*',
}
),
});
// eventのルールにターゲットを指定
eventRule.addTarget(eventTarget);
}
}
※スタックの概念について(ちょっと横道)
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/stacks.html
「スタックは、単一のユニットとして管理できる AWS リソースのコレクションです。」
と、説明があります。
つまり、単一のECSやEC2、DBなどのリソースを指すのではなく、システムとしてのリソース群。
ようは、管理しやすいように自分で何を含めるかは考えてね、ってことだと理解しました。
※スケジュールの指定方法について
macなどでもcronなどが使えるがそれと同様の指定の方法。指定方法は下記の公式リンクを参照
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html
最初、上記のようにweekdayを指定しつつ、day:'?'も指定していましたが、weekdayとdayはどちらかしか指定できないとおこられました 。
私の場合には、月曜日から金曜日の18:00(JST)で実行してほしいので上記の値になります。指定の時間はUTCになります。
このほかにも、5分おきに実行、火曜日だけ実行など、さまざまな指定の方法があります。
・デプロイについて
上記のようにコードの準備は完了しました。
以下の手順でデプロイしてみましょう。
cdk list
これを実行すると、今回デプロイするstackの中のリソースの一覧が表示されます。
cdk deploy
次は実際にデプロイするためのコマンドですが、その前に以下の2点をご確認ください。
・.awsのcredentialに認証情報が記載されているか。
-> aws上にリソースを作成するので、当然認証のステップがあります。その際には、上記であげたローカルのファイルの認証情報を元に認証を行います。詳しくは下記をご覧ください。
https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html
・cdkを実行するための環境がaws上に構築されているか。
-> cdkを実行するには、cloudformationなどを取り扱う環境が必要になります。その環境を構築するのにcdk bootstrapというコマンドを実行します。
環境がなければ作成してくれます。
詳細はこちらの「環境の初期構築」をご覧ください。
https://catalog.us-east-1.prod.workshops.aws/workshops/99731164-1d19-4d2e-9319-727a130e2d57/ja-JP/20-typescript/20-create-project/500-deploy#
上記二点が確認できて、cdk deployコマンドを実行します。
完了すると下記のように表示されます。
・作成されたリソースの確認。
実際にawsコンソールで確認してみましょう。
上記でいうとlambdaを確認すれば対象の関数があり、それのトリガーとしてeventBridgeが作成されています。
もし、見当たらない場合には、コンソールの右上に表示されているリージョンが正しいかどうかを確認しまししょう。
以上。