LoginSignup
8

More than 3 years have passed since last update.

AWS SAMを使ってサクッとPythonとlambda、API GatewayでAPIを作る

Last updated at Posted at 2020-04-04

プロジェクトで、Pythonを使った簡単なAPIを作ることになったので、サクッとAPIを作る環境を整えていきます。

前提

エディター…VSCode
OS…Windows10
Python3.8インストール済み
AWS CLI導入済み

Windows での AWS CLI バージョン 2 のインストール - AWS Command Line Interface

必要な環境

  • AWS SAM CLI
  • AWS Toolkit for Visual Studio Code

AWS SAMの利点

公式ドキュメントによると

  • 単一のデプロイ構成
  • AWS CloudFormation の拡張
  • 組み込みのベストプラクティス
  • ローカルのデバッグとテスト
  • 開発ツールとの緊密な統合

がメリット。
個人的にはlambdaをローカルでデバッグできるのは大きなメリットでした。
実態はCloudFormationなので、カスタマイズ性があるのもポイント高い。

AWS SAM CLIの導入

公式ドキュメントに従って行います。要約すると

  1. dockerをインストール
  2. AWSが配布してるインストーラ(.msiファイル)からインストールするか pip install aws-sam-cliでインストール
  3. sam --versionでバージョンが出力されればOK

dockerは、ローカルマシンにlambdaの実行環境を作るために導入します。

AWS Toolkit for Visual Studio Codeの導入

これは、VSCodeからAWSのSAMをGUIで操作するためのVSCodeの拡張機能です。
AWS Toolkit - Visual Studio Marketplace

プロジェクトを新規作成する

公式ドキュメントに従って行います。

  1. コマンドパレット(Ctrl + Shift + P)を開き、Create new SAM Applicationを選択 image.png
  2. 使用するランタイムを選びます。今回はPython3.8 image.png
  3. テンプレートを選択。今回は単体で使うのでHwllo World image.png
  4. プロジェクトを作成するディレクトリを指定します。エクスプローラーが開くので任意のフォルダを選択します。 image.png
  5. プロジェクト名を指定します。 Enterを押すと、プロジェクトが作成されます。 image.png image.png

ローカルデバッグ実行する

  1. hello_world/app.pyを開き、Debug Locallyを選択すると、dockerに仮想環境が作られ、関数が実行されます。 image.png
  2. デバッグコンソールに結果が出力されればOK image.png

eventを設定する

.aws/templates.jsonで設定できる
image.png

デプロイする

templete.yamlをもとにデプロイしていきます。
1. コマンドパレットからDeploy SAM Applicationを選択
image.png
2. テンプレートを選択する。今回はtemplete.yaml
image.png
3. 任意のデプロイ先のリージョンを選択する。今回はTokyo
image.png
4. S3のバケット名を指定します。ここでは既存のバケット名を指定しなければなりません。
image.png
5. Stack名を指定します。
Stackとは、CloudFormationで作成されるサービス群の名前です。プロジェクト名と同名にしてます。
image.png
6. デプロイが成功するとデバッグコンソールが表示されます
image.png

デプロイされたことを確認する

以下のように、lambdaが作られていることを確認できます。
image.png
API GatewayでもAPIが作られていることが確認できます。
image.png

カスタマイズする

デフォルトで作られるAPIは
GET: /helloなので、これを変更するにはtemplete.yamlを編集する必要があります。

下記はデフォルトのtemplete.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  trial-sam

  Sample SAM Template for trial-sam

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 3

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.8
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get

Outputs:
  # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
  # Find out more about other implicit resources you can reference within SAM
  # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
  HelloWorldApi:
    Description: "API Gateway endpoint URL for Prod stage for Hello World function"
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
  HelloWorldFunction:
    Description: "Hello World Lambda Function ARN"
    Value: !GetAtt HelloWorldFunction.Arn
  HelloWorldFunctionIamRole:
    Description: "Implicit IAM Role created for Hello World function"
    Value: !GetAtt HelloWorldFunctionRole.Arn

この中を以下の通りに書き換えればパスとHTTPメソッドを変えられる

Before

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.8
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get

After

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.8
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /anypath # hello → anypath
            Method: post # get → post

POST: anypathに変更できました。
image.png

あとはロジックを書いていくだけ

あとは要件に合わせてロジックを組み立てていくだけです。

再度デプロイすれば、変更内容も反映されます。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8