2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS SAM、FastAPI、Mangum を使って API 開発をやってみる

Posted at

概要

AWS SAM、FastAPI、Mangum を使って API 開発をやってみる

上記を実施。
チュートリアルはcloud9で行われていたが、次の職場ではVScode上からSSHでリモートのEC2コンテナにexecして開発するとのことなので、dockerで再現してやってみた。
以下やってみてのエトセトラ。

チュートリアル通りにやって躓いたところ

sam buildで失敗する

以下で解決

  • チュートリアルで示されているDockerfileのimageが取得できるか
    • docker pull public.ecr.aws/lambda/python:3.9
  • 取得できた場合、そのimageでlocalビルドできるか?
    • docker build -t test-lambda ./hello_world
  • Buildできる場合、特に依存関係等は複雑に設定をしていないのでDockerのキャッシュ周りが怪しい
    • 全部削除してみる
      • docker builder prune -a
  • キャッシュに依存しないでもう一度sam buildしてみる
    • sam build --cached
    • sam build --no-cache

sam deploy後、エンドポイントを叩くと{"message": "Internal server error"}% となる

どうやらLambdaのコンテナイメージでアーキテクチャを明示しないといけないらしい

参考

Macなのでarm64で指定しておく

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    # Lambda関数をDockerで作成
    Properties:
      PackageType: Image
      # コンテナイメージのアーキテクチャを指定しておかないとエラーになるので指定
      Architectures:
        - arm64

tests/integration/test_api_gateway.py のpytestが失敗する

cloud9ではなく、localでコンテナ化したためAWS認証情報が足りないのでaws configureする。

実際は systems manager等から引っ張り出すか、profileにするかする
リージョンとスタック名の設定もしておく(スタック名は本来なら環境変数にしておく)

  • export AWS_SAM_STACK_NAME=buildersflash-aws-sam-app
  • export AWS_DEFAULT_REGION=ap-northeast-1

TIPS: CLIは後からいれるのは面倒なのであらかじめインストールしておくようにDockerfileに仕込む

# イメージの設定、Macなのでarm64としておく
FROM --platform=linux/arm64 base as stage-arm64

# CLIとSessionManagerとSAM CLIのインストール
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip" && \
    unzip awscliv2.zip && \
    ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update && \
    rm -rf awscliv2.zip
RUN curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_arm64/session-manager-plugin.deb" -o "session-manager-plugin.deb" && \
  apt-get install -y ./session-manager-plugin.deb && \
    rm -f session-manager-plugin.deb
RUN curl -LO "https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-arm64.zip" && \
    unzip aws-sam-cli-linux-arm64.zip -d sam-installation && \
    ./sam-installation/install && \
    rm -rf aws-sam-cli-linux-arm64.zip sam-installation

SAMのローカル実行について

ローカルでのテストはコンテナ外でもできる。
(実際にdeployしたAPIを叩くなら、当然だけどexecして中で叩かないとダメ)

  • sam local start-lambda
    • 上記を実行した上で別のターミナルで以下を入力してみる

      aws lambda invoke --function-name "HelloWorldFunction" --endpoint-url "[http://127.0.0.1:3001](http://127.0.0.1:3001/)" --payload file://events/event.json --cli-binary-format raw-in-base64-out response.json
      
      • --function-name 設定した関数名
      • --endpoint-url 関数(API)のエンドポイント
      • --payload 関数をmockをするためのパラメータが入っているファイルを指定
      • --cli-binary-format raw-in-base64-out response.json 出力内容
    • あとはcat response.json で内容を見れる(rm response.json で消しておくのも忘れずに)

  • sam local start-api
    • start-lambdaはLambda関数自体のエミュレータだが、こちらはAPIGatewayのエミュレータ
    • 定義された API エンドポイント(template.yaml に記載)をローカルで起動し、それにアクセスし、それを通じてLambda関数をキックする
    • コマンド実行後、curl -X GET エンドポイント でAPIを叩いて実行結果を見れる
2
2
0

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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?