Cognito認証を行うLambda関数をTypescriptで実装する

今回はCognitoのjwtTokenを使って認証を行う処理をLambdaで行います

ソースコードは[こちら](https://github.com/awslabs/aws-support-tools/blob/master/Cognito/decode-verify-jwt/decode-verify-jwt.ts)を使わせていただきました
（あとから気付きましたが、jsファイルもありました。[こちら](https://github.com/awslabs/aws-support-tools/pull/125/commits/2c850531cf0afc64286321e5a82f02d1531f4734)です）


PythonとTypeScriptのどちらかを選ぶのですが、今回は勉強がてらTypescriptを選択しました

tsファイルをパッケージ化（zip化）し、Lambda関数として動かすまでの手順を備忘録がてらまとめました

OSはMac（homebrewインストール済み）を使用しています

# 開発環境導入
- npmのインストール

```
brew install npm
```

- 
# Lambda ファンクション作成準備

- Lambda プロジェクト用のディレクトリを作成し、ディレクトリに移動

```
mkdir test
cd test
```

- プロジェクトの初期化を行う

```
npm init
```

- 必要なモジュールのインストール

今回はlodash、axios、joseが必要だったので、これら3つをインストール

```
npm install lodash
npm install axios
npm install jose
```

- TypeScript の設定ファイルを生成

TypeScript のコンパイラオプションを指定するために tsconfig.json を下記コマンドで作成する。

```
./node_modules/.bin/tsc --init
```

すると、下記の様な tscofnig.json が生成される。

```
{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "noImplicitAny": false,
        "sourceMap": false
    }
}
```

念のため上記のオプションの説明すると

1. module
    - モジュールコードの生成方法の指定 (“None”, “CommonJS”, “AMD”, “System”, “UMD”, “ES6”, or “ES2015”)
2. target
    - ECMAScript のバージョン(“ES3” (default), “ES5”, “ES6”/“ES2015”, “ES2016”, “ES2017” or “ESNext”. )
3. noImplicityAny
    - 暗黙的に any を使用していたらエラーを出すかどうか
4. sourceMap
    - ソースマップファイルを生成するかどうか

もっとコンパイラオプションに凝りたい方はコンパイラオプションのドキュメントを参照してみてください。

# Lambda にアップロードできる形に変換

**(今回はすでに変換されたjsファイルが有ったため、省略しています)**

TypeScript のソースを JavaScript にトランスパイルします。そのときに使うのはtsc*コマンド。

インストールしたパッケージのうち bin があるものは ./node_modules/.bin 以下に保存されるのでそちらから実行する。

```
./node_modules/.bin/tsc index.ts
```

すると、 tsファイル名.js が生成される。

# zip 化

Lambda にアップロードするために生成された js ファイルとライブラリを zip にまとめます。ディレクトリ上で下記コマンドを実行。(名前は何でもよいです)

```
zip -r lambda.zip *
```

こうしてできた zipファイル を Lambda にアップロードします。

# AWS Lambda 上へのアップロード
- まず、AWS コンソールにアクセスして Lambda のページにアクセスします。
- 「関数の作成」をクリック
![SnapCrab_NoName_2020-7-13_15-51-23_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553852/b710d974-72d8-f8de-8f20-083b324b0074.png)

- 「一から作成」を選択し、関数名、ランタイムを設定（今回はNodeを選択）→「関数の作成」をクリック
![SnapCrab_NoName_2020-7-13_15-52-6_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553852/a7fcb6f0-b6e4-116e-37ea-a4225a48fae8.png)


- 作成した関数を選択し、「関数コード」の「アクション」→「.zipファイルをアップロード」をクリック
![SnapCrab_NoName_2020-7-13_15-53-49_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553852/b76b807e-3645-2dd1-5493-d24b4ab492dd.png)


- 「アップロード」をクリックし、先ほど作成したzipファイルを選択し、「保存」をクリック
![SnapCrab_NoName_2020-7-13_15-54-0_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553852/122068ea-80e7-1cc4-f5b1-db7fdf8bcf69.png)

# handler名の変更
- 下にある「基本設定」の「編集」をクリック
![SnapCrab_NoName_2020-7-13_15-54-23_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553852/f150b405-d08f-9a39-1ab8-3ada5722719f.png)

- 『index.handler』を『先程作った関数名.handler』に変更し、「保存」をクリック
![SnapCrab_NoName_2020-7-13_15-54-40_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553852/ac8e75b8-1143-3970-c933-07f686ea73b1.png)


これで完成です

あとは作ったコードに合うJSONのテスト設定をしてテストをしてみましょう