EventBridge スケジュールでLambdaを定期実行する

# 目次
1. はじめに
1. CloudWatch ロググループ作成
1. Lambdaを用意する
    1. ポリシー、ロールの作成
    1. Lambdaの作成
1. EventBridge スケジュールの設定
    1. ポリシー、ロールの作成
    1. スケジュールの作成
1. 動作確認
1. 最後に


# はじめに
最近、知識をアウトプットできていなかったので、今年からちょこちょこやっていきます！
手始めに簡単なところからということで、最近触れているAWS関連の記事です。
ほかに同じような内容の記事があるかもしれませんが、できるだけ差別化できるように努力しますので、ご容赦ください。

# CloudWatch ロググループ作成
ではでは、早速やっていきましょう。
まずは、Lambdaの動作確認のために、CloudWatch ロググループを作成していきます。
設定は以下です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209767/92d1aafe-7daf-7e16-8ac1-4cae8d1b0668.png)

# Lambdaの用意
次はLambdaの用意ということですが、Lambda作成にあたって必要なポリシー、ロールから、まずは用意していきます。
**今回必要な権限は、LambdaがCloudWatchにログを出力する権限です。**
先ほど作成した、ロググループにLambdaのログを出力するための権限になります。

## ポリシー、ロールの作成
ポリシーの作成を行っていきます。
AWSが事前に用意しているものを使ってもよいですが、多くの場合、権限を与えすぎてしまうため、最小限の権限にとどめるために、今回は新規作成いたします。
与える権限は以下です。
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "createLogs",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:ap-northeast-1:アカウントID:log-group:/aws/lambda/test-lambda-event-bridge:*"
        }
    ]
}
```
ログ出力だけであれば、`CreateLogStream`、`PutLogEvents`だけで問題ないです。
そしてできたのが、以下ポリシーです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209767/2431e82a-b1c9-37d5-0e80-e9cc8c0397e3.png)


次は、ロールの作成です。
今回は、Lambdaに付けるロールなので、「信頼されたエンティティを選択」では、以下設定を行います。
- 信頼されたエンティティタイプ：AWSのサービス
- ユースケース：Lambda

そして、「許可を追加」では、先ほど作成したポリシーを追加してあげます。
あとは、名前を設定をして、作成！
以下のようにロールが完成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209767/9fa43624-7bad-f01f-a27c-836ee93f989f.png)

## Lambdaの用意
ポリシー、ロールができたので、以下設定でLambda関数作成していきます。
- ランタイム：Node.js 20.x
- アーキテクチャ：arm46
- アクセス権限：既存のロールを使用する（先ほど作成のロールを選択）

コードは動作確認ができればよいので、consoleに出力する処理だけ書きました。（後ほど少しアレンジしていきます。）
```js
export const handler = async (event) => {
    console.log("実行しました")
};
```

さて、Lambdaが作成できたので、テスト実行してみましょう。
テストの際は、テストイベントの設定が必要です。
以下の設定で作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209767/01318dd7-7040-87c7-01a6-4e9eda56292a.png)

実行後、ログがCloudWatchに作成されているので、成功です！
ログの出力値も確認できました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209767/3d0c25cc-df30-d0d4-e047-c882d9144b09.png)

# EventBridge スケジュールの設定
では、作成したLambdaを定期実行するスケジュースを作成していきます。
が、その前に、EventBridgeからLambdaを実行するポリシー、ロールの作成をしていきましょう。

## ポリシー、ロールの作成
Lambdaを実行するポリシーを作成します。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "invokeLambdaFunction",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:ap-northeast-1:アカウントID:function:test-lambda-event-bridge"
        }
    ]
}
```

ロールも作成し、先ほどのポリシーをアタッチします。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "admitEventBridge",
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209767/ac87eeb0-780b-8434-3b68-4c451957a06e.png)

## スケジュールの作成
ポリシー、ロールができたら、いよいよメインのスケジュースを作成していきます。
設定一覧は以下です。

- スケジュールの詳細の指定
    - スケジュール名：test-event-schedule
    - 説明：任意
    - スケジュールグループ：default
    - **スケジュールパターン：定期的なスケジュール**
    - **cronベースのスケジュール**
        - **cron ( 0 18 * * ? * )**
    - フレックスタイムウィンドウ：オフ
    - **タイムゾーン：Asia/Tokyo**
- ターゲットの詳細
    - **AWS Lambda Invoke**
    - **Lambda関数：先ほど作成したLambda**
    - **ペイロード：`{"greeting": "Hello"}`**
- 設定 - オプション
    - スケジュールを有効化
    - 再試行ポリシー：OFF
    - **アクセス許可**
        - 既存のロール使用
        - ロール名：先ほど作成したロール


ざっくりポイントを説明しますと、
- 今回定期実行ということで、**スケジュールパターン：定期的なスケジュール**を選択
- スケジュールの設定は、**cron式**を今回選択しました。今回は17:45に設定しています。
    - 時間を設定すると、以下画像のように直前10回の実行時間が表示されますので、そちらを参考に自分が想定しているような設定ができているか確認するとよいと思います。
    - 値の設定はこちらの記事を参考にしています。（参考：[cron 式のリファレンス](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-cron-expressions.html)）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209767/1390187c-7870-6c08-a7f1-4717de6bcdbd.png)

- スケジュールということで、タイムゾーンも指定できます。今回は、**日本時間**で設定。
- ターゲットでは、LambdaのInvoke APIを使用し、先ほど作成したLambdaをターゲットに設定。ペイロードとは、Lambda実行の際に渡せる引数です。渡せているか確認するため、適当な値を設定（後ほど確認）
- アクセス許可で、先ほど作成したEventBridgeのためのロールを指定する。


# 動作確認
スケジュールができたので、動作確認をしてみましょう。
その前に、Lambdaのコードを少し修正。
```js
export const handler = async (event) => {
    console.log("実行しました", event)
};
```
ペイロードで渡した値が、取れているかの確認のため、少し修正しました。


・・・さてさて、時間になったのでCloudWatchを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209767/085fd6ba-b242-b51b-d1dc-0b5d7c5c10a6.png)


おお！
起動していますね～
ペイロードの値も確認できました。成功です。
やったー！！！

# 最後に
さらっと書くつもりでしたが、思ったより長くなってしまいましたw
分かりやすいと思っていただければ幸いです。
これからは、もっとアウトプットする機会を増やせればと思います。
最後まで読んでいただきありがとうございました。