AWS

AWS SAM CLIを利用してLambdaのローカル開発環境を構築

AWS

AWSが多く提供しているクラウド機能の中でも「Lambda」をサーバレスアプリとして使っているは多くいるかと思います。

私は普段AWSのインフラ周りの構築をメインとしており、Lambdaでのサーバレスを直接触ったことが中たのですが、今回趣味でLamdaでユーザ認証APIを作成する機会がありました。

直接AWSマネージメントコンソールからLambdaを操作して作っては見たものの、サーバレスで動作させるために確認のためにコードをコピペするなどしていたためデバックが大変で、規模が大きくなると管理が難しいという問題に直面していました。

そこで、AWSのサーバレスアプリの開発方法について調査をしたところ、以下の様にいろいろなワードが出てきて混乱してしまいました( ;∀;)

試行錯誤をした結果、最終的に「AWS SAM Local」を使ってローカル開発環境の構築を行ったところ、大分うまく開発を進めることができましたので、今回は同じようにAWSサーバレス開発の方法に迷っている方を対象に紹介したいと思います。

開発環境

  • Windows10 Pro バージョン20H2 19042.685
  • Python 3.7.7
  • Docker Desktop for Windows Version 2.5.0.0(49427)
  • ※Pythonは3.9が最新ですが、今回はLamdaが対応している3.7を利用しています。(3.8でも大丈夫です)

SAM(SAM Local)でできること

SAMって一体なにをしているの?ということで当然公式ドキュメントに書いてあるのですが、初心者だと少し理解するのが難しいかな思いましたので、簡単に補足説明します。

SAMではLambdaやAPIGawtayを「SAMテンプート」という形でコードで構成します。

SAMを使わない場合は、AWSマネージメントコンソール経由でLambda関数を作って、それからAPI Gatewaと紐づけして・・・とか手動でポチポチしながら構築しますが、その作業をSAMテンプレートで一括で構築をします。

SAMではsamコマンドを使いながら、AWSへのデプロイまで実行することができます(他にもサポートコマンドとかたくさんあります)

主な流れとしては、以下となります。カッコ内はコマンド。
 ①SAMテンプレートのsample取得【sam init】
 ②ローカルPC内でSAMテンプレート(CloudFormationテンプレート)とLambda Functionを開発
 ③ビルド【sam build】
 ④AWSデプロイ(CloudFormationスタック構築)【sum deploy】

SAM Localは④のDeploy先をローカルPCのコンテナとして動作確認することができます。ローカル内で確認できるので、スタック更新する待ち時間も軽減できますし、テストもやりやすくなります。

まずはSAMでの流れを確認してからSAM Localを使う流れです。

作るもの

まず、今回作成するものについて説明します。今回はSAMの全体的な流れを見るためにサンプルにあるhello worldプログラムを試してみます。

SAMを利用して、LambdaとAPIGatewayによるREST APIを作成し、URLをたたくと値が返ってくる、というサンプルです。

チュートリアル: Hello World アプリケーションのデプロイ - AWS Serverless Application Model
を使用して基本的な Hello World アプリケーションを AWS SAM クラウドにAWSデプロイする方法について説明します。

次の機会にDynamoDBなどとの連携に発展させる方法を紹介したいと思います。

事前準備

事前に以下の準備が必要となります。インストール手順などは省略します。以前の記事を参考にどうぞ。

・AWSアカウント作成(この説明は省略します)

・aws CLIのインストール(以下の記事参照)

・Dockerのインストール(以下の記事参照)

・Python3.7のインストール(以下の記事のバージョンを変えてダウンロードしてください)

IAMユーザの作成

まず、SAMアクセス用のIAMユーザを作成して、AccessKeyとSecretを設定します。

例としてsam_userを作成します。プログラムによるアクセスだけのユーザとしてAdmin権限を付与します。

アクセスIDとシークレットアクセスキーを取得したら、aws configureで初期設定します。

PS C:\Users\user> aws configure
AWS Access Key ID []: xxxxxxxxxx
AWS Secret Access Key []: xxxxxxxxx
Default region name []: ap-northeast-1
Default output format []: json

SAMのダウンロード、インストール

次にSAMを使うために以下のURLからWindowsのSAMをダウンロードします。

Windows での AWS SAM CLI のインストール - AWS Serverless Application Model
Windows ホストに AWS SAM CLI をインストールします。

