【初心者向け】AWS SAM を使ったら、ライブラリを含む Lambda 関数が2コマンドでデプロイできて便利だった

2021.12.29

こんにちは、リサリサです。

いつもライブラリが必要な 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 を使うようにしてみます。

function/function.py

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 すると、ここに記載してあるモジュールが展開されます。

function/requirements.txt

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 

samconfig.toml

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 

template.yaml

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 ですが、使ってみるととても便利でした。これからは積極的に使っていこうと思います。どなたかのお役に立てれば幸いです。

参考

AWS SAM CLI のインストール - AWS Serverless Application Model