Serverless FrameworkがLambda用コンテナを自動でECRにデプロイできるようになってた件
前回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