🤖

Serverless FrameworkがLambda用コンテナを自動でECRにデプロイできるようになってた件

2021/06/24に公開

前回ServerlessでLambdaをコンテナ対応する方法の記事を書いたのですが、この間下記のようなコメントが付きました。

バージョン2.44.0で、digestでなくタグでもデプロイできました

「お?便利になってるじゃん」と思って公式ブログの記事を見に行ったらなんとdigestが不要どころかローカルにおいてあるDockerfileを自動でbuildしてECRへpushしてくれるようになっているようでした。

…は?いつの間にそんな便利になってたの…
ということで更新版をやって行きます。
例のごとくサンプルは下記の通りなので参考にしてください。

1. ECRにpushするイメージを指定

ということでまず serverless.yml にpushするイメージを指定します。
providerに下記のように追記します。

provider:
  ecr:
    images:
      <タグ名>:
        path: <Dockerfileの置いてあるディレクトリのパス>

例えば使用するDockerfileがルートにあり、タグ名を公式ブログに合わせて appImage にした場合はこんな感じです。

provider:
  ecr:
    images:
      appImage:
        path: ./

2. 各lambdaファンクションが使うイメージを指定

次にlambdaファンクションに使用するイメージを紐付けます。
今度はfunctionsに下記のように追記します。

functions:
  <lambdaファンクション>:
    image:
      name: <タグ名>

また下記のようにCMDやENTRYPOINTを上書きすることができます。
lambdaの場合は通常CMDは使用するハンドラーを表すようになっているのでこれを各ファンクションで上書きするようにすれば作成するDockerfileを一つで済ませることができるというわけですね。

functions:
  <lambdaファンクション>:
    image:
      name: <タグ名>
      command:
        - <上書きするハンドラー>
      entryPoint:
        - <上書きするエントリーポイント>

前回の例に合わせて appImage をlambdaファンクション hello に紐付けハンドラーを hello で上書きするならこのようになります。

functions:
  hello:
    image:
      name: appImage
      command:
        - hello

ここまでを踏まえて serverless.yml 書くとこんな感じでしょうか?
前回と比べてかなりスッキリしていて引数なども考えなくてよくなってかなり良い感じだと思います。

provider:
  name: aws
  runtime: provided
  timeout: 20
  region: ap-northeast-1
  ecr:
    images:
      appImage:
        path: ./

functions:
  hello:
    image:
      name: appImage
      command:
        - hello
    events:
      - http:
          path: test
          method: get

3. デプロイしちゃう

あとはデプロイすればいいだけです。
デプロイのための処理はすべてDockerfileに追い出せている(はず)なので特に前準備もデプロイ用のスクリプトも用意することもなくserverlessの通常機能で素直にデプロイできます。
素晴らしいですね。

$ sls deploy

デプロイを実行したらECRにリポジトリが作成されているので、コストが気になる人は初回のデプロイ後にライフサイクルを仕込んでおくと節約になってよいでしょう。

まとめ

ということで駆け足でしたがServerless FrameworkがLambdaのコンテナ対応更新版でした。
lambdaもserverlessも日に日に便利になって良いですね。
後はlambdaはserverlessの機能を使ってではなくlambda自身の機能としてECRの存在は隠蔽して表面上突っ込んだDockerfileをそのまま動かしてくれるとかになれば完璧かなって思います。
(でも一番そうあってほしそうなApp Runnerでも一度ECRにpushするようにしてるあたりそういう未来はまだ先ですかね…)
ところで最近なにやら話題になっていたDockerですが、最近ではこの記事で紹介したlambdaの他にもAWSであればApp RunnerやFargate、GCPならCloud RunのようなPaaSやFaaS(CaaSと呼ぶべき?)のデプロイを受け入れるランタイムの共通規格として利用されるようになって来ていますね。
こうやってdockerを中心としてエコシステムが広がって行くのを見ていると、規格というものとそれを広く一般に利用されているということは凄まじいく世の中を便利にしていくのだなぁと思うなどしました。(日記要素)

x. github actions

前回同様おまけでデプロイ用のworkflowを置いておきますので必要に応じて参考にしてください。

name: serverless-deploy-sample

on: pull_request

jobs:
  deploy:
    name: deploy
    runs-on: ubuntu-latest
    steps:

    - name: setup node.js
      uses: actions/setup-node@v1

    - name: install sls
      run: npm i -g serverless

    - name: checkout
      uses: actions/checkout@v1

    - name: configure aws credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ap-northeast-1

    - name: deploy
      run: sls deploy --stage dev

Discussion