👻

AWS SAMの チュートリアル: Hello World アプリケーションのデプロイをやってみる

2023/06/18に公開

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