5分でAWS SAMに入門する

今までAWSのコンソール上でLambdaを作っていましたが、SAMを試してみたら思ったより便利だったので、入門するための手順を共有します。

ブラックベルトはこちらです。

  • Lambdaの構築でSAMを使うメリット
    • Lambdaの設定や起動スケジュール等をまとめてコード化して管理できる
    • 関数の構築やテストがCLIで完結する
    • 似たような関数をたくさん作ることが楽で、作業ミスのリスクが低い
    • ビルドやデプロイの部分はAWS側が管理してくれる
    • 既にCloudFormationを利用している場合は追加の学習コストが少ない
  • デメリット
    • 少しずつコードを修正しながら検証する、いわゆるスモールスタートの段階ではコンソールを使ったほうが早い

入門

今回は公式が用意しているテンプレートを利用します。

前提

  • AWS CLIを使用できること
  • Dockerを使用できること(ローカルで関数を実行する場合のみ必要)

手順その1 公式サイトを参考にAWS SAM CLIをインストールする

docs.aws.amazon.com

手順その2 任意のフォルダ上で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
Template: 1

Use the most popular runtime and package type? (Python and zip) [y/N]: N

Which runtime would you like to use?
        15 - python3.9
Runtime: 15

What package type would you like to use?
        1 - Zip
        2 - Image
Package type: 1


Would you like to enable X-Ray tracing on the function(s) in your application?  [y/N]: N
For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: N

Project name [sam-app]: sam-nyumon
(後略)                                                                                                            

対話したくない人は以下のようにオプションをつけることで一発で作成できます。

sam init --runtime python3.9 --dependency-manager pip --app-template hello-world --name sam-nyumon

手順その3 ビルド&デプロイする

cd sam-nyumon
sam build
sam deploy

以下のようなログが出力されたらデプロイ成功です。

Successfully created/updated stack - sam-nyumon in ap-northeast-1

コンソール上でもLambda関数の作成が確認できるかと思います。

手順その4 実行してみる

Lambdaをローカルで実行するにはDockerが必要なので、起動しておきます。

sam local invoke

以下のログが出力されたら実行成功です。

{"statusCode": 200, "body": "{\"message\": \"hello world\"}"}%

手順その5 リソースを削除する

最後に、作成した関数を削除します。

sam delete

まとめ

sam init,sam build,sam deploy,sam local invokeの4コマンドを実行するだけで、Lambdaの作成からテストが実行できました。

また、Lambdaの設定を編集したいときはtemplate.yamlファイルの中のPropertiesを編集します。以下に、よく使う設定を列記します。

  • FunctionName
    • 関数名
    • 省略可能だがなるべく指定したほうがいい
  • Policies
    • Lambdaに付与するポリシー
  • MemorySize
    • メモリサイズ
  • Timeout
  • Environment
  • Events
    • Lambdaを起動するイベント、Eventbridgeもここで指定する

Resources:
  SlackTestFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: "FunctionName" # 関数名
      CodeUri: function/ # コードの場所
      Handler: app.lambda_handler
      Runtime: python3.9
      Architectures:
        - x86_64
      Policies: # Lambdaに付与するポリシー
        - arn:aws:iam::******
      MemorySize: 1024 # メモリサイズ
      Timeout: 15 # タイムアウトまでの秒数
      Environment:
        Variables: # 環境変数
          TZ: Asia/Tokyo
      Events: # 関数を実行するイベント
        schedulename:
          Type: Schedule
      Properties:
        Schedule: "cron(0 22 * * ? *)" # UTC
        Name: schedule-name
        Enabled: true
        Input: | # 関数を実行するときに渡すパラメータ
          {
          "key1": "LOVE",
          "key2": "PHANTOM"
          }

全ての設定はこちら。 docs.aws.amazon.com

ここまで読んでいただき、ありがとうございました。