DEVELOPER BLOG

開発者ブログ

HOME > 開発者ブログ > 【AWS入門】AWS SAM CLIを使用したサーバーレスアプリケーション構築 - PrismScaler

【AWS入門】AWS SAM CLIを使用したサーバーレスアプリケーション構築 - PrismScaler

1. はじめに

こんにちは!株式会社Definerのライターチームです! 今回は、AWS SAM CLIを使用したサーバーレスアプリケーションの構築方法について気になりますよね。 実際の画面や、資源を見ながら詳しく解説していきましょう。

2. 目的・ユースケース

この記事では、AWS SAM CLIを使ってサーバレスアプリを構築したいときに、参考になる情報やプラクティスをまとめています。

3. AWS SAMとは

SAMは、AWS が公式で提供しているサーバーレスアプリケーションを構築するためのフレームワークです。 Lambda,、API Gateway、 DynamoDBなどのサーバレスリソースをひとまとめに管理することができます。 実際はCloudformationの拡張のようなもので、yamlまたはjsonで定義することができます。  

4. AWS SAM CLIのセットアップ

早速、AWS SAM CLIを使ってサーバレスアプリケーションを構築していきます。   まずは、AWS SAM CLIのセットアップを行います。 デフォルトでAWS SAM CLIがインストールされているCloud9を使用しました。   ①samの初期設定 「sam init」コマンドを使って、初期設定をしていきます。 今回は、「AWS Quick Start Templates」の「Hello World Example」を使用しました。 初期設定が完了すると、ディレクトリ内に各種ファイルが作成されていることが確認できます。   ②pythonのバージョンを揃える OSのpythonのバージョンは3.7、template.yaml内のバージョンは3.9でした。 template.yamlで指定されているpythonのバージョンを3.7に変更します。  
## SAM CLIのバージョン確認
USERNAME:~/environment $ sam --version
SAM CLI, version 1.57.0


## SAMの初期設定
USERNAME:~/environment $ sam init

        SAM CLI now collects telemetry to better understand customer needs.

        You can OPT OUT and disable telemetry collection by setting the
        environment variable SAM_CLI_TELEMETRY=0 in your shell.
        Thanks for your help!

        Learn More: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-telemetry.html


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

Would you like to enable X-Ray tracing on the function(s) in your application?  [y/N]: N

Project name [sam-app]: sam-test

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

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

    Commands you can use next
    =========================
    [*] Create pipeline: cd sam-test && sam pipeline init --bootstrap
    [*] Validate SAM template: sam validate
    [*] Test Function in the Cloud: sam sync --stack-name {stack-name} --watch
    

SAM CLI update available (1.61.0); (1.57.0 installed)
To download: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html


## 初期設定完了
## sam-testというディレクトリが作成されている。
USERNAME:~/environment $ ls
README.md  sam-test
USERNAME:~/environment $ cd sam-test/
USERNAME:~/environment/sam-test $ ls
events  hello_world  __init__.py  README.md  template.yaml  tests                
## pythonのバージョンは3.7
USERNAME:~/environment $ python --version
Python 3.7.10


## template.yamlファイル内のpythonのバージョンは3.9
USERNAME:~/environment/sam-test $ cat template.yaml 
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  sam-test

  Sample SAM Template for sam-test

# 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


## template.yamlのpythonバージョンを修正します 3.9→3.7
USERNAME:~/environment $ vim template.yaml                  

5. AWS SAMを用いたサーバレスアプリケーションの構築

準備が終わったところで、サーバレスアプリケーションの構築部分に入ります。   ①ビルド 「sam build」コマンドで、ビルドを実施します。   ②ローカル実行 「sam local invoke」コマンドで、ローカルで実行します。 成功し、Hello Worldが表示されました。   ③デプロイ 「sam deploy --guided」コマンドで、AWSにデプロイします。 デプロイが成功後、AWSコンソールにアクセスすると、CloudformationのスタックやLambdaが作成されていることが確認できます。   AWS SAM CLIで簡単にサーバレスアプリケーションが構築できました!
## ビルド
USERNAME:~/environment/sam-test $ sam build
Your template contains a resource with logical ID "ServerlessRestApi", which is a reserved logical ID in AWS SAM. It could result in unexpected behaviors and is not recommended.
Building codeuri: /home/ec2-user/environment/sam-test/hello_world runtime: python3.7 metadata: {} architecture: x86_64 functions: HelloWorldFunction
Running PythonPipBuilder:ResolveDependencies
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


