AWS SAMを使ってみた!感動した!



AWS SAM CLIのインストールからHello Worldアプリケーションをデプロイしてみます。


macOS Monterey 12.6.5


  • AWS アカウントへのサインアップ。
  • 管理者 IAM ユーザーを作成する。
  • アクセスキー ID とシークレットアクセスキーを作成する。
  • AWS CLI のインストール

AWS SAM CLI のインストール

  • パッケージのダウンロード&インストール
    AWS SAM CLI のインストールからインストールパッケージをダウンロードします。
$ sudo installer -pkg [path-to-pkg-installer/name-of-pkg-installer] -target /


  • AWS SAM CLIが正しくインストールされていることを確認します。
$ which sam
$ sam --version
SAM CLI, version 1.86.1

Hello World アプリケーションのデプロイ

  • 作業前にAWS CLIで複数のアカウントを使い分けている場合、今回デプロイ先となるのAWSアカウントの認証情報を設定しているプロファイルに切り替えます。
  • プロファイルリストの表示
$ aws configure list-profiles
  • プロファイルの切り替え(環境変数)
export AWS_PROFILE=[プロファイル名]
  • 利用しているプロファイルの確認(環境変数を参照している場合)
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile              awsprofile1              env    ['AWS_PROFILE', 'AWS_DEFAULT_PROFILE']
access_key     ****************ICND shared-credentials-file    
secret_key     ****************yEgO shared-credentials-file    
    region           ap-northeast-1      config-file    ~/.aws/config
  • プロファイルの認証情報
$ cat ~/.aws/credentials 
aws_access_key_id = A*******************
aws_secret_access_key = 6***************************************
aws_access_key_id = A*******************
aws_secret_access_key = 7***************************************

aws_access_key_id = A*******************
aws_secret_access_key = N***************************************
aws_access_key_id = A*******************
aws_secret_access_key = U***************************************

sam init

sam init=新しいサーバーレスアプリケーションを初期化します。

$ sam init

Project nameは任意です。今回はtodo-appとしてます。

$ 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 - Full Stack
	13 - Lambda EFS example
	14 - DynamoDB Example
	15 - 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]: y
X-Ray will incur an additional cost. View https://aws.amazon.com/xray/pricing/ for more details

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]: y
AppInsights monitoring may incur additional cost. View https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/appinsights-what-is.html#appinsights-pricing for more details

Project name [sam-app]: todo-app

    Generating application:
    Name: todo-app
    Runtime: python3.9
    Architectures: x86_64
    Dependency Manager: pip
    Application Template: hello-world
    Output Directory: .
    Configuration file: todo-app/samconfig.toml
    Next steps can be found in the README file at todo-app/README.md

Commands you can use next こんなコマンド使えるよ。

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


$ cd todo-app
$ tree
├── README.md
├── __init__.py
├── events
│   └── event.json
├── hello_world
│   ├── __init__.py
│   ├── app.py
│   └── requirements.txt
├── samconfig.toml
├── template.yaml
└── tests
    ├── __init__.py
    ├── integration
    │   ├── __init__.py
    │   └── test_api_gateway.py
    ├── requirements.txt
    └── unit
        ├── __init__.py
        └── test_handler.py

sam build

template.yaml をもとにビルドされます。

$ cd todo-app/
bash-3.2$ sam build
Starting Build use cache
Build Succeeded


sam local invokeコマンドを使用して、AWS Lambda関数の1回限りの呼び出しができるとのこと。

$ sam local invoke
Error: Running AWS SAM projects locally requires Docker. Have you got it installed and running?

AWS SAM CLI で Docker を使用するためのインストール方法あたりを参考にDocker(Docker Desktop)入れる。

$ sam local invoke
Invoking app.lambda_handler (python3.9)                                       
START RequestId: ba36ea30-fee3-4f06-8211-1cf94xxxxxx Version: $LATEST
{"statusCode": 200, "body": "{\"message\": \"hello world\"}"}END RequestId: ba36ea30-fee3-4f06-8211-1cf9xxxxx
REPORT RequestId: ba36ea30-fee3-4f06-8211-1cf94xxxxxx	Init Duration: 0.16 ms	Duration: 359.77 ms	Billed Duration: 360 ms	Memory Size: 128 MMax Memory Used: 128 MB	

sam local invokeコマンドの詳しい使い方などはsam local invoke を使用する

sam deploy


$ 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 [todo-app]: todo-app
	AWS Region [ap-northeast-1]: 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 has no authentication. Is this okay? [y/N]: y
	Save arguments to configuration file [Y/n]: Y
	SAM configuration file [samconfig.toml]: samconfig.toml
	SAM configuration environment [default]: default


CloudFormation outputs from deployed stack
Key                 HelloWorldFunctionIamRole                                                   
Description         Implicit IAM Role created for Hello World function                          
Value               arn:aws:iam::xxxxxxxxxxx:role/todo-app-HelloWorldFunctionRole-1xxxxxxxxx 

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

Key                 HelloWorldFunction                                                          
Description         Hello World Lambda Function ARN                                             
Value               arn:aws:lambda:ap-                                                          

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


API Gatewayのほか、Lambda関数、CloudFormationスタック、IAMロール、S3にも作業用バケットができていたりします。マネージメントコンソールでみてみましょう。



$ curl https://xxxxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello
{"message": "hello world"}


sam delete


$ sam delete --stack-name "todo-app"
	Are you sure you want to delete the stack todo-app in the region ap-northeast-1 ? [y/N]: y
	Are you sure you want to delete the folder todo-app in S3 which contains the artifacts? [y/N]: y
        - Deleting S3 object with key todo-app/d5190xxxxxxxxxxxxxxxxxx              
        - Deleting S3 object with key todo-app/9a36xxxxxxxxxxxxx.template      
	- Deleting Cloudformation stack todo-app

Deleted successfully


これから色々なリソース作成をyamlファイルで書けるようになって、AWS SAMをどんどん使いこなしていきたいです。