Serverless Framework(Serverless Python Requirements) でDeployするとき使うdocker-lambda imageをDocker Hubではなく、AWS ECR Public Galleryを用いてみた

2021.07.07

はじめに

好物はインフラとフロントエンドのかじわらゆたかです。

Serverless FrameworkでPythonの依存関係を解決するときに用いるプラグインであるServerless Python Requirements ですが、PurePythonなモジュール以外を用いるときはdocker-lambdaを用いてその中で依存関係を解決させるといったことが可能です。

手元の端末からDeployするときはこれで問題ないのですが、この設定をCodeBuildに持っていくとビルドができないことがあるといった不具合が起きます。

原因と対処方法は以下の丸毛の記事の通りとなります。

以前だとこれで終わりだったのですが、今だと、上記以外にECRのパブリックレジストリを用いると行った方法でこれを解決することが可能になりました。 今回はECR パブリックレジストリを用いた解決方法を紹介します。

ECRパブリックレジストリってなんぞ?って方は以下のハマコーのブログを参照ください。

すでにServerless Frameworkの初期設定と、Serverless Python Requirementsのプラグインは導入済みとします。 Serverless Python Requirementsの設定に以下のように記載することで、AWS ECR Public Galleryを用いることが可能です。

custom:
  pythonRequirements:
    dockerizePip: true
    dockerImage: public.ecr.aws/n8r6f1x4/lambci-temporary:build-python3.8

このとき、いくつか注意事項があります。 dockerizePip: true のみを記載していた際は言語ごとのDockerイメージを取得していましたが、AWS ECR Public Galleryから取得する場合は、該当のアドレスを取得する必要があります。

各言語のAWS ECR Public Galleryから取得するアドレスについてはGithubの以下のissueにまとまっているので参考にすると良いかと思います。

Make images available in the AWS ECR Public Gallery · Issue #326 · lambci/docker-lambda

すべてのバージョンがあるわけではないのですが、用いているバージョンが存在する場合はこちらを使うことを選択しても良いかも知れません。

結論

DockerHubから取得するときに制限事項としてちょっと厄介なIP制限ですが、Docker HubのTokenを使う以外にも、AWS ECR Public Galleryを使うといった解決策もありそうです。