2020年の終わりに、AWSはLambdaのコンテナーイメージのサポートを発表しました。この機能を使用すると、Lambda関数を最大10GBのサイズのコンテナーイメージとしてパッケージ化してデプロイできます。この記事では、Terraformを使用して、コンテナーイメージに基づくPythonLambda関数をデプロイする方法について説明します。この記事では、Terraformを使用して、コンテナーイメージに基づくPythonLambda関数をデプロイする方法について説明します。
クラウドの世界で一般的なタスクの1つは、ソースコードリポジトリをオンプレミスからクラウドに、またはクラウド環境間で複製することです。そこで、アプローチを説明するために、GitとGitPythonのサポートをLambda関数に追加することにしました。
このデモで使用するプロジェクト構造は次のとおりです。
$ treelambda_containerlambda_container├──README.md├──lambdas│└──git_client│├──Dockerfile│└──index.py└──main.tf2ディレクトリ、4ファイル
ラムダ
–Lambda関数のソースコードを配置するフォルダー-
main.tf
– git_client Lambda関数のDockerコンテナをビルドし、後で関数をデプロイするTerraformデモコード
Dockerfile
ラムダ関数のすべての依存関係をホストするDockerコンテナーについて説明します。これがDockerfile
です コンテンツ:
FROM public.ecr.aws/lambda/python:3.8RUN yum update -y &&\ yum install -y git &&\ rm -Rf / var / cache / yum &&\ pip install git-remote-codecommit boto3 GitPython awscliCOPY index.py $ {LAMBDA_TASK_ROOT} CMD ["index.handler"]
AmazonのPython3.8パブリックDockerイメージをベースとして使用しています。次に、Gitをインストールし、yumキャッシュをクリーンアップしてコンテナーを小さくし、必要な依存関係をインストールします。これにより、認証にIAMを使用してCodeCommitでGitを使用できるようになります。
次に、 index.py
をコピーします Lambda関数コードが存在するフォルダーにファイルします。詳細については、「AWSLambda環境変数の使用」を確認してください。
最後に、コンテナの起動時にindex.pyファイルからハンドラメソッドを実行するように指定しています。
Lambdaコンテナ宣言が完了するとすぐに、それを使用するLambda関数を記述できます。これがコード例で、Gitリポジトリのクローンを作成する方法を示しています。きっと、個人的なニーズに合わせてこの例を調整できるでしょう:
import loggingimport osimport git TMP_DIR ="/ tmp" REPO_DIR ='aws-config-rules' REPO_URL =f'https://github.com/andreivmaksimov/ {REPO_DIR}' CLONE_PATH =os.path.join (TMP_DIR、REPO_DIR)LOGGER =logging.getLogger(__ name __)LOGGER.setLevel(logging.INFO)def clone(branch ='master'):repo =git.Repo.clone_from(REPO_URL、CLONE_PATH、branch =branch)withrepo。 config_writer()as git_config:git_config.set_value('user'、'email'、'[email protected]')git_config.set_value('user'、'name'、'Git Lambda')def handler(イベント、コンテキスト):LOGGER.info('Event:%s'、event)LOGGER.info('Cloning repo:%s'、REPO_URL)clone()
このコードでは、必要なPythonライブラリ、いくつかの定数、構成ロガー、およびいくつかの関数を宣言しています。
-
def clone(branch ='master')
–この関数は、Gitリポジトリのクローンを作成する方法を示しています -
def handler(event、context)
–この関数は、Lambda関数へのメインのエントリポイントであり、着信イベントをログに記録し、clone
を呼び出します。 機能
Lambdaコードを取得してそのコンテナーを宣言するとすぐに、デプロイを自動化するためのTerraformコードを記述できます。ここにあります:
variable region {default ="us-east-1"} Provider aws {region =var.region} data aws_caller_identity current {} locales {prefix ="git" account_id =data.aws_caller_identity.current.account_id ecr_repository_name ="$ {local.prefix} -demo-lambda-container" ecr_image_tag ="latest"} resource aws_ecr_repository repo {name =local.ecr_repository_name} resource null_resource ecr_image {triggers ={python_file =md5(file( " } /lambdas/git_client/index.py "))docker_file =md5(file(" $ {path.module} / lambdas / git_client / Dockerfile "))} provisioner" local-exec "{command =<
このTerraformコードは、Terraformバージョン0.14.8を使用してテストされました。
この例では、次のテラフォームリソースを使用しています。
-
aws_ecr_repository
– TerraformがDockerコンテナイメージを保存するECRレジストリを作成します。このイメージは、後でLambda関数で使用されます -
null_resource
– DockerコンテナをビルドしてECRレジストリにプッシュするために使用され、Lambda関数コードとDockerfileの変更をチェックし、Terraformがイメージを再構築してLambda関数を更新するタイミングを理解できるようにします -
aws_ecr_image
–公開されたDockerイメージに関する情報をクエリできます -
aws_iam_role
、aws_iam_policy_document
およびaws_iam_policy
– Lambda関数のパーミッション(CloudWatchへのログの送信、CodeCommitアクセス)を宣言します -
aws_lambda_function
–ラムダ関数宣言自体
ソリューションをテストするには、最初にTerraformコードをデプロイする必要があります:
terraform initterraform apply -auto-approve
次に、Lambda関数を実行する必要があります:
aws lambda invoke --function-name git-lambda out --log-type Tail --query'LogResult' --output text | base64 -d
期待される出力は次のとおりです:
START RequestId:b8b742d6-5bd6-4098-90e3-5e30f5c6e816バージョン:$ LATEST [INFO] 2021-03-16T02:10:28.064Z b8b742d6-5bd6-4098-90e3-5e30f5c6e816イベント:{} [INFO ] 2021-03-16T02:10:28.064Z b8b742d6-5bd6-4098-90e3-5e30f5c6e816クローン作成リポジトリ:https://github.com/andreivmaksimov/aws-config-rulesEND RequestId:b8b742d6-5bd6-4098-90e3-5 :b8b742d6-5bd6-4098-90e3-5e30f5c6e816期間:4069.15 ms請求期間:6131 msメモリサイズ:128 MB最大使用メモリ:83 MB初期期間:2061.73 ms
すべてをクリーンアップするには、次のコマンドを実行します。
terraform destroy
この記事では、AWS Lambda関数用のDockerコンテナーを構築し、Terraformを使用してソリューション全体をデプロイしました。この記事がお役に立てば幸いです。もしそうなら、私たちがそれを世界に広めるのを手伝ってください。ご不明な点がございましたら、下のチャットセクションでお気軽にお問い合わせください。