はじめに
AWSハンズオン for Beginnersシリーズとして提供されている「AWS Hands-on for Beginners Serverless #2 AWS SAM を使ってテンプレートからサーバーレスな環境を構築する」を実施した際のメモです。
AWS SAM(Serverless Application Model)とは、サーバーレスアプリケーション構築用のオープンソースフレームワークです。CloudFormationを使用することでも、Lambdaなどのサーバレスアプリケーションをプロビジョニング可能ですが、SAMを使用することでより簡潔に記載できます。
また、SAM CLIを使用してローカル環境にサーバレスサービスの仮想的な実行環境を作成し、デバッグ実行も可能です。CLIでAWS環境でのデプロイも容易になっています。
本ハンズオンでは「Serverless #1 サーバーレスアーキテクチャで翻訳 Web APIを構築する」で構築したサーバレスサービス主体の翻訳WebアプリケーションをこのAWS SAMを使用し、構築します。
なお、Serverless #1の学習メモはここに記載しています。
アジェンダ
- 前回のハンズオンの復習と今回のハンズオンの概要
- AWS SAMの紹介とAWS Cloud9の紹介
- Cloud9のセットアップ+[Option]Cloud9で簡単なLambda関数を作成する
- SAMでLambda関数を作成する ①
- SAMでLambda関数を作成する ②
- SAMでAPI Gatewayのリソースを作成し、Lambda関数と連携させる
- SAMでDynamoDB TBLを作成し、Lambda関数を連携させる
- [Option]SAM CLIを使ってみる ①
- [Option]SAM CLIを使ってみる ②
- クリーンアップ & 落ち穂拾い & まとめ
メモ
ゴール
- AWS Serverless Application Model(SAM)を用いて、サーバレス構成を自動構築します。
- Serverless#1で構築した構成をSAMで作成していきます。
Serverless#1で使用したサービスについて
Lambda
サーバを構築する必要なくプログラムを実行できるサービスです。サーバの構築や必要なミドルウェアのインストール、スケーリングなどを考えず使用でき、プログラムの記述に集中できます。
API Gateway
サーバの構築、管理が必要なくAPIの作成、管理ができるサービスです。可用性の担保、スケーリング、APIキーの管理といった作業をAPI Gateway側でやってもらうことでLambdaと同様ビジネスの差別化につながる作業に集中できます。
DynamoDB
データをkey-value形式で管理するフルマネージドなNoSQLデータベースサービスです。データが3つのAZに保存されるため高い可用性があります。また、ストレージの容量制限がないことも特徴です。
AWS SAM概要
AWS SAMとは、CloudFormationの拡張機能であり、サーバレスアプリケーションを構築するために使用するオープンソースです。なお、CloudFormationとは、テンプレートファイルの記述に従ってAWSがサービスのプロビジョニングを行うサービスです。SAM、CloudFormationを使用することで、差分比較が楽になったり、環境差異による障害が少なくなるため、開発の効率が向上します。
AWS SAMのプロパティ
SAMは大きく2つのプロパティで構成されます。
1つ目は「Type」であり、どのサーバレスサービスを構築するかを指定します。例えば、「AWS::Serverless::Function」と指定すると、Lambdaをプロビジョニングすることになります。
2つ目は「Properties」であり、「Type」で作成するサービスの詳細情報を記載します。「Type」により、必須非必須の項目があります。例えば、「AWS::Serverless::Function」では「FunctionName」という値を「Properties」配下に定義でき、Lambda関数名を指定します。
AWS SAMを使ったプロビジョニングまでの流れ
- SAMテンプレートを作成します。SAMテンプレートとはCloudFormationテンプレートの拡張で、前節で記載した「Type」「Properties」などを記載し、どのサーバレスサービスをどのようにプロビジョニングするか記載したファイルです。詳細はここを参照ください。
- 「aws cloudformation package」コマンドを実行し、SAMテンプレートをS3バケットにアップロードします。こちらを見るとわかるようにアップロード後のファイルのローカルファイルを参照しているプロパティ「CodeUri」の値がS3のパスに変換されています。このコマンドを使用することでS3のパスを意識せずにローカルでSAMテンプレートを作成できます。
aws cloudformation package --template-file template.yaml --s3-bucket your-backet-name --output-template-file packaged-template.yaml
- 「aws cloudformation deploy」コマンドを実行し、AWSにサービスをプロビジョニングします。
aws cloudformation deploy --template-file ./packaged-template.yaml --stack-name your-backet-name --capabilities CAPABILITY_IAM
Cloud9について
Cloud9とは、ブラウザでプログラミングができるクラウドベースのIDEです。複数人でリアルタイムにペアプログラミングが可能であり、サーバレスサービスの作成もできます。料金はCloud9内部で実行されるEC2インスタンスの稼働時間およびEBS使用量により決定します。
Cloud9コンソール上からLambdaを新規作成できます。LambdaのソースはCloud9上で変更、実行でき、デプロイすることでLambdaコンソール上に反映されます。
LambdaにAmazon Translateの操作権限を付与する
LambdaにAmazon Translateの操作権限を付与するため、SAMテンプレートの当該Lambdaの「Properties」に「Policies」を追加し、Translateのポリシー名を記載する必要があります。
API GatewayからLambdaを呼び出す
「Type」に「AWS::Serverless::Api」を指定することでAPI GatewayにAPIをプロビジョニングできます。
当該APIから指定のLambda関数を呼び出すには、「Properties」に「Events」を追加し、当該API Gatewayの論理名を「RestApiId」に追加します。また、HTTPメソッドやリクエストパスを指定する必要もあります。
LambdaにDynamoDBの操作権限を付与する
「Type」に「AWS::serverless:simpledb」を指定することでDynamoDBのテーブルをプロビジョニングできます。
「Properties」には、主キーやプロビジョニングキャパシティなどを指定します。LambdaからDynamoDBを操作するため、当該Lambdaの「Properties」に「Policies」を追加し、DynamoDBのポリシー名を記載する必要があります。
SAM CLIについて
SAM CLIとは、サーバレスアプリケーションをローカル環境で実行できるツールです。AWS CLIを使用するよりも簡潔にSAMのpackage、deployできます。
実行環境にDockerをインストールする必要があります。Cloud9には最初からDockerがインストールされています。
雑記
「aws cloudformation package」コマンドで変換したSAMテンプレートを格納するため、事前にS3バケットを作成する必要があります。
本ハンズオンでは以下のAWS CLIコマンドでバケットを作成しました。
aws s3 mb s3://your-backet-name
ハンズオンの感想
Serverless#1ではAWS管理コンソールからボタンを押しながらアプリケーションのデプロイをしていました。今回のSAMを使用することでテンプレートによる自動プロビジョニングができます。
これによりヒューマンエラーがなくなり、再デプロイも容易になるので是非活用していきたいです。