- [AWS SAM] 概要、Hello World (※本記事)
- [AWS SAM] Lambda関数からS3アクセス
- [AWS SAM] Swaggerを使用したAPI定義
AWS SAM(AWS Serverless Application Model)
サーバレスアプリケーション
Lambda関数、トリガとなるイベントリソース、およびLambda関数から操作するリソース等を組み合わせたもの
AWS SAM
サーバレスアプリケーションのデプロイに特化したAWS CloudFormationの拡張機能
CloudFormationと比べて簡潔にテンプレートを記述可能
SAMはCloudFormationの拡張機能のため、CloudFormationの文法と共存可能
SAMでサポートしていないサービスについてはCloudFormationの文法で対応
CloudFormationと同様にYAMLまたはJSONでSAMテンプレートを記述する
デプロイ時にCloudFormationによってSAMテンプレートはCloudFormationテンプレートに変換される
テンプレート内のTransform: AWS::Serverless-2016-10-31
で変換方式を指定している
AWS SAM CLIのインストール
公式ドキュメントを参考にAWS SAM CLIをインストール
Hello Worldアプリケーションの導入
公式ドキュメントを参考にsam init
でアプリケーションを作成、
今回はRuntimeにpython3.8、アプリケーションテンプレートにhello-worldを選択
python3.8をインストールしておく必要あり、バージョン違いも不可
-----------------------
Generating application:
-----------------------
Name: sam-app
Runtime: python3.8
Dependency Manager: pip
Application Template: hello-world
Output Directory: .
デプロイは、aws cloudformation package
、aws cloudformation deploy
を使用
パッケージのアップロード先S3バケットは事前に作成しておく必要あり
$ aws cloudformation package \
--template-file ./template.yaml \
--s3-bucket ${YOUR_BUCKET_NAME} \
--output-template-file ./packaged_template.yaml
$ aws cloudformation deploy \
--template-file ./packaged_template.yaml \
--stack-name ${YOUR_STACK_NAME} \
--capabilities CAPABILITY_IAM \
--region ${YOUR_REGION}
aws cloudformation package
で実装ファイルをzip圧縮し、S3の指定バケットにアップロード、
aws cloudformation deploy
でCloudFormationのスタックとして、指定された名前でデプロイ
スタックはデプロイされるリソース一式で、スタックを削除すると紐づいているリソースすべてが削除される、
存在しないスタック名でデプロイすると新規作成、すでに存在するスタック名の場合は更新される
デプロイしたLambda関数、API GatewayのAPI名に指定したスタック名で含まれる(明示的にFunctionName, Nameを指定しなかった場合)
hello-worldアプリケーションをデプロイすると、
API Gateway にスタック名でAPIが生成、
Lambdaに${YOUR_STACK_NAME}-HelloWorldFunction-XXXXXX
のような名前で関数が生成される
テンプレート内容
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/ # Lambda関数ファイルの場所、※packageコマンドで実際のS3パスに置き換えれる
Handler: app.lambda_handler # Lambda関数実体(ファイル名app、関数名lambda_handler)
Runtime: python3.8
Events: # Lambdaのトリガとなるイベント
HelloWorld:
Type: Api # API Gatewayの以下パス、メソッドコール時にLambdaをキック
Properties:
Path: /hello
Method: get