AWS

AWS SAM CLIを使ってローカルでLambda関数をビルド・実行・デプロイする

投稿日:

Lambdaで何かをするときチマチマAWSコンソールを触らないといけないとなると面倒すぎる。
ローカルでデバッグ・デプロイできるとかなり楽になる。AWS SAMを使ってみる。

AWS SAM(Serverless Application Model)。広くAWSのServerlessサービスがまとめられている。
AWS SAM CLIのGAは2020年8月。それから何回かアップデートされている。

AWS SAMの実体はCloudFormation。CloudFormationを使ってリソースの構築が走る。
普段CloudFormationを使っていないとSAMのコマンドがコケた時に意味不明なエラーで悩むことになる。

で、悩みながらHelloWorldしてみた。

Permissions

CloudFormationで各種リソースを作る仕組みであるため、同等のPermission設定が必要。
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-permissions.html

AWS SAM は、AWS リソースへのアクセスを制御するために、AWS CloudFormation と同じメカニズムを使用します。詳細については、AWS CloudFormation ユーザーガイドの「Controlling access with AWS Identity and Access Management」を参照してください。
サーバーレスアプリケーションを管理するためのユーザー権限の付与には、3 つの主なオプションがあります。各オプションは、ユーザーに異なるレベルのアクセスコントロールを提供します。
– 管理者権限を付与する。
– 必要な AWS 管理ポリシーをアタッチする。
– 特定の AWS Identity and Access Management (IAM) 許可を付与する。

必要な管理ポリシーは以下。

  • AWSCloudFormationFullAccess
  • IAMFullAccess
  • AWSLambda_FullAccess
  • AmazonAPIGatewayAdministrator
  • AmazonS3FullAccess
  • AmazonEC2ContainerRegistryFullAccess

触るユーザーにロールを割り当て、上記の管理ポリシーをアタッチしておくこと。
aws configureでprofileを設定しておいて、samコマンドのオプションにprofileを渡せる。

インストール

homebrewでインストール。

初期化

sam initでプロジェクトディレクトリを作成できる。
対話的に雛形を作るか、またはテンプレートを読み込む。
Lambdaで使える言語は割と多いが、NodejsとPythonがほとんどとのこと。
NodejsがMost popular runtimeとして扱われてるんだな。
Python書きたくないなというか。all right

プロジェクト内は以下のような構成となった。

app.jsがコード本体. Hello World.が書かれている。
eventを受け取るlambdaHandlerというアロー関数があって200を返してる。

ビルド

そもそもどういう仕組みなのかというと、Lambdaの実行環境をエミュレートしたコンテナが背後にあり、
その中でコードを実行する、ということになっている。それがゴニョゴニョと隠蔽されている。
Lambda関数のコードをビルドしてデプロイ用の「アーティファクト」を作る。

ローカルで実行

そしてローカルで実行。
Lambdaをエミュレートするコンテナが動いてapp.jsにあるアロー関数が評価される。
1発目は重いが2発目以降は結構速い。

デプロイ

以前はもっと面倒だったらしい。新しいSAMではコマンド1発でデプロイできる。
ただし、1回目と2回目以降でフローが異なる。
1回目ではsamconfig.tomlという設定ファイルを作成する。
2回目以降、作成済みのsamconfig.tomlを使ってデプロイが行われる。

最後の文節にあるように、samconfig.tomlを変更することで構成を変更できる。
この後、実際にCloudFormationスタックのアップロード/実行が走りリソースが組み上がる。

2回目以降、-gオプション抜きでsam deployを実行すると以下。

Webコンソールで動作確認

Webコンソール上、生成されたLambda関数を確認できる。

HelloWorldが書かれたapp.jsが見える。

Testでサンプルイベントを送るとHelloWorldが200で返ってきた。OK。

-AWS
-

Copyright© ikuty.com , 2022 AllRights Reserved Powered by AFFINGER4.