AWS Hands-on for Beginners #2 でサーバーレス環境自動構築チャレンジ

オンデマンドハンズオン「<a href="https://pages.awscloud.com/event_JAPAN_Ondemand_Hands-on-for-Beginners-Serverless-2_LP.html">AWS SAM を使ってテンプレートからサーバーレスな環境を構築する</a>」に参加しました。
前回に当たる「サーバーレスアーキテクチャで翻訳 Web API を構築する」のレポートについては以下の記事をどうぞ。
<a href="https://qiita.com/priseday/private/0e29f3a2706803ec9659">AWS「さぁ！サーバーレスを始めよう！サーバーレスハンズオンもくもく会」レポート</a>
注意：前回同様に知識がなくても参加できますが、今回のハンズオンはCloudFormation・Linuxの仕様とコマンドを学んでいないと難しい部分があります。

#前提知識① - AWS Serverless Application Model（SAM）とは？
「AWS Serverless Application Model（SAM）」は「AWS CloudFormation」の拡張機能です。
そもそもの「AWS CloudFormation」は、AWSのインフラサービスをコードで作成できる機能です。提携リソースを一度構築すれば使い回しができ、作成時にミスや不足が起きずに済む……と非常に便利です。
しかし、LambdaやAPI Gatewayなどのリソースを作成しようとすると、どうしてもテンプレートが長文化するのが難点でした。
AWS SAMはそういったリソースのテンプレートを、簡潔に記述可能にしたものです。
（処理としては、デプロイされたSAMテンプレートはAWS側でCloudFormation形式に変換されています）

#前提知識② - AWS Cloud9 とは？
サーバーレスと直接関係はないのですが、Infrastructure as Codeに役立つ環境として「AWS Cloud 9」を利用します。
Cloud 9とは、ブラウザ上でコードの記述（コードエディタ）・実行（ターミナル）・デバッグ（デバッガー）が可能な、クラウドベースの統合開発環境です。
複数人でリアルタイムの共同コーディングを行え、チャット機能が付随しているのでペアプログラミングも行えます。
今回利用するうえで嬉しいのは、AWS Lambdaとの連携です。簡単なサーバーレスアプリケーション（Lambda関数）を、Cloud 9上で構築したり実行したりデプロイしたりできます。
また、AWS CLI（ただし2020年4月現在はv1）やDockerが最初からインストールされており、便利に利用することができます。

#ハンズオン
はじめの小目標は「Cloud 9に慣れる」ことです。せっかくなので仕様をいろいろと確認してみます。
今回のスペックは以下の通りです。

- Environment type：Create a new instance for environment
　（※選択したリージョンでEC2インスタンスを立て、Cloud 9環境を実行）
- Instance type：t2.micro (1 GiB RAM + 1 vCPU)
- Platform：Amazon Linux
- VPC,subnet：default

Pythonのバージョンを確認します。（2020年4月現在）3.6.10です。

```
$ python --version
Python 3.6.10
```

デフォルトでAWS CLIも入っています。

```
$ aws --version
aws-cli/1.18.40 Python/3.6.10 Linux/4.14.171-105.231.amzn1.x86_64 botocore/1.15.40
```

アップグレードも可能です。

```
$ sudo pip install --upgrade pip
Cache entry deserialization failed, entry ignored
    ...
Successfully installed pip-20.1
```

一通り使用方法に慣れたら、SAMファイル（YAML形式）を作成します。
<a href="https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-specification-template-anatomy.html">公式ドキュメント</a>を参考にすれば、記述方法についてそれほど困ることはありません（といってもCloudFormationの知識がないと少し難しいです）。
前回のハンズオン同様、API GatewayやDynamoDBとの連携も行います。この辺りは目新しいこともないので省略します。

オプションとして、SAM CLIも使用してみました。
`sam init` → `sam build` → `sam deploy --guided` のたった3コマンドでデプロイができます（要Docker環境/Cloud 9なら最初からインストールされているので気にしなくて大丈夫です）。詳細は<a href="https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-getting-started-hello-world.html">公式ドキュメント中のチュートリアル</a>を参考にしてください。

```
XXXXXXXX:~/environment $ sam deploy --guided

Configuring SAM deploy
======================

        Looking for samconfig.toml :  Not found

        Setting default arguments for 'sam deploy'
        =========================================
        Stack Name [sam-app]: AWSserverlesshandson
        AWS Region [us-east-1]: ap-northeast-1
        #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
        Confirm changes before deploy [y/N]: y
        #SAM needs permission to be able to create roles to connect to the resources in your template
        Allow SAM CLI IAM role creation [Y/n]: Y
        Save arguments to samconfig.toml [Y/n]: Y
    ...
```

加えてSAM テンプレートを事前検証するなら`sam validate`、`sam local start-lambda`でモック環境でのテストも可能です。
さらに大元がCloudFormationなので、CloudFormationコンソールからまとめて削除できます。
![SAM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625553/35171db2-e768-2107-72e3-cdfe67a7737e.png)
上から順にSAMテンプレートで作ったリソース、S3 bucket（内にアップロードしたsam-appフォルダ）、Lambda関数、Cloud 9です。
Cloud 9もCloudFormationスタックなんだという新たな気づきも得ました。
便利ですね。
短所があるとすれば、まだβ版なので本番運用はできない点でしょうか。


#おわりに

- サーバーレス環境もコード化できる！
- サーバーレス環境をコード化してコマンド形式で実装できる！
- サーバーレス環境をデプロイしなくてもローカルでテスト実行ができる！
- SAM CLIもある！（まだβ版だけど……）

AWS SAMは、サーバーレスって結局コンソールをぽちぽちやる必要があるからめんどくさい！……という意見に応えられる画期的なサービスだと思います。
ハンズオンをはじめて、今日からIaCの世界へと飛び込みましょう。

<a href="http://c.itdo.jp/">弊社Webサイト</a>ではAWSを含むさまざまな技術記事を公開しています。ぜひご覧ください。