CDK初心者がlambda定期実行のインフラコード作成からデプロイまでやるための手順

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がよかったのでこのような書き方になります。
問題なくプロジェクトが作成されていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2092476/8b3685ee-69a1-5ec7-d899-db01ae8c7f57.png)

補足：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コマンドを実行します。
完了すると下記のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2092476/164f84af-6257-f4f5-fbb7-2c3bbe0e5515.png)


## ・作成されたリソースの確認。
実際にawsコンソールで確認してみましょう。
上記でいうとlambdaを確認すれば対象の関数があり、それのトリガーとしてeventBridgeが作成されています。
もし、見当たらない場合には、コンソールの右上に表示されているリージョンが正しいかどうかを確認しまししょう。

以上。