🚴🏻‍♀️

SAMでのHello World

2023/01/16に公開

やりたいこと

SAMでの勉強整理としてのメモ
やることは以下。

  • 環境整備@Cloud9
  • sam init,sam build,sam deploy
  • sam local
  • pytest

環境整備

■pyenv

git

git clone https://github.com/yyuu/pyenv.git ~/.pyenv  

bash_profileの編集

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

bash_profileの適用

source ~/.bash_profile

python 3.9.0をInstall

Lambdaで利用可能なPythonに合わせたモノ

pyenv install 3.9.0

Version確認

3.9.0であることを確認

pyenv global 3.9.0
python --version

■AWS CLIをV1からV2へ

version確認

V1系であること

aws --version

uninstall

sudo yum remove awscli

installとbash読み込み

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
source ~/.bash_profile

version確認

V2系であること

aws --version

ゴミ削除

rm -rf aws awscliv2.zip

■SAMの最新化

SAMはCloud9にあるけど、最新化。手順は以下参照
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install-linux.html

手順を少し変えながら最新化

Releseの最新が反映されていること

wget https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip
unzip aws-sam-cli-linux-x86_64.zip -d sam-installation
sudo ./sam-installation/install --update
sam --version

ゴミ削除

rm -rf aws-sam-cli-linux-x86_64.zip sam-installation

SAMでHelloWorld

■init-build-deploy

init

sam init

設定した内容は以下

sam init
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 - Serverless Connector Hello World Example
        9 - Multi-step workflow with Connectors
        10 - Lambda EFS example
        11 - Machine Learning
Template: 1

Use the most popular runtime and package type? (Python and zip) [y/N]: N

Which runtime would you like to use?
        1 - aot.dotnet7 (provided.al2)
        2 - dotnet6
        3 - dotnet5.0
        4 - dotnetcore3.1
        5 - go1.x
        6 - go (provided.al2)
        7 - graalvm.java11 (provided.al2)
        8 - graalvm.java17 (provided.al2)
        9 - java11
        10 - java8.al2
        11 - java8
        12 - nodejs18.x
        13 - nodejs16.x
        14 - nodejs14.x
        15 - nodejs12.x
        16 - python3.9
        17 - python3.8
        18 - python3.7
        19 - ruby2.7
        20 - rust (provided.al2)
Runtime: 16

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]: 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]: N

Project name [sam-app]: sam-app-1

Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment)

    -----------------------
    Generating application:
    -----------------------
    Name: sam-app-1
    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-app-1/README.md

build

cd sam-app-1
sam build

deploy

sam deploy --guided

設定した内容は以下

sam deploy
Configuring SAM deploy
======================

        Looking for config file [samconfig.toml] :  Not found

        Setting default arguments for 'sam deploy'
        =========================================
        Stack Name [sam-app]: sam-app-1
        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:
         Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-1hsg213hvqm87
         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-app-1/5497b8fae9a252df24ea97cfa575db8a  619129 / 619129  (100.00%)

        Deploying with following values
        ===============================
        Stack name                   : sam-app-1
        Region                       : ap-northeast-1
        Confirm changeset            : False
        Disable rollback             : False
        Deployment s3 bucket         : aws-sam-cli-managed-default-samclisourcebucket-1hsg213hvqm87
        Capabilities                 : ["CAPABILITY_IAM"]
        Parameter overrides          : {}
        Signing Profiles             : {}

Initiating deployment
=====================
Uploading to sam-app-1/f0431308e328641961235682384a4430.template  1206 / 1206  (100.00%)