ダウンロードしたらインストールしていきます。

正常にインストールができたか確認するためにバージョンを確認してみます。

PS C:\Users\user> sam --version
SAM CLI, version 1.15.0

SAMでサーバレスリソースを構築

それでは準備もできましたので、SAMコマンドを使って作っていきます。

SAMでは、SAMテンプレート(CloudFormationのTemplateと一緒?)を作成してLambdaや必要なリソースを作成します。

まずはsam initコマンドでサンプルのテンプレートをダウンロードします。

プロジェクトを作成するフォルダ(私の場合はC:\Project)に移動してから「sam init」を実行します。

対話形式となるので選択していきます。とりあえずは[1 – AWS Quick Start Templates] → [1 – Zip (artifact is a zip uploaded to S3)] → [8 – python3.7]と進めていきます。

プロジェクト名は[sam-app]、[1 – Hello World Example]と進めます。

sam initを実行してテンプレートを準備

PS C:\Project> cd C:\Project
PS C:\Project> sam init
・
(略)
¥・
Which template source would you like to use?
        1 - AWS Quick Start Templates
        2 - Custom Template Location
Choice: 1
What package type would you like to use?
        1 - Zip (artifact is a zip uploaded to S3)
        2 - Image (artifact is an image uploaded to an ECR image repository)
Package type: 1

Which runtime would you like to use?
        1 - nodejs12.x
        2 - python3.8
        3 - ruby2.7
        4 - go1.x
        5 - java11
        6 - dotnetcore3.1
        7 - nodejs10.x
        8 - python3.7
        9 - python3.6
        10 - python2.7
        11 - ruby2.5
        12 - java8.al2
        13 - java8
        14 - dotnetcore2.1
Runtime: 8

Project name [sam-app]:

Cloning app templates from https://github.com/aws/aws-sam-cli-app-templates

AWS quick start application templates:
        1 - Hello World Example
        2 - EventBridge Hello World
        3 - EventBridge App from scratch (100+ Event Schemas)
        4 - Step Functions Sample App (Stock Trader)
Template selection: 1

    -----------------------
    Generating application:
    -----------------------
    Name: sam-app
    Runtime: python3.7
    Dependency Manager: pip
    Application Template: hello-world
    Output Directory: .

    Next steps can be found in the README file at ./sam-app/README.md

SAMで利用するテンプレートがダウンロードされます。template.yamlがSAMテンプレートでapp.pyがLambda Functionになります。

sam buildでビルド

今回は動作確認なので、そのままビルドします。プロジェクトフォルダ(sam-app)に移動してからsam buildコマンドを実行します。

※もし、Pythonバージョンが違っているとビルド時に失敗しますので注意です。

PS C:\Project\> cd C:\Project\sam-app
PS C:\Project\sam-app> sam build
Building codeuri: hello_world/ runtime: python3.7 metadata: {} functions: ['HelloWorldFunction']
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

ビルドができるとbuildフォルダ内に必要なモジュールがまとめられます。

sam deployでAWS上に作成

ビルドが終わったらsam deployコマンドを実行して、AWSのCloudFormationスタックを作成します。

初回のデプロイの際は–guidedオプションを付けて実行してください。こちらも対話形式で設定を進めることができます。

スタック名やリージョンなどを指定します。2回目以降はここで指定した情報が「samconfig.toml」保管されるので同じ場合には–guidedオプションは不要です。

PS C:\Project\sam-app> sam deploy --guided

Configuring SAM deploy
======================

        Looking for config file [samconfig.toml] :  Not found

        Setting default arguments for 'sam deploy'
        =========================================
        Stack Name [sam-app]:
        AWS Region [us-east-1]:
        #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
        Confirm changes before deploy [y/N]: N
        #SAM needs permission to be able to create roles to connect to the resources in your template
        Allow SAM CLI IAM role creation [Y/n]: Y
        HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
        Save arguments to configuration file [Y/n]: Y
        SAM configuration file [samconfig.toml]:
        SAM configuration environment [default]:

        Looking for resources needed for deployment: Not found.
        Creating the required resources...
        Successfully created!


