AWS SAMの チュートリアル: Hello World アプリケーションのデプロイをやってみる
AWS SAMを使おうとしたきっかけ
Lambda、API Gatewayを利用することで、簡単にREST APIを構築することが出来ます。しかも、AWS Management Console上で簡単なコードが記載できるため、非常に使い勝手が良いです。
しかし、私は、ローカルでソースコードを修正し、単体テストを行い、ソースコードはバージョン管理し、コマンド一つで上手くデプロイしたいです。コンソール上での管理が結構煩雑になってきていて、若干混乱気味です。
これらの要望を簡単に達成できる物として、AWS SAMというものがあるみたいです。AWS SAMでは、処理ロジック、おより、それらに関連するインフラ、ロールなどをyamlファイルで記載できるようです。このAWS SAMに関して、チュートリアルを実行したり、少しずつソースコードを修正していき、どのようなことが出来るのかを試していきます。
今回は、SAMのチュートリアルにある、Hello World アプリケーションを作成していきたいと思います。
環境情報
OS
- エディション Windows 10 Pro
- バージョン 21H2
- OS ビルド 19044.2965
ソフトウェア
- Python 3.9.13
- aws-cli/2.11.25 Python/3.11.3 Windows/10 exe/AMD64 prompt/off
- SAM CLI, version 1.85.0
- PSVersion 5.1.19041.2673
- git version 2.40.0.windows.1
AWS SAM CLI のインストール
AWSのドキュメント、AWS SAM CLI のインストールを参考に作業を進めていきます。
まずは下記インストーラを用いて、AWS SAM CLI をインストールします。
powershell上でコマンドを実行、正常にインストールされていれば下記のようにバージョンが出力されます。
PS E:\prog> sam --version
SAM CLI, version 1.85.0
次にロングパスを有効にします。SAMのアプリテンプレートの中にはパスの制限によって動かないことがあるらしく、それを回避するために設定が必要です。
下記コマンドを管理者権限で実行します。エラー無くパラメータが設定されれば問題ありません。
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" `
-Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force
チュートリアル: Hello World アプリケーションのデプロイを実施し、CodeCommitでコードを管理する
ここでは、チュートリアル: Hello World アプリケーションのデプロイを実施し、CodeCommitにてソースを管理します。
Hello World アプリケーションの初期化
まずはチュートリアル通りに sam init
を実行します。
PS E:\prog> 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 - Data processing
3 - Hello World Example with Powertools for AWS Lambda
4 - Multi-step workflow
5 - Scheduled task
6 - Standalone function
7 - Serverless API
8 - Infrastructure event management
9 - Lambda Response Streaming
10 - Serverless Connector Hello World Example
11 - Multi-step workflow with Connectors
12 - Lambda EFS example
13 - DynamoDB Example
14 - Machine Learning
Template: 1
Use the most popular runtime and package type? (Python and zip) [y/N]:
Which runtime would you like to use?
1 - aot.dotnet7 (provided.al2)
2 - dotnet6
3 - go1.x
4 - go (provided.al2)
5 - graalvm.java11 (provided.al2)
6 - graalvm.java17 (provided.al2)
7 - java17
8 - java11
9 - java8.al2
10 - java8
11 - nodejs18.x
12 - nodejs16.x
13 - nodejs14.x
14 - nodejs12.x
15 - python3.9
16 - python3.8
17 - python3.7
18 - python3.10
19 - ruby2.7
20 - rust (provided.al2)
Runtime: 15
What package type would you like to use?
1 - Zip
2 - Image
Package type: 1
Based on your selections, the only dependency manager available is pip.
We will proceed copying the template using pip.
Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]:
Would you like to enable monitoring using CloudWatch Application Insights?
For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]:
Project name [sam-app]: sam-hello-world
コマンドが完了次第、テンプレートがダウンロードされます。
-----------------------
Generating application:
-----------------------
Name: sam-hello-world
Runtime: python3.9
Architectures: x86_64
Dependency Manager: pip
Application Template: hello-world
Output Directory: .
Configuration file: sam-hello-world\samconfig.toml
Next steps can be found in the README file at sam-hello-world\README.md
Commands you can use next
=========================
[*] Create pipeline: cd sam-hello-world && sam pipeline init --bootstrap
[*] Validate SAM template: cd sam-hello-world && sam validate
[*] Test Function in the Cloud: cd sam-hello-world && sam sync --stack-name {stack-name} --watch
PS E:\prog>
エラー無く処理が終了し、フォルダが作成されていれば問題ありません。
PS E:\prog> cd .\sam-hello-world\
PS E:\prog\sam-hello-world> ls
ディレクトリ: E:\prog\sam-hello-world
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2023/06/18 11:15 events
d----- 2023/06/18 11:15 hello_world
d----- 2023/06/18 11:15 tests
-a---- 2023/06/18 11:15 3973 .gitignore
-a---- 2023/06/18 11:15 8555 README.md
-a---- 2023/06/18 11:15 718 samconfig.toml
-a---- 2023/06/18 11:15 1739 template.yaml
-a---- 2023/06/18 11:15 0 __init__.py
PS E:\prog\sam-hello-world>
CodeCommitでソースを管理する
ここで、作成されたファイルをCodeCommitにプッシュします。下記のようにリポジトリを作成します。
sam-hello-worldを一度退避し、リポジトリをクローン、ソースコードをプッシュします。
PS E:\prog> mv .\sam-hello-world\ .\sam-hello-world_2\
PS E:\prog> git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/sam-hello-world
Cloning into 'sam-hello-world'...
warning: You appear to have cloned an empty repository.
PS E:\prog> mv .\sam-hello-world_2\* .\sam-hello-world\
PS E:\prog> rm .\sam-hello-world_2\
PS E:\prog>
私は、普通にGUIアプリを使ってコミット&プッシュします...
アプリケーションをビルドする
チュートリアルに従って、sam build
を実行します。
PS E:\prog\sam-hello-world> sam build
Starting Build use cache
Manifest file is changed (new hash: 3298f13049d19cffaa37ca931dd4d421) or dependency folder
(.aws-sam\deps\ce0a0fc8-1fd9-45cb-9f49-ec763822f070) is missing for (HelloWorldFunction), downloading dependencies and
copying/building source
Building codeuri: E:\prog\sam-hello-world\hello_world runtime: python3.9 metadata: {} architecture: x86_64 functions:
HelloWorldFunction
Running PythonPipBuilder:CleanUp
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource
Running PythonPipBuilder:CopySource
Build Succeeded
Built Artifacts : .aws-sam\build
Built Template : .aws-sam\build\template.yaml
Commands you can use next
=========================
[*] Validate SAM template: sam validate
[*] Invoke Function: sam local invoke
[*] Test Function in the Cloud: sam sync --stack-name {{stack-name}} --watch
[*] Deploy: sam deploy --guided
PS E:\prog\sam-hello-world>
gitで差分を確認すると、かなり差分が出ています。ローカルのソースの場所などが乗っているので、.gitignoreで対象外にしてしまおうかと思います。
.gitignoreに追加
# Build folder
*/build/*
*/deps/*
.aws-sam/build.toml
アプリケーションをデプロイする。
チュートリアルと同様にsam deploy --guided
実行します。
PS E:\prog\sam-hello-world> sam deploy --guided
Configuring SAM deploy
======================
Looking for config file [samconfig.toml] : Found
Reading default arguments : Success
Setting default arguments for 'sam deploy'
=========================================
Stack Name [sam-hello-world]:
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]:
#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]:
#Preserves the state of previously provisioned resources when an operation fails
Disable rollback [y/N]:
HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
Save arguments to configuration file [Y/n]:
SAM configuration file [samconfig.toml]:
SAM configuration environment [default]:
Looking for resources needed for deployment:
Creating the required resources...
・・・・・・・・
Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]: y
・・・・・・・・
Key HelloWorldApi
Description API Gateway endpoint URL for Prod stage for Hello World function
Value https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/
デプロイが問題なく完了したら、curlコマンドで実際に動作しているか確認します。
PS E:\prog\sam-hello-world> curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/
StatusCode : 200
StatusDescription : OK
Content : {"message": "hello world"}
RawContent : HTTP/1.1 200 OK
上手く動作してくれました。
参考リンク
AWS SAM CLI のインストール - AWS Serverless Application Model
チュートリアル: Hello World アプリケーションのデプロイ - AWS Serverless Application Model
Discussion