Waiting for changeset to be created..
CloudFormation stack changeset
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Operation                                       LogicalResourceId                               ResourceType                                    Replacement                                   
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Add                                           HelloWorldFunctionHelloWorldPermissionProd      AWS::Lambda::Permission                         N/A                                           
+ Add                                           HelloWorldFunctionRole                          AWS::IAM::Role                                  N/A                                           
+ Add                                           HelloWorldFunction                              AWS::Lambda::Function                           N/A                                           
+ Add                                           ServerlessRestApiDeployment47fc2d5f9d           AWS::ApiGateway::Deployment                     N/A                                           
+ Add                                           ServerlessRestApiProdStage                      AWS::ApiGateway::Stage                          N/A                                           
+ Add                                           ServerlessRestApi                               AWS::ApiGateway::RestApi                        N/A                                           
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:123456789012:changeSet/samcli-deploy1673792015/6f514082-9e3d-44cd-9374-e7f91a6c4730


2023-01-15 14:13:47 - Waiting for stack create/update to complete

CloudFormation events from stack operations (refresh every 0.5 seconds)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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_IN_PROGRESS                              AWS::ApiGateway::RestApi                        ServerlessRestApi                               -                                             
CREATE_IN_PROGRESS                              AWS::ApiGateway::RestApi                        ServerlessRestApi                               Resource creation Initiated                   
CREATE_COMPLETE                                 AWS::ApiGateway::RestApi                        ServerlessRestApi                               -                                             
CREATE_IN_PROGRESS                              AWS::ApiGateway::Deployment                     ServerlessRestApiDeployment47fc2d5f9d           -                                             
CREATE_IN_PROGRESS                              AWS::Lambda::Permission                         HelloWorldFunctionHelloWorldPermissionProd      -                                             
CREATE_IN_PROGRESS                              AWS::Lambda::Permission                         HelloWorldFunctionHelloWorldPermissionProd      Resource creation Initiated                   
CREATE_IN_PROGRESS                              AWS::ApiGateway::Deployment                     ServerlessRestApiDeployment47fc2d5f9d           Resource creation Initiated                   
CREATE_COMPLETE                                 AWS::ApiGateway::Deployment                     ServerlessRestApiDeployment47fc2d5f9d           -                                             
CREATE_IN_PROGRESS                              AWS::ApiGateway::Stage                          ServerlessRestApiProdStage                      -                                             
CREATE_IN_PROGRESS                              AWS::ApiGateway::Stage                          ServerlessRestApiProdStage                      Resource creation Initiated                   
CREATE_COMPLETE                                 AWS::ApiGateway::Stage                          ServerlessRestApiProdStage                      -                                             
CREATE_COMPLETE                                 AWS::Lambda::Permission                         HelloWorldFunctionHelloWorldPermissionProd      -                                             
CREATE_COMPLETE                                 AWS::CloudFormation::Stack                      sam-app-1                                       -                                             
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CloudFormation outputs from deployed stack
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Outputs                                                                                                                                                                                      
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Key                 HelloWorldFunctionIamRole                                                                                                                                                
Description         Implicit IAM Role created for Hello World function                                                                                                                       
Value               arn:aws:iam::123456789012:role/sam-app-1-HelloWorldFunctionRole-17TEJXE38WVEX                                                                                            

Key                 HelloWorldApi                                                                                                                                                            
Description         API Gateway endpoint URL for Prod stage for Hello World function                                                                                                         
Value               https://xxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/                                                                                                  

Key                 HelloWorldFunction                                                                                                                                                       
Description         Hello World Lambda Function ARN                                                                                                                                          
Value               arn:aws:lambda:ap-northeast-1:123456789012:function:sam-app-1-HelloWorldFunction-uWkvXSPEyq3Z                                                                            
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Successfully created/updated stack - sam-app-1 in ap-northeast-1

API Call

実行

curl https://xxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/

結果

{"message": "hello world"}

■local invoke

ローカル環境でのLambda実行

sam local invoke HelloWorldFunction

結果

Invoking app.lambda_handler (python3.9)
Skip pulling image and use local one: public.ecr.aws/sam/emulation-python3.9:rapid-1.70.0-x86_64.

