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


オンデマンドハンズオン「AWS SAM を使ってテンプレートからサーバーレスな環境を構築する」に参加しました。
前回に当たる「サーバーレスアーキテクチャで翻訳 Web API を構築する」のレポートについては以下の記事をどうぞ。
AWS「さぁ!サーバーレスを始めよう!サーバーレスハンズオンもくもく会」レポート
注意:前回同様に知識がなくても参加できますが、今回のハンズオンは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形式)を作成します。
公式ドキュメントを参考にすれば、記述方法についてそれほど困ることはありません(といってもCloudFormationの知識がないと少し難しいです)。
前回のハンズオン同様、API GatewayやDynamoDBとの連携も行います。この辺りは目新しいこともないので省略します。

オプションとして、SAM CLIも使用してみました。
sam initsam buildsam deploy --guided のたった3コマンドでデプロイができます(要Docker環境/Cloud 9なら最初からインストールされているので気にしなくて大丈夫です)。詳細は公式ドキュメント中のチュートリアルを参考にしてください。

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 validatesam local start-lambdaでモック環境でのテストも可能です。
さらに大元がCloudFormationなので、CloudFormationコンソールからまとめて削除できます。

上から順にSAMテンプレートで作ったリソース、S3 bucket(内にアップロードしたsam-appフォルダ)、Lambda関数、Cloud 9です。
Cloud 9もCloudFormationスタックなんだという新たな気づきも得ました。
便利ですね。
短所があるとすれば、まだβ版なので本番運用はできない点でしょうか。

おわりに

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

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

弊社WebサイトではAWSを含むさまざまな技術記事を公開しています。ぜひご覧ください。