Lambda関数新規作成〜テスト実行

読みにくい、間違い等ありましたらご指摘いただけますと幸いです。

## 対象読者
- LambdaとCloudWatchがどんなものかなんとなく分かっているけど、
    - どのように実装していくか分からんという方
    - どういう時に使うのか分からんという方

## 事前準備、開発環境
[事前準備]
ReactNativeで環境構築したプロジェクトのディレクトリで、
[こちら](https://dev.classmethod.jp/articles/how-to-set-up-web-application-base-with-amplify/)を参考にして、amplify configure、amplify init、amplify add authを叩いて事前準備する。

[開発環境]
- react-native v0.66.5
- amplify-cli v9.2.1
- @aws-amplify/api v5.0.11
- @aws-amplify/api-graphql v3.0.11
- @aws-amplify/auth v5.1.5
- @aws-amplify/core v5.0.11

amplify configure、amplify init、amplify add authを叩いて事前準備する。
https://dev.classmethod.jp/articles/how-to-set-up-web-application-base-with-amplify/

## どのような開発に使ったか
毎日指定時間に、DynamoDBからデータを取得してpush通知を送る。

## 手順
### １．amplify pull
初回ではない場合、リモートの差分を取り込む。
### ２．amplify add function
このコマンドを叩いてLambda関数を作成すること。既存のものをコピペして作成するとうまくいかないため。
何度か質問されますが、今回は以下の通り設定しました。
```
? Select which capability you want to add:
　　 Lambda function (serverless function)
? Provide an AWS Lambda function name:
  任意の関数名を設定
? Choose the runtime that you want to use:
  NodeJS
? Choose the function template that you want to use:
  Hello World (いくつかあるが、今回はとりあえず関数を作りたいので)
↓この後はHelloWorldを選択したときの設定です。
? Do you want to configure advanced settings?
  No
? Do you want to access other resources in this project from your Lambda function? (Y/n)
  No
```

作成完了すると、amplify > backend > function配下に関数が追加されている。

### 3.amplify status
作成した関数がOperation Createで差分として出ているか確認。
変更していない関数に差分が出ていないかも同時に確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126560/72f87301-dc31-c4d3-2ea0-98b168d12c93.png)

### 4.amplify push function 関数名
新規作成した関数をpushする。
正常にpushされれば、赤文字が出ない。新規作成は白文字で表示されるかも。

### 5.ブラウザからpushした関数を確認、テスト実行
Lambda > 関数を開き、先ほどpushした関数があることを確認する。
テストを押すと、テストの新規作成が出てくる。
とりあえず、正常にテストできるか確認したいので、任意のイベント名を押して保存。

テスト > テストボタンを押すと先ほど作成したテストが実行できる。
正常に動作すると緑の表示、失敗すると画像のように赤の表示がされる。
![スクリーンショット 2023-02-15 13.00.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126560/007541b5-6fed-dca5-13fc-902fc27af1e9.png)

### 6.ログの確認
モニタリング > View CloudWatch logsから実行したテストのログが確認できる。
※確認前にLambda > 関数 > 設定 > 環境変数を適宜追加すること。

### この後、Lambda関数を更新するには
ローカルで修正し、amplify pushする。

### 開発中に遭遇したエラー達と解決方法
- node_modulesを含む関数がうまくuploadできず "errorType":"Runtime.ImportModuleError”が出る場合
[解決方法]
関数をzip化して、コード > アップロード元 > .zipファイルからアップロードした方が早い。amplify pushすると、なぜかnode_modules配下のパッケージたちが.yarn-integrityファイルのみになってしまう。謎。zip化は関数のディレクトリで以下を叩く。
```
zip -r 関数名.zip .
```

- amplify > backend > function 配下の関数を右クリックして削除したが、amplify statusで確認すると残っている時
[解決方法]
amplify remove functionで削除したい関数を選択して削除。

- テストを実行したときに、次のようなエラーが出たとき
プロジェクト名LambdaRolexxxxxxxx-dev/Lambda関数名-dev is not authorized to perform: dynamodb: Query on resource: arn:aws:dynamodb~~
[解決方法]
I AM > ロール > プロジェクト名LambdaRolexxxxxxxx-dev の許可ポリシーに必要なもののアクセス許可をする、今回はDynamoDBのテーブルデータを取得したくてAmazonDynamoDBFullAccessを追加。
AmazonDynamoDBReadOnlyAccessこっちでもいけた。

- ValidationException Query key condition not supported
IndexNameを追加したら、いけた。
アクセスするDynamoDBのテーブル > インデックス > グローバルセカンダリインデックスにある名前を追加。
```JavaScript
return new Promise((resolve, reject) => {
    dynamo.query(
      {
        TableName: '関数名',
        KeyConditionExpression: '#TYPE = :type AND #DATE = :today',
        ExpressionAttributeNames: { '#TYPE': 'type', '#DATE': 'date' },
        ExpressionAttributeValues: {
          ':today': today,
          ':type': type,
        },
        IndexName: 'ここ',
      },
      function (err, data) {
        if (err) reject(err)
        resolve(data)
      },
    )
})
```