AWS サーバーレスアプリケーションモデル (AWS SAM)を触ってみた

スポンサーリンク
AWS
スポンサーリンク

この前、出席したAWS Summit TokyoでAWS SAM、AWS SAMと複数のセッションで聞いたので、どのようなサービスかを知るために試してみました。正式名称はAWS サーバーレスアプリケーションモデル、略してAWS SAMです。

 

AWS SAMの定義はオフィシャルサイトでチェックします。

AWS サーバーレスアプリケーションモデル (AWS SAM) は、AWS でサーバーレスアプリケーションを構築するために使用することができるオープンソースフレームワークです。サーバーレスアプリケーションを定義するために使用する AWS SAM テンプレート仕様と、サーバーレスアプリケーションの構築、テスト、デプロイに使用する AWS SAM コマンドラインインターフェイス (AWS SAM CLI) で構成されています。

Lambda の開始方法 - AWS Lambda
Lambda の使用を開始するには、Lambda コンソールを使用して関数を作成します。数分で関数を作成およびデプロイして、それをコンソールでテストできます。

 

サーバーレスのアプリを作るフレームワークですね。「サーバーレス」も多くのセッションで話していました。サーバーの管理はAWSに任せてしまって、ユーザーはアプリの開発に注力していこう、という話です。

人が足りない企業では、アプリケーションエンジニアがインフラエンジニアを兼ねる必要がなくなります。時代的にはもインフラエンジニアは減っていって、アプリケーションエンジニアが増えていくかもしれませんね。

 

スポンサーリンク

AWS SAMのクイックスタート

それでは早速、ドキュメントを見ながらやっていきます。英語版しかないので翻訳しつついきます。

チュートリアル: Hello World アプリケーションのデプロイ - AWS Serverless Application Model
AWS SAM を使用して、基本的な Hello World アプリケーションを AWS クラウド にデプロイする方法を学びます。

 

AWSはAWS上でサーバーレスのアプリケーションを構築できるオープンソースのフレームワークです。

サーバーレスアプリケーションは、Lambda、イベントソース、そしてタスクを実行させる他のリソースからなります。サーバーレスアプリケーションはLambdaだけでなく、API、データベース、イベントソースマッピング機能が包括されたものです。

 

次のステップは、AWS SAMを利用したサーバーレスアプリケーションをどのようにDL、テスト、デプロイするかになります。

  1. 初期化:sam initで、サンプルアプリケーションのテンプレートをDLする。
  2. ローカル環境でのテスト:sam local invoke and/or sam local start-apiを用いて、アプリケーションのテスト。これらのコマンドは、Lambdaがローカルにあっても、AWSクラウドのAWSリソースを読み/書きできる。
  3. パッケージ:Lambdaのテストがokであれば、sam packageでLambda、AWS SAMテンプレート、その他の依存関係をAWS CloudFormationパッケージにバンドルする。
  4. デプロイ:sam deployでアプリケーションをAWS Cloudにデプロイする。この時点で、AWS Cloud上で通常のLambda関数でアプリケーションのテストができる。

実装

Step 1: アプリケーションの初期化

“sam init –runtime python3.6″にて実行ディレクトリ配下にテンプレートディレクトリsam-appが作成されます。ランタイムはpython3.6を指定していますが、Lambdaは他の言語もサポートしているので、変更したい場合はruntimeオプションを変更すればok。

~/AWS_SAM $ python --version
Python 3.6.6 :: Anaconda custom (64-bit)
~/AWS_SAM $ sam init --runtime python3.6 
[+] Initializing project structure...

Project generated: ./sam-app

Steps you can take next within the project folder
===================================================
[*] Invoke Function: sam local invoke HelloWorldFunction --event event.json
[*] Start API Gateway locally: sam local start-api

Read sam-app/README.md for further instructions

[*] Project initialization is now complete
~/AWS_SAM $ ls
sam-app

 

中身はこのような感じです。

~/AWS_SAM $ ls sam-app/
README.md     event.json    hello_world   template.yaml tests
  • template.yaml:Hello Worldアプリケーションに必要なAWSリソースのLambdaとGETをサポートしているAPIゲートウェイのエンドポイント、が定義されている。また、テンプレートはこれらのリソースのマッピングも定義している。
  • hello_worldディレクトリ:”hello world”を返すアプリケーションコードが含まれている。

 

Step 2: ローカルでアプリケーションのテスト

sam local start-apiでローカルのAPI Gatewayエンドポイントを開始します。template.yamlがあるディレクトリで発行する必要があるので、sam-appディレクトリに移動してから発行します。

~/AWS_SAM $ cd sam-app/
~/AWS_SAM/sam-app $ sam local start-api
2019-06-17 21:43:31 Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
2019-06-17 21:43:31 You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template
2019-06-17 21:43:31  * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)
2019-06-17 21:43:39 Invoking app.lambda_handler (python3.6)

