AWS SAMを使ってみた!感動した!
はじめに
AWS SAM CLIのインストールからHello Worldアプリケーションをデプロイしてみます。
デプロイ実行からものの数十秒でリソースが指定通りにできてて感動しました。
マネージメントコンソールでポチポチやっている方は今すぐSAM環境構築しましょう!
これからは『継続的インティグレーション/継続的デリバリー(CI/CD)』必須ですよ(今さら)!
動作環境
macOS Monterey 12.6.5
前提条件
- AWS アカウントへのサインアップ。
- 管理者 IAM ユーザーを作成する。
- アクセスキー ID とシークレットアクセスキーを作成する。
- AWS CLI のインストール
AWS SAM CLI のインストール
- パッケージのダウンロード&インストール
GUIインストラーもありますが、今回はコマンドラインでインストールします。
AWS SAM CLI のインストールからインストールパッケージをダウンロードします。
インストールします。
$ sudo installer -pkg [path-to-pkg-installer/name-of-pkg-installer] -target /
※[path-to-pkg-installer/name-of-pkg-installer]:ダウンロードしたパッケージのファイルパス
ターゲット
- AWS SAM CLIが正しくインストールされていることを確認します。
$ which sam
/usr/local/bin/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
[awsprofile2]
aws_access_key_id = A*******************
aws_secret_access_key = 6***************************************
[awsprofile3]
aws_access_key_id = A*******************
aws_secret_access_key = 7***************************************
[default]
aws_access_key_id = A*******************
aws_secret_access_key = N***************************************
[awsprofile1]
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?
ありゃ
Dockerが入っていないとダメみたい。
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
おおお。OKOK。
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
-------------------------------------------------------------------------------------------------
Outputs
-------------------------------------------------------------------------------------------------
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-
northeast-1:xxxxxxxxxx:function:todo-app-HelloWorldFunction-xxxxxxxxxx
-------------------------------------------------------------------------------------------------
Successfully created/updated stack - todo-app in ap-northeast-1
マネジメントコンソールで確認
本当にできてる!感動!
API Gatewayのほか、Lambda関数、CloudFormationスタック、IAMロール、S3にも作業用バケットができていたりします。マネージメントコンソールでみてみましょう。
API動作確認
curlで確認
$ curl https://xxxxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello
{"message": "hello world"}
OKですね。
sam delete
ちなみに、コマンド1つでデプロイ済みのリソース全て削除してくれます。ものの数秒で…すごい。
$ 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
最後に
数十秒で様々なリソースがAWS上にデプロイできました。感動しました。
これから色々なリソース作成をyamlファイルで書けるようになって、AWS SAMをどんどん使いこなしていきたいです。
Discussion