Mounting /home/ec2-user/environment/sam-app-1/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container
START RequestId: ef693a60-ba5d-47ca-a8e6-d07b741c102f Version: $LATEST
END RequestId: ef693a60-ba5d-47ca-a8e6-d07b741c102f
REPORT RequestId: ef693a60-ba5d-47ca-a8e6-d07b741c102f  Init Duration: 0.13 ms  Duration: 474.97 ms     Billed Duration: 475 ms Memory Size: 128 MB     Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\": \"hello world\"}"}

■local start-api

ローカルでAPI GATEWAY経由で実行

sam local start-api

別ターミナルで実行

curl http://127.0.0.1:3000/hello

結果

Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
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. If you used sam build before running local commands, you will need to re-run sam build for the changes to be picked up. You only need to restart SAM CLI if you update your AWS SAM template
2023-01-16 03:08:15  * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)
Invoking app.lambda_handler (python3.9)
Skip pulling image and use local one: public.ecr.aws/sam/emulation-python3.9:rapid-1.70.0-x86_64.

Mounting /home/ec2-user/environment/sam-app-1/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container
END RequestId: dda01c01-9691-472d-b79c-35773573e7c8
REPORT RequestId: dda01c01-9691-472d-b79c-35773573e7c8  Init Duration: 0.05 ms  Duration: 87.90 ms      Billed Duration: 88 ms  Memory Size: 128 MB     Max Memory Used: 128 MB
No Content-Type given. Defaulting to 'application/json'.
2023-01-16 03:09:04 127.0.0.1 - - [16/Jan/2023 03:09:04] "GET /hello HTTP/1.1" 200 -

別ターミナルの結果

{"message": "hello world"}

■local start-lambda

エンドポイント経由で実行

sam local start-lambda

別ターミナルで実行

cd ~/environment/sam-app-1
aws lambda invoke --function-name "HelloWorldFunction" --endpoint-url "http://127.0.0.1:3001" --payload file://events/event.json --cli-binary-format raw-in-base64-out response.json
cat response.json

結果

am local start-lambda
Starting the Local Lambda Service. You can now invoke your Lambda Functions defined in your template through the endpoint.
2023-01-16 03:12:22  * Running on http://127.0.0.1:3001/ (Press CTRL+C to quit)
Invoking app.lambda_handler (python3.9)
Skip pulling image and use local one: public.ecr.aws/sam/emulation-python3.9:rapid-1.70.0-x86_64.

Mounting /home/ec2-user/environment/sam-app-1/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container
START RequestId: 08533001-42ed-4ca8-b5fa-76ff73eb2883 Version: $LATEST
END RequestId: 08533001-42ed-4ca8-b5fa-76ff73eb2883
REPORT RequestId: 08533001-42ed-4ca8-b5fa-76ff73eb2883  Init Duration: 2.62 ms  Duration: 66.94 ms      Billed Duration: 67 ms  Memory Size: 128 MB     Max Memory Used: 128 MB
2023-01-16 03:53:08 127.0.0.1 - - [16/Jan/2023 03:53:08] "POST /2015-03-31/functions/HelloWorldFunction/invocations HTTP/1.1" 200 -

別ターミナル結果

{"statusCode": 200, "body": "{\"message\": \"hello world\"}"}

ローカルテスト

Install

pip install pytest

Version確認

Version確認というよりInstall確認かな。入って居れば良い。

pytest --version

実行と結果

実行

cd ~/environment/sam-app-1/
pytest ./tests/unit/test_handler.py 

結果

================================================================================ test session starts ================================================================================
platform linux -- Python 3.9.0, pytest-7.2.1, pluggy-1.0.0
rootdir: /home/ec2-user/environment/sam-app-1
collected 1 item                                                                                                                                                                    

tests/unit/test_handler.py .                                                                                                                                                  [100%]

================================================================================= 1 passed in 0.04s =================================================================================

Discussion