AWS Hands-on for Beginners 〜Serverless 編〜　　#1

## はじめに
勉強していることをなんとなくメモっていきます。

行うこと
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/
サーバーレスアーキテクチャで翻訳 Web API を構築する »

本人情報
IT現場雑用員（一生エクセル触ってる人）
1年前にAWS SAA取得済み

<br>

## サーバレスの基本を学ぼう。
#### 実装するアーキテクチャ
![スクリーンショット 2022-07-02 16.19.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/7fbec0cd-98d3-a255-1197-7ec35a2e2ebb.png)
今回のハンズオンビギナーで実装するアーキテクチャです。
クライアントからのリクエストをAPI　Gatewayで受け取り、Amazon Translateで翻訳したものを返します。AWS LambdaはこのAPI GatewayとTranslateの間の橋渡しとして動作し、翻訳の履歴をヒストリーテーブルとしてDynamoDBに書き込みます。

#### なぜサーバレスなのか
ビジネスの価値（利益）に繋がらない作業への時間、お金を節約することができます。
例）サーバ、ミドルウェアのセットアップ、セキュリティパッチの適用、耐障害性の確保など

##### 主な特徴
1.インフラのプロビジョニングや管理が不要
Elastic BeanstalkやOpsWork、CloudFormationを使用して環境構築を自動化し、環境自体の複製、削除、共有などを容易に行うことができます。

2.高い可用性
特にRDSなどのマネージドサービスを使用することで、高い可用性を保つことができます。また、ELBを用いた負荷分散やCloudWatchを用いた死活監視、マルチAZ構成などを行うことによって、設計の中で高い可用性を容易に確保することができます。

3.自動でスケール
Auto Scalingなどのサービスを利用して負荷や障害に対して、自動でスケーリングを行うことができます。

4.価値に対する支払い
AWSは基本的に使用した分だけ支払いを行う仕組みになっているため（結構例外あり）、リクエストが少ない時間帯や利用者が少ないサービスにかかるコストを節約することができます。
<br>

## Lambdaについて
#### AWS Lambdaの特徴
サーバのプロビジョニング/管理なしでプログラムを実行することができるサービス
他にもコードを実行するためのスケーリングなどは全てLambda側で実行してくれるため、開発者はコードを書くことに集中することができます。

料金体系
実行回数　　＋　　実行時間

対応言語
Java、GO、PowerShell、Node.js、C#、Python、Ruby

ライフサイクル
初回の実行や、利用可能なコンテナがない場合はコールドスタートとなり、利用可能なコンテナがある場合はウォームスタートになります。コールドスタートになってしまうと、立ち上がりに時間がかかる場合があるので注意が必要です。
<br>
#### AWS Lambdaのイベントソースと呼び出しタイプ
Lambda関数は呼び出し元のリソースによって呼べ出され方が変わります。
また、呼び出され方は大きく分けて２種類あります。

非同期型
![スクリーンショット 2022-07-02 17.39.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/c55864c1-ca79-bc9a-ca62-9a77b8ff0149.png)
Lambdaへのリクエストが正常に受け入れられたかどうかのみを、呼び出し元に返却します。リクエストに対する実行の成否を返さないという意味で、非同期での処理となります。

同期型
![スクリーンショット 2022-07-02 17.41.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/e2efc3e3-0b5c-d749-2d1e-8ae4c7435c34.png)
Lambdaへのリクエストに対する実行が完了したときにレスポンスを返却します。


各サービスごとの呼び出しタイプは下記リンクのシート４４枚目あたりに書いてあります。
https://d1.awsstatic.com/webinars/jp/pdf/services/20190402_AWSBlackbelt_AWSLambda%20Part1%262.pdf
<br>

## Lambdaを単体で使ってみる
メモリやタイムアウトの設定、付与するIAMロールの変更はここから行う。

![スクリーンショット 2022-07-02 18.10.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/230e1f4d-eb8f-9ec3-cd6f-1a99d181156f.png)

