$30 off During Our Annual Pro Sale. View Details »

AWS_Lambdaのデプロイ手順

 AWS_Lambdaのデプロイ手順

2022.06.30 LT会 古家さん発表資料

More Decks by PharmaX(旧YOJO Technologies)開発チーム

Other Decks in Technology

Transcript

  1. AWS Lambda のデプロイ⼿順 1 AWS Lambda のデプロイ⼿順 ⽤途 Line のWebhook

    の受信をトリガーにALB の受け先としてLambda を利⽤ 責務はline からresponse 加⼯してSQS に詰めるだけ SQS+Lamba の構成で⼤量のリクエストを捌ける 短い実⾏タスクなら軽量なLambda でアプリケーションと責務を分けて可⽤性を⾼める 15 分以上かかるような⼤規模処理は向いていない。 他サービスとの連携が⽤意 ALB の特定のパスにアクセスあったらLambda を実⾏するみたいなことが⽤意 Fargate でこれやるなら、前段でLambda を挟む必要ある。
  2. AWS Lambda のデプロイ⼿順 2 https://d1.awsstatic.com/webinars/jp/pdf/services/202107_AWS_Black_Belt_Container350-Container_and_Serverless.pdf AWS でバッチ処理を実装する際の選択肢とサービス⽐較 以前、 SaaS 系スタートアップのリアルなAWS

    アーキテクチャ設計 という記事で弊社のAWS アーキテクチ ャを紹介した。記事執筆時から時が経ち、バッチ処理を本格化する必要が⽣じたためAWS でバッチ処理を 設計・実装しようとしたが、組み合わせが多くて辟易した。 ⾃分たちのサービスにあった⽅法を⾒つけよ https://zenn.dev/faycute/articles/fb310e3ccd783f デプロイ⽅法 AWS Lambda のデプロイはコンテナイメージと.zip ファイルアップロードの2 種類があります。 2020 年の12 ⽉にサポートされた。 .zip ファイルアーカイブで Ruby Lambda 関数をデプロイする AWS Lambda 関数のコードは、スクリプトまたはコンパイルされたプログラム、さらにそれらの依存関係で構成されます。 デプロイパッケージ を使⽤して、 Lambda に関数コードをデプロイします。Lambda は、コンテナイメージと .zip ファイルアーカイブの 2 種類のデプロイパッケージをサポートしています。 .zip ファイルのデプロイパッケージを作成するには、コマンドラインツール⽤の組み込み .zip ファイルアーカイブユーティリティまたは他の .zip ファイルユーティリ https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/ruby-package.html Docker の⽅が他とスキルが統⼀できてよいので、コンテナイメージでのデプロイにしました。 利⽤⾔語はメンバーが皆使えるであろうRuby を採択。 Lambda がサポートしているのが2 系なのでRuby2.7 ⼩さなプログラムでRuby3 の型をつける必要も無いので2 系で ディレクトリ構成 最低限、Line のWebhook を受け取ってログ出⼒するだけの構成になってます。 app.rb Dockerfile Gemfile https://github.com/yojo-technologies/pharmacy-dx-line-handler # アーキテクチャはLambda 側もARM64 に統ー FROM public.ecr.aws/lambda/ruby:2.7
  3. AWS Lambda のデプロイ⼿順 3 COPY app.rb ${LAMBDA_TASK_ROOT} COPY Gemfile ${LAMBDA_TASK_ROOT}

    ENV GEM_HOME=${LAMBDA_TASK_ROOT} RUN bundle install CMD [ "app.lambda_handler" ] ※ アーキテクチャをDocker イメージを合わせてます(arm64 ) Mac でDocker イメージをダウンロードするとマルチアーキテクチャでarm64 が選択される。 最初、us-west1 で作っていたらx86_64 のアーキテクチャでLambda 関数が動作するので、アーキテクチャが⼀致せずにエ ラーになった。 そのためus-west-1 以外のリージョンでアーキテクチャを指定して合わせた。 現状M1 以外の⼈がローカルでDocker デプロイするとエラーになるので後ほど、CI 化する。 デプロイ⼿順 ローカルマシンで、git clone https://github.com/yojo-technologies/pharmacy-dx-line-handler ローカルのDockerfile からスクリプトを含めたコンテナイメージを作成 docker build --no-cache -t pharmacy-chatbot-line-handler-dev . ローカルで起動する Lambda コンテナイメージをローカルでテストする https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images-test.html AWS Lambda Runtime Interface Emulator (RIE) は、Lambda ランタイム API のプロキシでコンテナイメージとしてパッ ケージ化された Lambda 関数をローカルでテストできる json のパースエラーが出てローカルでエミュレーターは動かせなかった。現状はローカルテストはせずにそのままデプロイし て動作確認してる。 curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}' イメージを Amazon ECR コンテナレジストリにアップロード AWS CLI をインストール https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html AWS の認証情報を設定 aws configure にアクセスID とアクセスキーを設定 https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html Amazon ECR レジストリに対して Docker を認証 aws ecr get-login-password このコマンドは、AmazonECR レジストリへの認証に使⽤できるGetAuthorizationTokenAPI を使⽤して認証トー クンを取得して表⽰します。 Docker CLI など、好みのコンテナクライアントのログインコマンドに認証トークンを渡すことができます このコマンドでAmazonECR レジストリに認証された後、トークンの有効期限が切れるまでIAM プリンシパルがア クセスできる限り、 クライアントを使⽤してそのレジストリからイメージをプッシュおよびプルできます。認証トークンは12 時間有 効です。
  4. AWS Lambda のデプロイ⼿順 4 docker login Docker Hub やGCR (Container

    Registry ), ECR (Elastic Container Registry )などのコンテナレジストリにログ インするコマンドです。 ログインすることで、コンテナのpush やprivate レポジトリからのpull ができるようになります。 ECR に以下コマンドでログイン これでECR レジストリへ認証してプッシュできるようになる aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 420547679007.dkr.ecr.ap-northeas ECR のリポジトリを作成 暗号化設定を有効化