AWS「さぁ！サーバーレスを始めよう！サーバーレスハンズオンもくもく会」レポート


4月22日に行われた、AWS公式オンラインセミナー「<a href="https://pages.awscloud.com/event_JAPAN_Webinar_Hands-on-for-Beginners-Serverless-live_0422_LP.html">さぁ！サーバーレスを始めよう！サーバーレスハンズオンもくもく会</a>」に参加しました。
オンデマンドハンズオン「<a href="https://pages.awscloud.com/event_JAPAN_Hands-on-for-Beginners-Serverless-2019_LP.html">サーバーレスアーキテクチャで翻訳 Web API を構築する</a>」に参加してきましたので、以下はそのレポートとその備忘録です。

ちなみに私のスキルレベルは、
・AWS：勉強中です。サービスの名称と提供内容を覚え始めたレベルです。
・プログラミング言語：Pythonをちょっと写経したことがある程度です。
結論から言うと、この程度の知識でもサーバーレスアプリケーションが動く楽しみを味わえるのでおすすめです。

#前提知識 - そもそもなぜサーバーレスなのか？
サーバーレスと切っても切り離せないのが「マイクロサービス」の考え方です。
マイクロサービスとは、小さなサービスの集合体でソフトウェア全体を構成する、という構造形式（アーキテクチャ）です。
ソフトウェア単体ですべてを執り行おうとする「モノリシック」とは正反対の考え方です。
モノリシックではどうしてもサービスが誇大化します。アプリケーションにひとつ細かな機能変更を行うだけで、変更部分に関わるすべての仕様を考え直さなければならないことがあります。
マイクロサービスでは、小さなサービス同士がAPIやメッセージキューと言った橋渡し役を通じて組み合わさっています。機能変更はサービス単位で行われ、他の仕様に影響しません。
小さなサービスごとに異なるツールを選択することも可能です。柔軟にスケーリングさせることも可能で、必要な分だけリソース分配を行うという手法も取りやすいです。

しかし、マイクロサービスもいいことばかりではありません。
小さなサービス単位に分割するということは、手間も増えるということです。
サービスごとにインフラ管理、サービスごとにリソースの分配、サービスごとにコスト計算、サービスすべてを高可用性を満たすセキュアな環境に……。
さまざまな要件を満たす環境をぽんと用意することは、なかなか難しいのではないでしょうか。

そこでサーバーレスの考え方、マイクロサービスの短所をクラウドで補う方法です。
サーバー管理はすべて提供会社（AWSの場合はAmazon）が行ってくれ、利用者は考える必要がありません。
今回ハンズオンで使用したAWS Lambdaは、自動スケーリングに対応、従量課金制、複数のアベイラビリティーゾーンで実行されるため高可用性に優れると至れり尽くせりです。

#ハンズオン
先述の通り、「サーバーレスアーキテクチャで翻訳 Web API を構築する」ハンズオンを実践しました。
はじめの小目標は「Lambda関数の作成」です。
Amazon Translate（機械翻訳サービス）を呼び出すコードを書きます。
このために、AWSをPythonで操作できるようになるライブラリ <a href="https://aws.amazon.com/jp/sdk-for-python/">AWS SDK for Python（boto3）</a>を使用します。
通常、Lambdaで外部モジュールを利用するには、ソースコードと一緒にパッケージ化してアップロードする必要がありますが、boto3はデフォルトで使用できます。
今回使用する<a href="https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/translate.html">Amazon Translateのドキュメント</a>を確認します。
今回重要となるのはtranslate_textの部分です。

stringがやたら並んでいるので身構えますが、上から順に
・Text：翻訳したいテキストの挿入部分
・TerminologyNames：Amazon Translateでカスタム用語集の.csvファイルをアップロードしている場合、ファイル名を指定して利用できる（今回は使用しないため削除）
・SourceLanguageCode：翻訳前の言語。今回は日本語
・TargetLanguageCode：翻訳後の言語。今回は英語
ということが分かれば簡単です。

Textを"はじめまして"とし、作成したコードをLambdaコンソールでテスト実行してみると、出力結果は以下のようになります。

```
{
  "statusCode": 200,
  "body": "{\"output_text\": \"Nice to meet you\"}"
}
```

※ここでLambdaのIAMロールにAWS Translateへのアクセス許可をアタッチしていないと以下のようなエラーが出ます。
（ハンズオンではきちんと指示されるので、普通はないと思いますが）

```
{
  "errorMessage": "An error occurred (AccessDeniedException) when calling the TranslateText operation: User: arn:aws:sts::XXXXXXXXXXXX:assumed-role/(LambdaのIAMロール名) is not authorized to perform: translate:TranslateText",
  "errorType": "ClientError",
    ...
}
```

次にAmazon API Gatewayをデプロイします。外部からのアクセスポイントの役割です。
今回の場合、バックエンドはLambdaです。
Lambda関数では、<a href="https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-integration-settings-integration-response.html">公式ドキュメント</a>を参考に、統合レスポンスを設定します。
・statusCode：今回は正常処理のレスポンスなので200
・headers：今回は無関係なので空欄
・isBase64Encoded：今回はバイナリ変換を行わないのでfalse

Amazon API Gatewayをデプロイした後は、出力されたURLを叩いて、翻訳APIが動いているか確かめます。
もちろんLambdaのIAMロールにAPI Gatewayへのアクセス許可をアタッチすることも忘れてはいけません。
![api.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625553/79889f38-b5b2-c9f8-7269-9d01040d6b94.png)

最後に、翻訳履歴をDynamoDBに書き込むように設定します。
<a href="https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html">Amazon DynamoDBのドキュメント</a>を参考に、Lambda関数を書き換えます。
・公式モジュールであるdatetimeを用いて日時を取得、タイムスタンプとして使用
・「input_text」「output_text」を文字列属性として使用
また、LambdaのIAMロールにはDynamoDBへのアクセス許可もアタッチします。

APIのアクセスポイントから翻訳を試し、
![lambda4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625553/aae7c0f0-cfb5-67fc-7d5e-f5a90a9bc33a.png)
実行した履歴が書き込まれていることが確認できました。
![lambda5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625553/82a60bca-3319-2f92-1825-675244da5503.png)


#おわりに
サーバーレスにもデメリットは存在します。
去る4/20、<a href="https://www.nikkei.com/article/DGXMZO58342270S0A420C2000000/">AWS東京リージョンに障害が発生し、Lambdaにも影響が出た</a>のは記憶に新しいところです。
しかし、コードをさっと書き、思った通りに動くのを眺める楽しさはサーバーレスの醍醐味と言えるのではないでしょうか。

ハンズオンウェビナーは<a href="https://www.nikkei.com/article/DGXMZO58342270S0A420C2000000/">AWS公式</a>より、無料かつ好きなタイミングで受講することができます。
外出自粛が叫ばれる昨今、自宅でサーバーレスの楽しさに触れてみるのも一興ではないでしょうか。

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