【初心者向け】AWS SAM を使ったら、ライブラリを含む Lambda 関数が2コマンドでデプロイできて便利だった
こんにちは、リサリサです。
いつもライブラリが必要な Lambda 関数を作成するときは、ライブラリをローカルで「pip install -t」して、それを zip で固めてその zip ファイルをアップロードして…で、ランタイム合わなかったりするとエラーになって…とやっていたのですが、AWS SAM を使ってみたら2コマンドでライブラリを含む Lambda のデプロイができて、とても便利だったので、初心者向けですが記事にしてみました。
AWS SAM とは
SAM とは、Serverless Application Model の略で、サーバーレスアプリケーション構築用のオープンソースフレームワークです。色々便利なのですが、書き始めると長くなりそうだったので、公式リンクを貼っておきます。
AWS Serverless Application Model (AWS SAM) とは - AWS Serverless
やりたいこと
ライブラリを含む Lambda 関数を作りたいです。
sam build でモジュールを展開して、sam deploy で Lambda を作成していきます。
やってみた
ファイルを準備して、sam build して sam deploy していきます。
(sam init は最初に色々テンプレートファイルを作ってくれて便利なのですが、今回は Lambda だけでいいので使いません。余計な API Gateway も作ってくれてしまうので…。)
AWS SAM の準備
SAM をインストールしていない場合はインストールが必要です。
AWS SAM CLI のインストール - AWS Serverless Application Model
今回は以下の環境で試しました。
$ sam --version SAM CLI, version 1.23.0
ファイルの準備
必要なファイルを作成していきます。必要最低限のファイルは以下の4ファイルになります。
test-sam ├── function │ ├── function.py │ └── requirements.txt ├── samconfig.toml └── template.yaml
function/function.py
Lambda の本体です。とりあえず requests を使うようにしてみます。
import json import requests def lambda_handler(event, context): print(requests.get('https://google.com')) return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
function/requirements.txt
requirements です。sam build すると、ここに記載してあるモジュールが展開されます。
requests
samconfig.toml
sam deploy する際の config ファイルです(最近追加されたもののよう。いままでパラメータで指定していたものが、ここに記載することでパラメータ不要になったみたいです。便利!)。作成せずに「sam deploy --guided」を実行することで、対話しながら作成することも可能です。ここで指定した S3 バケットが Lambda ソースの一時的な置き場所になります。
※「sam deploy --guided」対話しながら作成すると、S3バケットの作成も自動でしてくれるのですが、amconfig.toml を用意しておいて、「sam deploy」で deploy する場合はバケットは事前作成が必要です。
AWS SAM CLI の設定ファイル - AWS Serverless Application Model
version = 0.1 [default] [default.deploy] [default.deploy.parameters] stack_name = "test-sam-app" s3_bucket = "バケット名" s3_prefix = "test-sam-app" region = "ap-northeast-1" capabilities = "CAPABILITY_IAM"
template.yaml
SAM テンプレートファイルです。CloudFormtion 構文とよく似ていて、CloudFormtion 構文を拡張したSAM構文という構文で書きます。
AWS SAM リソースとプロパティのリファレンス - AWS Serverless Application Model
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: SAM Template for test-sam-app Globals: Function: Timeout: 3 Resources: Function: Type: AWS::Serverless::Function Properties: FunctionName: test-sam-app CodeUri: function/ Handler: function.lambda_handler Runtime: python3.8 Outputs: Function: Description: "test-sam-app Lambda Function ARN" Value: !GetAtt Function.Arn FunctionIamRole: Description: "Implicit IAM Role created for test-sam-app function" Value: !GetAtt FunctionRole.Arn
sam build
sam build していきます。requirements.txt に記載したモジュールを展開してくれます。Node.js 関数の場合は package.json も同じようにしてくれるようです。
ライブラリがない場合は、スキップして、いきなり sam deploy しても大丈夫なようでした。
$ sam build Building codeuri: xxxxx/test-sam-app/function runtime: python3.8 metadata: {} functions: ['Function'] 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 ========================= [*] Invoke Function: sam local invoke [*] Deploy: sam deploy --guided
sam deploy
sam deploy します。
$ sam deploy Uploading to test-sam-app/6f17276fcf705e0be46a42c64c0156fc 450910 / 450910 (100.00%) Deploying with following values =============================== Stack name : test-sam-app Region : ap-northeast-1 Confirm changeset : False Deployment s3 bucket : lisalisa-tmp Capabilities : ["CAPABILITY_IAM"] Parameter overrides : {} Signing Profiles : {} Initiating deployment ===================== Uploading to test-sam-app/2b494aed6ea6cd1edf37cb87ea7af7c1.template 686 / 686 (100.00%) Waiting for changeset to be created.. CloudFormation stack changeset ----------------------------------------------------------------------------------------------------- Operation LogicalResourceId ResourceType Replacement ----------------------------------------------------------------------------------------------------- + Add FunctionRole AWS::IAM::Role N/A + Add Function AWS::Lambda::Function N/A ----------------------------------------------------------------------------------------------------- Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:123456789012:changeSet/samcli-deploy1640756654/3b1dbb06-6032-4d42-a929-2ef822e63f2d 2021-12-29 14:44:25 - Waiting for stack create/update to complete CloudFormation events from changeset ----------------------------------------------------------------------------------------------------- ResourceStatus ResourceType LogicalResourceId ResourceStatusReason ----------------------------------------------------------------------------------------------------- CREATE_IN_PROGRESS AWS::IAM::Role FunctionRole - CREATE_IN_PROGRESS AWS::IAM::Role FunctionRole Resource creation Initiated CREATE_COMPLETE AWS::IAM::Role FunctionRole - CREATE_IN_PROGRESS AWS::Lambda::Function Function - CREATE_IN_PROGRESS AWS::Lambda::Function Function Resource creation Initiated CREATE_COMPLETE AWS::Lambda::Function Function - CREATE_COMPLETE AWS::CloudFormation::St test-sam-app - ack ----------------------------------------------------------------------------------------------------- CloudFormation outputs from deployed stack ------------------------------------------------------------------------------------------------------- Outputs ------------------------------------------------------------------------------------------------------- Key Function Description test-sam-app Lambda Function ARN Value arn:aws:lambda:ap-northeast-1:123456789012:function:test-sam-app Key FunctionIamRole Description Implicit IAM Role created for test-sam-app function Value arn:aws:iam::123456789012:role/test-sam-app-FunctionRole-U3GCDBNCBYHE ------------------------------------------------------------------------------------------------------- Successfully created/updated stack - test-sam-app in ap-northeast-1
自動で色々作ってくれました。
確認
何が作られたのか確認してみます。
CloudFormation のスタックを確認すると、Lambda Function とそこで使うロールが作成されていました。
Lambda を確認してみます。requests の中身もちゃんと入っていそうです。
テスト実行してみます。
requests も正しく動いているようです。
最後に
なんだか難しそうと思って敬遠していた AWS SAM ですが、使ってみるととても便利でした。これからは積極的に使っていこうと思います。どなたかのお役に立てれば幸いです。