概要
前のLambda投稿に続き今回もAWS Lambdaネタになります。
今回はLambda構築・設定・イベントソースマッピングからソースコードを管理・編集しやすいようにAWS サーバーレスアプリケーションモデル (Serverless Application Model)、AWS SAMにチャレンジします。
サンプルコードなどの簡単なプログラミングであればAWSコンソールで設定、ソースコードの直接編集すれば良いのですが、ちょっと規模が大きくなるとLambdaの設定・ソースコードをしっかり管理したい、しっかりテストしたいという状況が出てきます。
その時にかなり便利なのがAWS サーバーレスアプリケーションモデル(AWS SAM)になります。
Lambdaを使って本格的にLambdaのサービスを運用したい人、興味がある方は読んでみて下さい。
資格試験の勉強法は記事は以下を参照。
AWS初心者がAWS 認定ソリューションアーキテクト – アソシエイト資格試験に合格した時の勉強法
AWS初心者がAWS 認定ソリューションアーキテクト – プロフェッショナル資格試験に合格した時の勉強法
想定読者
- LambdaでSAMを使ってみたい人
- Lambdaの知識をレベルアップしたい人
- Lambdaを実運用で使っている人
参考書籍
ほぼほぼこの本を参考にさせて頂きました。
Lambdaに特化した本はあまりないので現時点で唯一の専門書と思います。
2022年になって第2版となり内容が最新化されています。
Lambdaの良書が増えてきたので、おすすめ本5冊を以下で紹介しています。Lambdaについて本格的に勉強したい方はぜひ読んでみてください。
目次
- SAM環境(Cloud9環境)準備
- SAM初期設定
- SAMビルド/デプロイ
SAMを使って簡単なLambda関数を作っていきます。
作業時間、たったの 30分!
SAM環境(Cloud9環境)準備
SAMを使うためには SAM CLI がインストールされている必要があります。
ローカル環境でインストールしても良いのですが、AWS の Cloud9 を使うのが一番簡単なので今回はCloud9の環境準備から説明します。
Cloud9の作成は非常に簡単で、AWSコンソールのCloud9のサービスメニュに行き、
Nameに任意の名前を入力
Next stepをクリック
環境設定は、基本的には任意のものを選択していいのですが、ブラウザからそのままアクセスが出来て簡単なのが direct access 、料金が安く済むものが t2.micro になります。
料金節約のため無操作30分後に自動停止するよう After 30 minutes(default) のままにしておきます。
Network settingd(advanced) はデフォルトVPC以外に作りたい時(Cloud9へのアクセスをしっかりアクセス制御したい時)に選択します。
Next step をクリック
設定内容を最終確認して問題なければ、Create environment クリック
数分待つとこんな感じのCloud9のトップ画面が表示されます。
実際の操作は左メニューから編集したいファイルを選択し画面中央部で編集する操作と、画面下部のコンソール部分に直接コマンドを実行する大きく2パターンの操作があります。
SAM初期設定(sam init)
それでは実際にSAMの初期設定をしていきます。
画面下部のコンソールに sam init のコマンドを実行して初期設定します。
$ pwd
/home/ec2-user/environment
$ sam init
You can preselect a particular runtime or package type when using the `sam init` experience.
Call `sam init --help` to learn more.
Which template source would you like to use?
1 - AWS Quick Start Templates
2 - Custom Template Location
Choice: 1
Choose an AWS Quick Start application template
1 - Hello World Example
2 - Multi-step workflow
3 - Serverless API
4 - Scheduled task
5 - Standalone function
6 - Data processing
7 - Infrastructure event management
8 - Lambda EFS example
9 - Machine Learning
Template: 1
Use the most popular runtime and package type? (Python and zip) [y/N]: y
Project name [sam-app]: sam-example
Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment)
-----------------------
Generating application:
-----------------------
Name: sam-example
Runtime: python3.9
Architectures: x86_64
Dependency Manager: pip
Application Template: hello-world
Output Directory: .
Next steps can be found in the README file at ./sam-example/README.md
Commands you can use next
=========================
[*] Create pipeline: cd sam-example && sam pipeline init --bootstrap
[*] Test Function in the Cloud: sam sync --stack-name {stack-name} --watch
SAM CLI update available (1.53.0); (1.40.1 installed)
To download: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html
$
実際の入力値は以下の4つ
- Choice: 1(1 - AWS Quick Start Templates)
- Template: 1(1 - Hello World Example)
- Use the most popular runtime and package type? (Python and zip) [y/N]: y
- Project name [sam-app]: sam-example
sam-example というプロジェクト名で、実行環境 python3.9、samテンプレート Hello World Example を選択(テンプレートはすぐに自分で編集するのでなんでも構いません)しています。
sam init コマンドが完了するとひと通り必要なフォルダ・ファイル群が作成されます。
この中で重要なのが、
- app.py:Lambdaのソースプログラムが記載されているファイル
- template.yml:Lambdaの設定が記載されているファイル
の二つになります。
それぞれ中身を簡単に見てみます。
まずは template.yml から。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
sam-example
Sample SAM Template for sam-example
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
Function:
Timeout: 3
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.9
Architectures:
- x86_64
Events:
HelloWorld:
Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
Properties:
Path: /hello
Method: get
Outputs:
# ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
# Find out more about other implicit resources you can reference within SAM
# https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
HelloWorldApi:
Description: "API Gateway endpoint URL for Prod stage for Hello World function"
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
HelloWorldFunction:
Description: "Hello World Lambda Function ARN"
Value: !GetAtt HelloWorldFunction.Arn
HelloWorldFunctionIamRole:
Description: "Implicit IAM Role created for Hello World function"
Value: !GetAtt HelloWorldFunctionRole.Arn
Hello World Example のテンプレートの場合、LambdaとAPIGatewayが含まれています。
Resources: 部がそれらの記述に該当しますが
- Type: AWS::Serverless::Function:Lambdaであることを示しています
- Type: Api:APIGatewayであることを示しています
今回は、最小限のLambdaだけの設定にしたいので以下に書き換えます。(ついでにコメントも消してすっきりさせます)
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
sam-example
Sample SAM Template for sam-example
Globals:
Function:
Timeout: 3
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
Handler: app.lambda_handler
Runtime: python3.9
Outputs:
HelloWorldFunction:
Description: "Hello World Lambda Function ARN"
Value: !GetAtt HelloWorldFunction.Arn
HelloWorldFunctionIamRole:
Description: "Implicit IAM Role created for Hello World function"
Value: !GetAtt HelloWorldFunctionRole.Arn
Description と Outputs は無くても良い設定のため必要なのは、Globals と Resources 部だけになり、たった 9行 です。
次は app.py です。
このファイルがLambdaの本体のプログラムになります。
今後、自分でプログラムを書き換えるときはこのファイルを編集します。
import json
# import requests
def lambda_handler(event, context):
"""Sample pure Lambda function
Parameters
----------
event: dict, required
API Gateway Lambda Proxy Input Format
Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format
context: object, required
Lambda Context runtime methods and attributes
Context doc: https://docs.aws.amazon.com/lambda/latest/dg/python-context-object.html
Returns
------
API Gateway Lambda Proxy Output Format: dict
Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
"""
# try:
# ip = requests.get("http://checkip.amazonaws.com/")
# except requests.RequestException as e:
# # Send some context about this error to Lambda Logs
# print(e)
# raise e
return {
"statusCode": 200,
"body": json.dumps({
"message": "hello world",
# "location": ip.text.replace("\n", "")
}),
}
こちらはシンプルですね。
コメントがたくさんありますが、戻り値にjson形式の hello world も返却しているだけになってます。
SAMビルド/デプロイ(sam build/sam deploy)
ビルド
では、ビルド/デプロイをやっていきましょう。
template.yml を編集したため、シンプルに Lambda関数1つ を作成するsamテンプレートになっています。
では、ここからはコンソール操作になるので、Cloud9画面下部のコンソール部分でコマンド実行します。
まず、カレントフォルダを ~/environment/sam-example/ (自身で入力したプロジェクトフォルダ)に移動して、ビルドコマンド sam build --use-container を実行します。
実際の実行コマンドは以下の2つ
cd ~/environment/sam-example/
sam build --use-container
では、やってみます。
$ cd ~/environment/sam-example/
$ sam build --use-container
Starting Build inside a container
Building codeuri: /home/ec2-user/environment/sam-example runtime: python3.9 metadata: {} architecture: x86_64 functions: ['HelloWorldFunction']
Fetching public.ecr.aws/sam/build-python3.9:latest-x86_64 Docker container image...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Mounting /home/ec2-user/environment/sam-example as /tmp/samcli/source:ro,delegated inside runtime container
Traceback (most recent call last):
File "samcli/__main__.py", line 12, in <module>
File "click/core.py", line 829, in __call__
File "click/core.py", line 782, in main
File "click/core.py", line 1259, in invoke
File "click/core.py", line 1066, in invoke
File "click/core.py", line 610, in invoke
File "click/decorators.py", line 73, in new_func
File "click/core.py", line 610, in invoke
File "samcli/lib/telemetry/metric.py", line 153, in wrapped
File "samcli/lib/telemetry/metric.py", line 122, in wrapped
File "samcli/lib/utils/version_checker.py", line 42, in wrapped
File "samcli/cli/main.py", line 90, in wrapper
File "samcli/commands/build/command.py", line 228, in cli
File "samcli/commands/build/command.py", line 318, in do_cli
File "samcli/lib/build/app_builder.py", line 172, in build
File "samcli/lib/build/build_strategy.py", line 42, in build
File "samcli/lib/build/build_strategy.py", line 53, in _build_functions
File "samcli/lib/build/build_strategy.py", line 129, in build_single_function_definition
File "samcli/lib/build/app_builder.py", line 572, in _build_function
File "samcli/lib/build/app_builder.py", line 705, in _build_function_on_container
File "samcli/local/docker/container.py", line 308, in wait_for_logs
RuntimeError: Container does not exist. Cannot get logs for this container
[19020] Failed to execute script __main__
おそらく、 RuntimeError: Container does not exist. Cannot get logs for this container エラーが発生します。
ビルドコマンドのオプションで --use-container(実行環境をコンテナ上に作成するオプション)を付けているのですが、Cloud9の初期ディスクだと足りません。。。
(非常にわかりにくいエラーメッセージですね。。。)
なぜなら、、、
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 484M 0 484M 0% /dev
tmpfs 492M 0 492M 0% /dev/shm
tmpfs 492M 468K 491M 1% /run
tmpfs 492M 0 492M 0% /sys/fs/cgroup
/dev/xvda1 10G 8.2G 1.9G 82% /
tmpfs 99M 0 99M 0% /run/user/1000
すでにディスク容量の 82% しており、 1.9G しか残りがないからです。。。
(sam init で大量にディスクを消費したのではなく、Cloud9は最初からディスクが少ないようです。。。)
Cloud9ディスク拡張
では、Cloud9のディスクを増やしましょう。
Cloud9はEC2のLinux上で実現されているのでEC2のメニューからLinuxのディスク拡張操作を行います。
Linuxの場合、ディスク拡張は簡単で、Cloud9を作成すると自動的にEC2のメニューに専用のEC2が出来上がっているので、そのEC2を止めた状態で、EC2のボリュームのメニューのディスクの変更からサイズを増やすだけです。
以上です。
再度EC2を起動し、Cloud9のコンソールからディスクが増えていることを確認します
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 484M 0 484M 0% /dev
tmpfs 492M 0 492M 0% /dev/shm
tmpfs 492M 464K 491M 1% /run
tmpfs 492M 0 492M 0% /sys/fs/cgroup
/dev/xvda1 15G 8.2G 6.9G 55% /
tmpfs 99M 0 99M 0% /run/user/1000
使用率 55% 残り 6.9GB になりました。
では、改めてビルドしましょう。
再ビルド
$ cd ~/environment/sam-example/
$ sam build --use-container
Starting Build inside a container
Building codeuri: /home/ec2-user/environment/sam-example runtime: python3.9 metadata: {} architecture: x86_64 functions: ['HelloWorldFunction']
Fetching public.ecr.aws/sam/build-python3.9:latest-x86_64 Docker container image...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Mounting /home/ec2-user/environment/sam-example as /tmp/samcli/source:ro,delegated inside runtime container
Build Succeeded
Built Artifacts : .aws-sam/build
Built Template : .aws-sam/build/template.yaml
Commands you can use next
=========================
[*] Invoke Function: sam local invoke
[*] Deploy: sam deploy --guided
requirements.txt file not found. Continuing the build without dependencies.
Running PythonPipBuilder:CopySource
$
今度は成功しました。
ビルド後のディスク容量も確認しておきましょう。
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 484M 0 484M 0% /dev
tmpfs 492M 0 492M 0% /dev/shm
tmpfs 492M 464K 491M 1% /run
tmpfs 492M 0 492M 0% /sys/fs/cgroup
/dev/xvda1 15G 11G 4.6G 70% /
tmpfs 99M 0 99M 0% /run/user/1000
$
使用率 70% 残り 4.6GB になりました。
ビルド前と比較すると 2.3GB 使用するようですね。結構使いますね。。。
デプロイ
では、いよいよデプロイです。
sam deploy --guided --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND デプロイ時のガイド付き、ロール等は自動で作成するオプションを付けています。
実行コマンドは以下の1つ。
sam deploy --guided --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND
実行します。
$ sam deploy --guided --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND
Configuring SAM deploy
======================
Looking for config file [samconfig.toml] : Not found
Setting default arguments for 'sam deploy'
=========================================
Stack Name [sam-app]: sam-sample
AWS Region [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 configuration file [Y/n]: y
SAM configuration file [samconfig.toml]:
SAM configuration environment [default]:
Looking for resources needed for deployment:
Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-bncdmvrv3w3n
A different default S3 bucket can be set in samconfig.toml
Saved arguments to config file
Running 'sam deploy' for future deployments will use the parameters saved above.
The above parameters can be changed by modifying samconfig.toml
Learn more about samconfig.toml syntax at
https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html
Uploading to sam-sample/1c2f1111422c1a9a068bc3d12653d3c4 7913 / 7913 (100.00%)
Deploying with following values
===============================
Stack name : sam-sample
Region : ap-northeast-1
Confirm changeset : True
Deployment s3 bucket : aws-sam-cli-managed-default-samclisourcebucket-bncdmvrv3w3n
Capabilities : ["CAPABILITY_IAM", "CAPABILITY_AUTO_EXPAND"]
Parameter overrides : {}
Signing Profiles : {}
Initiating deployment
=====================
Uploading to sam-sample/cc7378c1e1ecf6a93a04bc81b3006223.template 768 / 768 (100.00%)
Waiting for changeset to be created..
CloudFormation stack changeset
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Operation LogicalResourceId ResourceType Replacement
-------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Add HelloWorldFunctionRole AWS::IAM::Role N/A
+ Add HelloWorldFunction AWS::Lambda::Function N/A
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXX:changeSet/samcli-deploy1651456975/245e03ef-407d-b1c6-43702e5cd1b3-e61b
Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]: y
2022-05-02 02:03:09 - Waiting for stack create/update to complete
CloudFormation events from changeset
-------------------------------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus ResourceType LogicalResourceId ResourceStatusReason
-------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole -
CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole Resource creation Initiated
CREATE_COMPLETE AWS::IAM::Role HelloWorldFunctionRole -
CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction -
CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction Resource creation Initiated
CREATE_COMPLETE AWS::Lambda::Function HelloWorldFunction -
CREATE_COMPLETE AWS::CloudFormation::Stack sam-sample -
-------------------------------------------------------------------------------------------------------------------------------------------------------------
CloudFormation outputs from deployed stack
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Outputs
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Key HelloWorldFunctionIamRole
Description Implicit IAM Role created for Hello World function
Value arn:aws:iam::XXXXXXXXXXXX:role/sam-sample-HelloWorldFunctionRole-11AUZUABC6ASS
Key HelloWorldFunction
Description Hello World Lambda Function ARN
Value arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:sam-sample-HelloWorldFunction-y2SU9rABc52s
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Successfully created/updated stack - sam-sample in ap-northeast-1
$
ガイド付きなので何回か質問があるので確認して選択しましょう。
Stack Name は、自分で決める任意の名称になります。
ちなみに次回以降の更新の時は選択内容が保持されるため sam deploy コマンドでサクッとデプロイできます。
$ sam deploy
Uploading to sam-sample/287342c7c37cb1d8020451b36647bd1f 452838 / 452838 (100.00%)
Deploying with following values
===============================
Stack name : sam-sample
Region : ap-northeast-1
Confirm changeset : True
Deployment s3 bucket : aws-sam-cli-managed-default-samclisourcebucket-bncdmvrv3w3n
Capabilities : ["CAPABILITY_IAM", "CAPABILITY_AUTO_EXPAND"]
Parameter overrides : {}
Signing Profiles : {}
Initiating deployment
=====================
Uploading to sam-sample/17c228278a608cc7c3f55da042cf1ae7.template 768 / 768 (100.00%)
Waiting for changeset to be created..
CloudFormation stack changeset
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Operation LogicalResourceId ResourceType Replacement
-------------------------------------------------------------------------------------------------------------------------------------------------------------
* Modify HelloWorldFunction AWS::Lambda::Function False
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXX:changeSet/samcli-deploy1651457546/3cc5876f-4d81-a290-7cbc821840ed-5d26
Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]: y
2022-05-02 02:12:41 - Waiting for stack create/update to complete
CloudFormation events from changeset
-------------------------------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus ResourceType LogicalResourceId ResourceStatusReason
-------------------------------------------------------------------------------------------------------------------------------------------------------------
UPDATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction -
UPDATE_COMPLETE AWS::Lambda::Function HelloWorldFunction -
UPDATE_COMPLETE_CLEANUP_IN_PROGRESS AWS::CloudFormation::Stack sam-sample -
UPDATE_COMPLETE AWS::CloudFormation::Stack sam-sample -
-------------------------------------------------------------------------------------------------------------------------------------------------------------
CloudFormation outputs from deployed stack
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Outputs
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Key HelloWorldFunctionIamRole
Description Implicit IAM Role created for Hello World function
Value arn:aws:iam::XXXXXXXXXXXX:role/sam-sample-HelloWorldFunctionRole-11AUZUANR6ASS
Key HelloWorldFunction
Description Hello World Lambda Function ARN
Value arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:sam-sample-HelloWorldFunction-yrJDo52s2SU9
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Successfully created/updated stack - sam-sample in ap-northeast-1
$
Outputs に作成されたLambda関数のARNが表示されているので確認して、AWSコンソールからLambdaを確認してみましょう。今回の例だとLambda関数名は sam-sample-HelloWorldFunction-yrJDo52s2SU9 になります。
デプロイされたLambdaの設定を画面を確認すると --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND オプションのおかげで必要なロールが自動作成されていることがわかります。
もちろん app.py の内容がLambdaの コードソース 部分で確認できると思います。
あとは通常のコンソール操作のtestから動作確認可能です。簡単ですね。
まとめ
お疲れ様でした!
今回はLambdaでsamを使って作成してみました。簡単なLambdaであれば、AWSコンソールで十分なのですが、Lambdaと連携するAWSサービスが増えてくれるとAWSコンソールだけではどこに何を設定したか把握しきれず限界が来ると思います。
そこでプログラムを app.py に、環境設定を template.yml にしておけば非常に管理しやすくなりますね。(テキストなのでGitでバージョン管理したり差分比較したり簡単になります)
samを使ってプログラムに集中出来るサーバーレスLambdaがもっと便利になって、開発者はより業務ロジックに集中出来る世の中になれば良いなと思います(^^)
本投稿が少しでも皆さんの良いサーバーレスライフの助けになればと思います(_ _)
資格取得に向けてAWSサービスを実際に利用してみるシリーズの投稿一覧
とりあえず30分でAWS利用料金の高額請求に備える~予算アラート設定・MFA・料金確認~
AWS ECSでDocker環境を試してみる
Amazon Cognitoを使ってシンプルなログイン画面を作ってみる
AWS NATゲートウェイを使ってプライベートサブネットからインターネットにアクセスする
API GatewayをPrivateで作成してみる
AWSのAI(Rekognition/Polly/Transcribe/Comprehend/Translate/Textract)サービスを試してみる
AWS Lambda 同時実行数、エイリアス、環境変数とか実際の現場で使える機能を勉強してみる
AWS Lambda SAMとは?~AWS SAMを使ってPythonのLambdaプログラムを簡単に作成する~(本記事)
AWS SAMを使って最もシンプルにLambda × APIGatewayのWebAPIを構築する
AWS SAMを使って最もシンプルにLambda × S3 のS3イベント駆動プログラムを構築する
Cloud9でAWS Amplifyの公式チュートリアルGetting startedをやってみる