![スクリーンショット 2022-07-02 18.11.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/7e104693-ca69-276b-8193-b7688a3a0679.png)

イベントとしてこれを渡して
![スクリーンショット 2022-07-02 18.30.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/610d6f8f-18aa-fd87-7177-f587aa7adbaa.png)

こう実行すると
![スクリーンショット 2022-07-02 18.30.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/840d4cf9-b588-87da-bcc1-b989ee21e85e.png)

eventの中に入っていたログがこのように表示されます。
![スクリーンショット 2022-07-02 18.30.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/fb7e5766-6b2e-794e-78de-6617368afd2c.png)
<br>

## Lambdaで他のサービスを呼び出す。
1. Python SDKのドキュメントを見ながらTranslateの呼び出し方を実装する。

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/translate.html#Translate.Client.translate_text

![スクリーンショット 2022-07-02 19.32.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/49723cfb-6069-db79-de43-d600998e39ef.png)
'2. IAMロールを実装する
![スクリーンショット 2022-07-02 19.20.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/99e87374-1943-3a19-e619-85b5feef856f.png)

'3. レスポンスとして、JSON形式で英語訳を返すようにする
![スクリーンショット 2022-07-02 19.33.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/99596f39-c895-a2d5-7b91-52423ed72d5f.png)

'4. Lambda関数をテスト実行する
![スクリーンショット 2022-07-02 19.33.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/c60ee8e8-88b7-fb8a-cc62-e7bc692b2c7c.png)
翻訳されていることが確認できました。
<br>

## API Gatewayについて
上述したサーバレスの特徴を持つため、サーバのプロビジョニングや管理を考えることなくAPIを作成することができます。

#### 開発の流れ
① リソースとメソッドタイプ定義
リソースとメソッドタイプ（GET、POSTなど）を組み合わせて指定することによって、どのようにしてデータを受け取るかを指定します。
例　/reports(レポートの一覧）　　　　✖️ GET, POST
　　/report_id(指定したIDのレポート） ✖️ GET, DELETE

②メソッドリクエスト設定
リクエストの受付時に関する設定を行う（認証など）

③統合タイプ設定
バックエンドの種類を選択する（Lambda関数、HTTP、Mockなど）

④Req／Res変換定義
バックエンドへのInput、バックエンドからのOutput変換をすることができる。
ここで何も変換を行わない（プロキシ統合）という設定も可能

⑤デプロイ
API自体をデプロイする。

![スクリーンショット 2022-07-02 19.49.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/a15a1ef8-be37-cef8-164e-50f2a7155bcc.png)
<br>


## API Gatewayを単体で使ってみる
今回はエンドポイントとしてMockを選択し、統合レスポンスにjsonファイルを登録しておくことによってリクエスト→レスポンスの流れを確認する。

① 新規にAPIを作成する
![スクリーンショット 2022-07-02 21.46.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/bb7a6259-c857-f58d-6c22-f89b72bfee6c.png)

② sampleリソースを作成し、GETメソッドを作成
![スクリーンショット 2022-07-02 21.47.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/fe0549a7-1707-6357-f0d8-5746a2ff9b44.png)
![スクリーンショット 2022-07-02 21.48.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/1225ee16-e623-d231-445c-655860a97bbe.png)

③ 統合タイプとしてMockを選択する
![スクリーンショット 2022-07-02 21.51.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/6dff94bc-c48d-a2b0-b230-b52bbc9fada0.png)


④ devステージにデプロする
![スクリーンショット 2022-07-02 22.16.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/8bc9a76e-3ad3-a62a-66dd-ef8d43b58a10.png)
![スクリーンショット 2022-07-02 22.17.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/17c62b30-ea02-f6a2-89b9-b86393dbe0f2.png)

⑤ APIを試しに実行してみる。
![スクリーンショット 2022-07-02 22.19.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/40f582df-157f-be60-07f1-36253051bdf4.png)



長くなってきたので、１回区切ります
その②に続く…