Fetching lambci/lambda:python3.6 Docker container image......
2019-06-17 21:43:45 Mounting /Users/hatosuke/AWS_SAM/sam-app/hello_world as /var/task:ro,delegated inside runtime container
START RequestId: d5c709d3-6861-41d8-813c-748a86373822 Version: $LATEST
END RequestId: d5c709d3-6861-41d8-813c-748a86373822
REPORT RequestId: d5c709d3-6861-41d8-813c-748a86373822 Duration: 11 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 19 MB
2019-06-17 21:43:48 No Content-Type given. Defaulting to 'application/json'.
2019-06-17 21:43:48 127.0.0.1 - - [17/Jun/2019 21:43:48] "GET /hello HTTP/1.1" 200 -
2019-06-17 21:43:49 127.0.0.1 - - [17/Jun/2019 21:43:49] "GET /favicon.ico HTTP/1.1" 403 -

 

いろいろ出力されますが、”2019-06-17 21:43:31 Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]”とあります。”http://127.0.0.1:3000/hello”をブラウザで開くと、”hello world”が表示されます。

これも出力されたコメントに書いてありますが、メッセージの修正はsamのリスタートする必要なくできます。

試しにsam-app/hello_world/app.pyの39行目を”hello world”から”hello world modified”に修正し、ブラウザをリロードします。

 36     return {
 37         "statusCode": 200,
 38         "body": json.dumps({
 39             "message": "hello world modified",
 40             # "location": ip.text.replace("\n", "")
 41         }),
 42     }

 

リスタートすることなく動的に”hello world modified”になりました。

Macですと、control+Cで抜けることができます。

 

私は誤ってcontrol+Zで抜けて、プロセスは残った状態になってしまい、再度、

sam local start-apiを発行してもエラーが返ってきてしまいました。その場合はプロセスをkillする必要があります。

 

まずは残っているプロセスの番号の確認。

~/AWS_SAM/sam-app $ ps -fA | grep python
 502  8553  4919   0  8:29PM ttys000    0:01.86 /usr/local/Cellar/aws-sam-cli/0.17.0/libexec/bin/python3.7 /usr/local/bin/sam local start-api

 

これをkillすれば、sam local start-apiが再度、実行できる状態となります。

~/AWS_SAM/sam-app $ kill 8553

 

Step 3: アプリケーションのパッケージ化

ローカル環境でアプリケーションのテストをした後、AWS SAM CLI でデプロイメントパッケージを作成します。そして、そのパッケージをAWS S3にアップします。

 

hello_world/ディレクトリ配下にアプリケーションコードが入ったデプロイメントパッケージである.zipファイルを作成します。

Lambda deployment package

1.デプロイメントパッケージを格納するS3のバケットを作ります。

~/AWS_SAM/sam-app $ aws s3 mb s3://hatosuke-aws-sam
make_bucket: hatosuke-aws-sam

 

2.sam packageでS3のhatosuke-aws-samバケットにデプロイメントパッケージを作る

~/AWS_SAM/sam-app $ sam package \
>     --output-template-file packaged.yaml \
>     --s3-bucket hatosuke-aws-sam
Uploading to a06192d233312809c3c4ed34f80715bd  853 / 853.0  (100.00%)
Successfully packaged artifacts and wrote output template to file packaged.yaml.
Execute the following command to deploy the packaged template
aws cloudformation deploy --template-file /Users/hatosuke/AWS_SAM/sam-app/packaged.yaml --stack-name <YOUR STACK NAME>

このコマンドは、sam-app/hello_world/ディレクトリをzipし、S3にアップロードしている。

作成されたpackaged.yamlは、アプリケーションをAWS Cloudにデプロイする際に使用する。

packaged.yamlは、初めの~/AWS_SAM/sam-app/template.yamlテンプレートに似ているが、1つ違いがある。S3バケットへのCodeUriプロパティがLambda関数のコードと依存関係を含んでいるかどうかである。

 

~/AWS_SAM/sam-app $ aws s3 ls hatosuke-aws-sam
2019-06-18 21:56:23        853 a06192d233312809c3c4ed34f80715bd

 

Step 4: アプリケーションのデプロイ

サーバーレスアプリケーションをAWS Cloudにアップ。

テンプレートで定義した全てのリソースをデプロイコマンドでデプロイする。

~/AWS_SAM/sam-app $ sam deploy \
> --template-file packaged.yaml \
> --stack-name sam-app \
> --capabilities CAPABILITY_IAM \
> --region ap-northeast-1

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - sam-app

–capabilities : AWS CloudFormationがIAMロールを作成できるようにする

AWS CloudFormationはテンプレートに定義しているAWSリソースを作成し、グルーピングし、1つのスタックにする。スタックはコンソールからアクセスできる。

 

AWS上でサーバーレスアプリケーションのテスト

1.アプリケーションでデプロイした”sam-app”をクリック

2.リソースの”ServerlessRestApi”をクリックして、”ServerlessRestApi”を開く

このままのURLで”Missing Authentication Token”と表示されてしまう。

 

“API エンドポイント”をクリックし、開いたURLに作成したメソッドの”/hello”をつけると、うまく表示される。

 

まとめ

手順通りに進めると簡単にAWS SAMはうまくできました。

ただ、この業界、スピードが早すぎて、どれがベストなのか、わからなくなりますね。日々勉強して、置いて行かれないようにしないと。

コメント

タイトルとURLをコピーしました