lambrollでAWS Lambda関数をデプロイしたときのTips

前置き

AWS Lambda関数について、

  • ソースコードはgitで管理したい

  • ソースコードのデプロイは容易に行いたい

  • AWSの各リソースはTerraformで管理しており、別途Lambda向けのものを作る必要はない

という場合には、Lambdaのデプロイツールである lambroll を使うのが便利です。 fujiwara/lambroll: lambroll is a minimal deployment tool for AWS Lambda.

lambrollはREADMEが充実していることもあり、悩むところは少なくてすみました。

それでも、組織のAWS環境で lambroll を使う場合にはいくつか考慮することがあったため、この記事で紹介していきます。

 

スイッチロール + MFAなAWS環境にてlambrollを使うには

スイッチロール時にMFAを利用するAWS環境の場合、lambrollだけではデプロイすることができません。

そこで、別記事でも紹介している AWS Vault と組み合わせることでデプロイできるようになります。 AWS Vaultを使ったスイッチロール設定手順 | Precena Tech Book

 

実際に見ていきます。

まず、 aws-vault exec により、スイッチロール後の some-profile のシェルに入ります。

% aws-vault exec some-profile

 

続いて、lambrollで関数のデプロイを行います。

% lambroll deploy

 

同一のソースコードを別環境へデプロイするには

例えば

  • staging

  • production

の2つの環境があり、各環境へ同一ソースコードの関数をデプロイしたくなったとします。

この場合、以下の方法で実現できます。

  • lambrollでLambdaを定義する時に使うJSON (function.json) を環境ごとに用意する

      • staging環境向けは function.staging.json

      • production環境向けは function.production.json

  • 各環境の環境変数は、JSONの Environment キーの下にそれぞれ定義する

  • デプロイ時、 --function で環境にあったJSONファイルを指定する

 

実際に見ていきます。

まずは function.staging.json を用意します。

なお、スペースの都合上、例では FunctionNameEnvironment キーだけ記載しています。

{
  "FunctionName": "foo-staging",
  "Environment": {
    "Variables": {
      "FOO": "{{ ssm `/bar/baz` }}"
    }
  }
}

  続いて、AWS Consoleなどから、AWS SSMにキーを作成します。

今回は /bar/baz というキーに値を設定します。

 

最後に、staging環境向けにデプロイします。

% lambroll deploy --function=function.staging.json

  一方、production環境向けにデプロイする場合は以下となります。

% lambroll deploy --function=function.production.json

 

lambrollでLambda Layer相当を使うには

lambrollではLambda Layerを作成することができません。

その代わり、lambrollではContainer Imageでのデプロイにて代替できます。 https://github.com/fujiwara/lambroll?tab=readme-ov-file#deploy-container-image

  実際に見ていきます。

最初に、 aws-vault exec にて some-profile のシェルに入ります。

% aws-vault exec some-profile

次に、AWS ECRへdocker loginします。なお、 <> の部分は適宜読み替えてください。

% aws ecr get-login-password --profile some-profile --region <region> | docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com

Enter MFA code for arn:aws:iam::***: 
Login Succeeded

  続いて、デプロイするDockerfileを用意します。ここでは省略します。

その後、docker buildにて、タグ付きでDockerイメージをビルドします。

% docker build . -t <tag>:latest

  docker pushにて、AWS ECRへDockerイメージをpushします。

% docker push <tag>:latest

  さらに、lambrollでAWS ECRにあるコンテナイメージを使うよう、 function.jsonPackageTypeCode キーへ設定を追加します。

例えば、以下では、AWS SSMにある「ECRにあるイメージのURL( /path/to/ecr_image_url )」を指定しています。

{
  // ...
  "PackageType": "Image",
  "Code": {
    "ImageUri": "{{ ssm `/path/to/ecr_image_url` }}:latest"
  }
  // ...
}

  最後に、上記のJSONを使ってAWS ECRにあるコンテナイメージをAWS Lambdaへデプロイします。

% lambroll deploy --function=function.json

 

lambrollとAWS Vaultを使っていてエラーが出たときは

lambrollとAWS Vaultを使ってデプロイをしていると、以下のようなエラーメッセージが表示されるかもしれません。

2024/**/** **:**:** [error] FAILED. failed to load function: template attach failed: template: conf:*:*: executing "conf" at <ssm `/path/to/config`>: error calling ssm: failed to lookup ssm parameter: something went wrong calling get-parameter API: operation error SSM: GetParameter, https response error StatusCode: 400, RequestID: ***, api error ExpiredTokenException: The security token included in the request is expired

  これはAWS Vaultのセッションが切れたのが原因です。

解消するには、一度AWS Vaultのセッションを exit で抜けた後、再度AWS Vaultのセッションに入ります。

最終更新