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
キーの下にそれぞれ定義する環境変数の値をJSONに含めたくない場合は、AWS SSMから取得するよう定義する
デプロイ時、
--function
で環境にあったJSONファイルを指定する
実際に見ていきます。
まずは function.staging.json
を用意します。
なお、スペースの都合上、例では FunctionName
と Environment
キーだけ記載しています。
{
"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.json
へ PackageType
と Code
キーへ設定を追加します。
例えば、以下では、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のセッションに入ります。
最終更新
役に立ちましたか?