AWS SAM 構文を利用した CloudFormation による Lambda と API Gateway の作成


はじめに

今回は AWS SAM 構文を利用し、 Hello を返す API を作成しました。
AWS SAM 構文を利用すると、シンプルな設定のみでAPIを作成できます。

今回作成するシステムの構成図を以下に示します。

開発環境

  • AWS-CLI 1.16.158
  • Microsoft Windows 10 Home

※AWS CLI のインストールをしていない場合は、以下を参考にインストール、認証を行ってください。
AWS CLI のインストール
AWS CLI の認証

yaml ファイルの作成

この yaml ファイルに API Gateway と Lambda の設定を書き込みます。
今回使用した yaml ファイルは以下の通りです。


AWSTemplateFormatVersion: '2010-09-09'

#AWS SAM構文をCloudFormation用に変換する宣言
Transform: 'AWS::Serverless-2016-10-31'

#スタックの説明
Description: test-stack
Resources:
  hellofunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      #用意したPythonファイル名を.lambda_handler前に付ける
      Handler: Hello.lambda_handler

      #作成されるLambda関数名
      FunctionName: HelloFunction

      #Lambda関数に記述されるコード
      CodeUri: Hello.py

      #ランタイム設定
      Runtime: python3.7

      #Lambda関数の説明
      Description: 'Hello api'

      #メモリサイズ設定
      MemorySize: 128

      #タイムアウト時間設定
      Timeout: 30

      #イベントを設定
      Events:
        helloapi:
          #イベントを決定
          Type: Api
          Properties:
            #APIのパスを決定
            Path: '/hello'
            #メソッドを設定
            Method: get


Pythonコードの作成

ただ、Hello を返すコードを記述しました。

import json

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': json.dumps('Hello')
    }

各ファイルをパッケージ化し、テンプレートとしてs3にアップロード

以下のコマンドで、各ファイルをパッケージ化し S3 にアップロードします。
このパッケージは、この後 CLoudFormation にデプロイするために利用します。

aws cloudformation package --template-file 作成したyamlファイル名 --s3-bucket パッケージを保存するS3バケット名 --output-template-file 作成するテンプレートファイル名.yaml

デプロイ

作成したテンプレートを以下のコマンドでデプロイします。
先ほどのコマンドの実行結果からコマンドをコピペします。
--stack-nameには任意のスタック名を入力し、末尾に--capabilities CAPABILITY_IAMを付けて実行します。
--capabilities CAPABILITY_IAMは IAM 関連の処理を行う際に必要になります。

aws cloudformation deploy --template-file C:\xxx\作成したyamlテンプレートファイル名 --stack-name 任意のスタック名 --capabilities CAPABILITY_IAM

作成されたAPIの確認

実際に、作成されたAPIをたたくと以下のように Hello と表示されます。

おわりに

今回はAWS SAM 構文を利用して、API を作成しました。
AWS でサーバーレスアプリケーションを構築する際は、CloudFormation の構文を利用するより、SAM 構文のほうがシンプルに書けるので試してみてください。