---------------------------------------------------------------------------------------------------------------------
Outputs
---------------------------------------------------------------------------------------------------------------------
Key                 HelloWorldFunctionIamRole
Description         Implicit IAM Role created for Hello World function
Value               arn:aws:iam::864637024666:role/sam-app-HelloWorldFunctionRole-KHP5YDD6RHPK

Key                 HelloWorldApi
Description         API Gateway endpoint URL for Prod stage for Hello World function
Value               https://k1f592d9e8.execute-api.us-east-1.amazonaws.com/Prod/hello/

Key                 HelloWorldFunction
Description         Hello World Lambda Function ARN
Value               arn:aws:lambda:us-east-1:864637024666:function:sam-app-HelloWorldFunction-KNW6ZAEC2UL4
---------------------------------------------------------------------------------------------------------------------

Successfully created/updated stack - sam-app in us-east-1

最後に出力された「HelloWorldApi」のURLは最後の確認の際に利用しますのでメモしておいてください。

作成されたCloudFormationスタックの確認

では、実際に作成されたリソースを確認してみます。us-east-1のCloudFormationからスタックが作成されていることを確認します。

スタック内のリソースからLambda FunctionやAPI Gawtewayが作成されていることも確認してみてください。

「aws-sam-cli-manages-default」は初回に合わせて作成されるようです。

REST APIにアクセスして確認

それでは最後にcurlコマンドで作成されたREST APIにアクセスします。

結果としてhello worldが返ってくれば問題ありません。

「app.py」内のhello worldの文字列を変更して、sam build を実行してから sam deployするとスタックがアップデートされて反映されますので試してみてください。

PS C:\Project\sam-app> curl https://k1f592d9e8.execute-api.us-east-1.amazonaws.com/Prod/hello/


StatusCode        : 200
StatusDescription : OK
Content           : {"message": "hello world"}
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    x-amzn-RequestId: 972c5698-d5c0-407b-9d0e-2fee0d888c76
                    x-amz-apigw-id: YMtTaHBVIAMF_GQ=
                    X-Amzn-Trace-Id: Root=1-5fe828e2-78a6fabe5d2ecfb00d66793e;Sampled=0
                    ...
Forms             : {}
Headers           : {[Connection, keep-alive], [x-amzn-RequestId, 972c5698-d5c0-407b-9d0e-2fee0d888c76], [x-amz-apigw-i
                    d, YMtTaHBVIAMF_GQ=], [X-Amzn-Trace-Id, Root=1-5fe828e2-78a6fabe5d2ecfb00d66793e;Sampled=0]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 26

これでLamda FunctionとAPI Gatewayが構築できました。

SAM Localの利用

修正の都度、UpdateStackすると時間がかかります。そこでSAM Localを使ってローカルPCで疑似的にデプロイしていきます。

sam local start-apiコマンドを実行します。コンテナが立ち上がってAPIGatewayのURLへアクセスできます。

PS C:\Project\sam-app> sam local start-api
Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template

別のコンソールを立ち上げてcurlでアクセスしています。AWS上と同じレスポンスが返ってきます。

PS C:\Users\user> curl http://127.0.0.1:3000/hello


StatusCode        : 200
StatusDescription : OK
Content           : {"message": "hello world"}
RawContent        : HTTP/1.0 200 OK
                    Content-Length: 26
                    Content-Type: application/json
                    Date: Sun, 27 Dec 2020 07:15:28 GMT
                    Server: Werkzeug/1.0.1 Python/3.8.6

                    {"message": "hello world"}
Forms             : {}
Headers           : {[Content-Length, 26], [Content-Type, application/json], [Date, Sun, 27 Dec 2020 07:15:28 GMT], [Se
                    rver, Werkzeug/1.0.1 Python/3.8.6]}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 26

削除

削除はaws CLIからCloudFormationスタックを削除します。マネコンから削除してもOKです。

PS C:\Project\sam-app> aws cloudformation delete-stack --stack-name sam-app --region us-east-1
PS C:\Project\sam-app> aws cloudformation delete-stack --stack-name aws-sam-cli-managed-default --region us-east-1

まとめ

今回はAWSのサーバレスアプリの開発を行うためにSAMとSAM Localを利用したローカル開発環境の構築方法について紹介しました。

今後はさらにDynamoDBの連携やもう少し細かい設定などについても共有できれば紹介したいと思っています。

今回は以上となります。

コメント

タイトルとURLをコピーしました