## ローカル実行
USERNAME:~/environment/sam-test $ sam local invoke
Invoking app.lambda_handler (python3.7)
Image was not found.
Removing rapid images for repo public.ecr.aws/sam/emulation-python3.7
Building image..........................................................................................................................................................................................................................................................................................................
Skip pulling image and use local one: public.ecr.aws/sam/emulation-python3.7:rapid-1.57.0-x86_64.

Mounting /home/ec2-user/environment/sam-test/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container
END RequestId: XXXXXXXXXXX
REPORT RequestId: XXXXXXXXXXXXX  Init Duration: 0.73 ms  Duration: 105.84 ms     Billed Duration: 106 ms Memory Size: 128 MB     Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\": \"hello world\"}"}                
## デプロイ
USERNAME:~/environment/sam-test $ sam deploy --guided

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

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

        Setting default arguments for 'sam deploy'
        =========================================
        Stack Name [sam-app]: sam-test
        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
        #Preserves the state of previously provisioned resources when an operation fails
        Disable rollback [y/N]: y
        HelloWorldFunction may not have authorization defined, Is this okay? [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:
        Creating the required resources...
        Successfully created!
         Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-Xxxxxxxx
         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-test/1007baxxxxxxx92f298d  466367 / 466367  (100.00%)

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

Initiating deployment
=====================
Uploading to sam-test/3b61a95a683xxxxxxxxxd6.template  1183 / 1183  (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:xxxxxxxxxx:changeSet/samcli-deploy166xxxxx05/08xxxxxxxxxfa-9c97177f9a11


Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]: y

2022-11-01 03:05:31 - 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-test                                               -                                                    
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CloudFormation outputs from deployed stack
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Outputs                                                                                                                                                                                                                   
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Key                 HelloWorldFunctionIamRole                                                                                                                                                                             
Description         Implicit IAM Role created for Hello World function                                                                                                                                                    
Value               arn:aws:iam::xxxxxxxxx:role/sam-test-HelloWorldFunctionRole-U4PFODQMD3N8                                                                                                                           

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

Key                 HelloWorldFunction                                                                                                                                                                                    
Description         Hello World Lambda Function ARN                                                                                                                                                                       
Value               arn:aws:lambda:ap-northeast-1:xxxxxxxxx:function:sam-test-HelloWorldFunction-jwLlJxxxxxxx                                                                                                          
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

6. 引用・参考記事

7. 独自ソリューション「PrismScaler」について

PrismScalerは、開発・運用を要さずにたった3ステップで、AWSやAzure、GCPなどのマルチクラウド基盤構築を実現するWebサービスです。 エンジニアの大変な作業を肩代わり ・自動構築 ・自動監視 ・構成可視化 クラウド基盤に関わる作業を以上のように効率化します。 SRE/DevOpsエンジニアが行う大変な作業を肩代わりします。 高品質な汎用クラウド基盤の実現 ・クラウド基盤構築/クラウド移行 ・クラウドの保守運用・コスト最適化 など幅広い利用シーンを想定しています。IaaSやPaaSを適切に組み合わせた数百を超える高品質な汎用クラウド基盤を容易に実現できます。 興味を持たれた方には、無料で資料を提供しております。 お気軽にご相談ください。

8. お問合せ

株式会社Definerでは、 ・ITの上流から下流まで一気通貫のワンストップソリューションをご提供。 ・AIやクラウドのITインフラなど、先進的なIT技術のコンサルティングから要件定義 / 設計開発 / 実装、保守運用に至るまでの統合的な支援にコミット。 ・少ないエンジニアで事業が成長する仕組みづくりの実現。 ・エンジニアが喜ぶ、採用しやすい環境づくりの実現。 ・高速なアジャイル開発環境の実現。 ・自社プロダクトとしてPrismScalerを展開。 上記事業内容を進行しております。 ※「開発者ブログ」では、エンジニアの入門編として有益な情報を無料公開しています。 ご相談やお問い合わせは「株式会社Definer」へ。

9. Definerに関して。

・ Definer Incは、ITの上流から下流まで一気通貫のワンストップソリューションをご提供しております。 ・ AIやクラウドのITインフラなど、先進的なIT技術のコンサルティングから要件定義 / 設計開発 / 実装、保守運用に至るまでの統合的な支援にコミットしています。 ・ DevOpsとCI/CDコンサルティングにより「少ないエンジニアで事業が成長する仕組みづくり」「エンジニアが喜ぶ、採用しやすい環境づくり」「高速なアジャイル開発環境」を実現しています。 ・ また、自社プロダクトとしてPrismScalerを展開しております。PrismScalerは、AWS、Azure、GCPなどのマルチクラウド / ITインフラの高品質かつ迅速な、「自動構築」「自動監視」「問題検知」「構成可視化」を実現します。