google/ko を AWS Lambda で使うと permission denied になる
はじめに
google/ko は Google が開発した、コンテナレジストリに簡単にアプリケーションを push できるツールです。
例えば一般的な Go のプロジェクトを用意した後、Docker を用意する必要なく簡単に push できます。
$ KO_DOCKER_REPO=mattn/ko-example
$ ko build .
これだけで Docker Hub にビルドした物が格納されます。build
コマンドの標準出力はイメージのパスが出力されますので、Google Cloud Run であれば以下の様に簡単にコンテナイメージを差し替えられる様になっています。
$ gcloud run deploy --image=$(ko build ./cmd/app)
ko は AWS Lambda でも使える
ko は Google Cloud Run で使える様に設計されていますが、設定次第では AWS や Azure、fly.io でも使える様になっています。KO_DOCKER_REPO
さえ設定すれば簡単に AWS Lambda が扱えます。
$ aws lambda update-function-code \
--function-name=my-function-name \
--image-uri=$(ko build ./cmd/app)
ところがどっこい
ところがどっこい、この ko の作者が当初 AWS Lambda で確認した時は動いていた ko が扱うベースイメージ gcr.io/distroless/base:nonroot
が、どうやら最近の AWS Lambda では動かなくなってしまっている様です。
ベースイメージを差し替える
作者の方に教えて頂いた様に以下の様にすれば AWS Lambda でも動くベースイメージに差し替えられる事が分かりました。
$ export KO_DEFAULTBASEIMAGE=alpine
$ aws lambda update-function-code \
--function-name=my-function-name \
--image-uri=$(ko build ./cmd/app)
ちなみに
現在 Oracle Cloud Functions でも扱える様にするハック方法を README に足して貰うべく動いていますが、Oracle Cloud Functions の OCIR はタグベースでしか Functions を登録する事ができません。ko の設計思想としてはダイジェストハッシュの形式で登録する事です。
そんな理由からもしかしたら pull-request は閉じられてしまうかもしれませんが、やるだけやってみます。
Discussion