DockerコンテナをデプロイしてLambda関数を使う
こんにちは。最近業務でAWSを触ることが多く、その中でLambdaを使うことがあったのですが、3rd partyライブラリを使うのが思ったより大変だったので記事にしようと思います。zipファイルをLambdaにアップロードする・Lambda Layerを利用するといった方法もあるのですが、今回はDockerコンテナをデプロイする方法を採用しました。この方法だと容量制限が10GBとかなり大きくなるので、容量の大きいライブラリも扱えます。
前提
SSH接続のできるEC2インスタンスの用意
下記を参考に準備してください
miteinoheya.hatenablog.comEC2からECRにログインする際に「AmazonEC2ContainerRegistryFullAccess」のポリシーが必要になるので、↑で作ったIAMロールに新たにポリシーを追加しておく必要があります
IAMのページからEC2にアタッチしているIAMロールを選択し、ポリシーをアタッチを選択
その他の許可ポリシーに「AmazonEC2ContainerRegistryFullAccess」と入力し、出てきたポリシーを追加
EC2インスタンスでの作業
インスタンスにDockerとAWS CLIを入れる
# Dockerのインストール sudo yum update -y sudo yum install -y docker sudo systemctl start docker sudo systemctl enable docker sudo usermod -a -G docker ec2-user # AWS CLIのインストール sudo yum install -y unzip curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install
AWS CLIの初期設定を行います
AWS CLIとは?インストール手順や使い方を初心者向け…|Udemy メディア
↑のサイトなどを参考にインストールとコンフィグ設定を行ってください
Dockerfileの準備
- homeの配下などに適宜docker用のディレクトリを作成し、Dockerfileを作成します
イメージ作成とECRへのプッシュ
- 以下のコマンドを実行します
# Dockerイメージのビルド docker build -t <イメージ名> . # ECRにリポジトリを作成 aws ecr create-repository --repository-name <リポジトリ名> --region <リージョン> ## Qでコマンド入力画面に戻る # イメージにタグを付ける docker tag <イメージ名>:latest <AWSアカウントのID>.dkr.ecr.<リージョン>.amazonaws.com/<リポジトリ名>:latest # Amazon ECRにログイン aws ecr get-login-password --region <リージョン> | docker login --username AWS --password-stdin <AWSアカウントのID>.dkr.ecr.<リージョン>.amazonaws.com # イメージをECRにプッシュ docker push <AWSアカウントのID>.dkr.ecr.<リージョン>.amazonaws.com/<リポジトリ名>:latest
- プッシュした後にDockerfileなどを書き換える場合は、以下の手順で再プッシュします
- 作成したイメージに↑と異なるDockerタグをつけることでバージョンを管理します
- 一度ログインしていれば、ECRにログインするコマンドは再度入力する必要はありません
# 新しいバージョンのタグ(ここではv2)でイメージをビルド docker build -t <イメージ名>:v2 . # 新しいイメージにECRリポジトリ用のタグを付ける docker tag <イメージ名>:v2 <AWSアカウントのID>.dkr.ecr.<リージョン>.amazonaws.com/<リポジトリ名>:v2 # 必要に応じてECRにログイン # イメージをECRにプッシュ docker push <AWSアカウントのID>.dkr.ecr.<リージョン>.amazonaws.com/<リポジトリ名>:v2
Lambda関数の作成
AWS Lambda→関数→関数の作成から作成します
コンテナイメージを選び、ECRに保存したコンテナイメージを選択して作成します
AWSLambdaBasicExecutionRoleのポリシーが追加されているIAMロールを使用し、関数の作成を押します
- 他サービスと連携する場合は適宜ポリシーを追加したロールを使用してください
その後、適宜トリガーなどを設定すれば実行できると思います
参考
- ChatGPT
- ECRにDockerコンテナイメージをpush、pullする