Precena Tech Book
コーポレートサイト採用サイト
  • はじめに
  • ソフトウェア開発
    • 開発環境構築
      • Homebrew
        • Homebrew用語の意味
      • ngrok
        • ngrokの導入
        • ngrokのアップグレード(v2 to v3)
      • Slack
        • Slackの/remind コマンドの形式
        • 対面での相談を気軽にするためのSlack設定
      • AWS CLI
      • Ruby
      • Scala
      • Prettier
      • zsh
        • zsh-completion
      • Mac
        • M1 Macでの開発環境構築(rosetta 無し)
    • バックエンド
      • OpenAPI
        • OpenAPI 定義ファイル分割のすゝめ
      • Ruby on Rails
        • ActiveRecordのfind_or_initialize_byメソッドにブロックを渡したときの挙動
        • Railsのアプリケーションサーバーのプロセス数とスレッド数の設定方法
        • Railsを6.1系から7.0系へアップグレードした時に調査したこと
        • schema.rbで差分が発生する事例とその復旧について
        • tmux + overmind を利用して、複数システムを1コマンドで起動できるよう設定する
        • Rails Migrationチートシート
        • GithubのプライベートリポジトリをGemfileで参照する方法
        • ActiveSupportのto_jsonメソッドの注意点
        • 危険なJSON出力を禁止するRuboCopカスタムルールの作成方法
      • Scala
        • Validated を直列に処理したい
      • DB
        • PostgreSQLにおける、削除行に対するロック獲得時の挙動
    • フロントエンド
      • React
        • Storybookを利用したビジュアルリグレッションテスト
  • インフラ開発
    • AWS
      • IAM
        • スイッチロールの設定手順
        • AWS CLIでのスイッチロールの設定手順
        • AWS Vaultを使ったスイッチロール設定手順
        • Github ActionsでIAMロールを利用してAWSリソースを操作する
      • ECS
      • SES
        • AWS SESメールボックスシミュレーターにて、カスタムヘッダや添付ファイル付きのテストEメールを送信する
      • CloudWatch
        • Amazon SNS + Slack Workflowを使って、CloudWatch Alarmの通知をSlackチャンネルへ投稿する
      • Lambda
        • lambrollでAWS Lambda関数をデプロイしたときのTips
    • Heroku
      • HerokuのStackの設定
      • Heroku Postgresの運用でよく使うコマンド集
  • セキュリティ
    • Web
      • Same Origin PolicyとCORS
      • 脆弱性診断 2社同時依頼実施記録
  • Mail
    • SPF、DKIM、DMARCを使用した迷惑メール対策
  • データ分析
    • データ分析プロセス
  • SaaS
    • Zendesk
      • 問い合わせフォームの項目をサービスごとに出し分け、各サービス担当者に自動で振り分けてメールで通知する
  • イベント
    • RubyKaigi
      • RubyKaigi 2023 に現地参加しました
    • EMConf
      • EMConfJP2025_参加レポート
  • やってみた
    • IoT
      • Raspberry Pi + PaSoRi + Python で、勤怠打刻マシンを作ってみた
  • Precena Tech Book 管理
    • コンテンツ執筆時のルール
  • 関連リンク
    • プレセナエンジニア公式Twitter
GitBook提供
このページ内
  • 前置き
  • スイッチロール + MFAなAWS環境にてlambrollを使うには
  • 同一のソースコードを別環境へデプロイするには
  • lambrollでLambda Layer相当を使うには
  • lambrollとAWS Vaultを使っていてエラーが出たときは

役に立ちましたか?

PDFとしてエクスポート
  1. インフラ開発
  2. AWS
  3. Lambda

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

前へLambda次へHeroku

最終更新 5 か月前

役に立ちましたか?

前置き

AWS Lambda関数について、

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

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

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

という場合には、Lambdaのデプロイツールである lambroll を使うのが便利です。

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

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

 

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

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

そこで、別記事でも紹介している AWS Vault と組み合わせることでデプロイできるようになります。

 

実際に見ていきます。

まず、 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を作成することができません。

  実際に見ていきます。

最初に、 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のセッションに入ります。

その代わり、lambrollではContainer Imageでのデプロイにて代替できます。

fujiwara/lambroll: lambroll is a minimal deployment tool for AWS Lambda.
AWS Vaultを使ったスイッチロール設定手順 | Precena Tech Book
https://github.com/fujiwara/lambroll?tab=readme-ov-file#expand-ssm-parameter-values
https://github.com/fujiwara/lambroll?tab=readme-ov-file#deploy-container-image