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

## はじめに
勉強していて気になった部分をなんとなくメモっていきます。

行うこと
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/
AWSSAMを定義テンプレートからワンレスな環境をする

本人情報
IT現場雑用員（一生Excel触ってる人）
社会人2年目、脳死資格取得男、最近SAPに受かった。

<br>

## AWS SAM
AWS Serverless Application Modelの略称です。AWS CloudFormationの拡張機能で、スタック内にコードを記載するよりも簡潔にテンプレートを記載することができます。
リソースタイプを指定するTypeと、その詳細を記載するPropertiesによって記述され、公式のデベロッパーズガイドから確認することができます。

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-specification-resources-and-properties.html

<br>

記述されたsamはpackageコマンドによって.zipファイルとしてS3に保存され、deployコマンドでLambdaとしてデプロイされます。


## Cloud9
ハンズオン内でCloud9からLambda関数をデプロイする方法が紹介されていましたが、現在は同じ方法で実施できなくなくなっていました。
こちらの方の記事を参考にすると同じ操作ができます。

https://qiita.com/a_b_/items/6b02e08ecacdd21524c2

![スクリーンショット 2022-07-16 22.45.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/c7b06b8a-89c9-3c56-17a2-64e3033c7193.png)
デプロイした結果Cloud９上で修正したコードがLambdaに反映されているのを確認することができました。
S3バケット、CloudFormationのスタックも合わせて確認すると、SAMは拡張機能なのだということが実感できます。



<br>

## 実際にSAMを使ってみる
### Lambdaを作ってみる
![スクリーンショット 2022-07-16 23.23.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/05e948a2-b86c-3356-3460-f63bd7a3f6f8.png)
このようにディレクトリを作って

![スクリーンショット 2022-07-16 23.24.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/1103278e-abe2-103d-37a3-441f414052ca.png)
それぞれこのように記述します。

```
CodeUri: ./translate-function
```
この部分について、ローカルの階層を指定しているのはこの後パッケージコマンドを実行した時に実際にCloudFormationのスタックとして保存されるS3のバケットに変換されます。

<br>

```
sam package \
>      --template-file template.yaml \
>      --s3-bucket 'S3バケット名' \
>      --output-template-file packaged-template.yaml
```
テンプレートファイルに記載したtemplate.yamlを指定します。保存先のS3バケットと、パッケージした後のファイルの名前も合わせて指定しています。必須項目は--s3-bucket 'S3バケット名'です。

![スクリーンショット 2022-07-17 0.03.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/537b822d-da79-2422-cf7e-11e5baac52dc.png)
packaged-template.yamlが作成されました。
<br>

```
aws cloudformation deploy \
>      --template-file ./packaged-template.yaml \
>      --stack-name hands-on-serverless-2 \
>      --capabilities CAPABILITY_IAM
```
先ほど作成したテンプレートファイルを指定します。作成されるCloudFormationのスタック名と、IAMの操作を許可するCAPABILITY_IAMを追加しています。

![スクリーンショット 2022-07-17 0.08.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/2f27fe0c-216d-40ef-5416-3c57b4380f52.png)

デプロイされたLambda関数を確認することができました。

<br>

### API Gateway、DynamoDBを作成する
サンプルコードは公式ページに載っているので、そちらを参考にしてください。Lambda関数を作成するときに使ったyamlファイルと、Lambda関数の中身を記述しているPythonのファイルに追記することでデプロイすることができます。
細かく見たい人はペーストせずに１つ1つのプロパティを、デべロッパーガイドで確認しながら自分で打つといいと思います。

https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-Serverless-2-2022-confirmation_009.html


![スクリーンショット 2022-07-17 20.41.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/56d1edda-4048-e14b-5d03-3253483317fe.png)
input_textに対して入力した英語が、翻訳された日本語で返ってくることまで確認できました。

<br>
<br>


## SAM CLIを使ってみる
インストール方法についてハンズオン内で紹介されているものから、変更されていました。Cloud９上で実施している場合は、「ステップ４: AWS SAM CLIをインストールする」のみでインストールできそうです。

<br>

ランタイムの指定で何も考えずにPython 3.9.10を指定したのですが、ビルドに失敗してしましました。CLoud9上にインストールされたPythonを3.9.１0に変更する必要があるようです。この記事に詳しいやり方が記載されています。

https://dev.classmethod.jp/articles/build-a-python-development-environment-with-cloud9/

![スクリーンショット 2022-07-17 21.41.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/35a5d9ba-fc4d-7dd2-5419-170c4c835b70.png)

無事にビルドすることができました。
そのほかの手順はハンズオンに従って操作すればうまく行きました。


## おまけ
使い慣れている人にとっては当然なのかもしれませんが、Developer Guideで必須項目のみを確認するときはページ内検索で「Required: yes」と打つとそれだけ拾ってくれます。