未定の部屋

主にデータサイエンス関係の記事を書きます

DockerコンテナをデプロイしてLambda関数を使う

こんにちは。最近業務でAWSを触ることが多く、その中でLambdaを使うことがあったのですが、3rd partyライブラリを使うのが思ったより大変だったので記事にしようと思います。zipファイルをLambdaにアップロードする・Lambda Layerを利用するといった方法もあるのですが、今回はDockerコンテナをデプロイする方法を採用しました。この方法だと容量制限が10GBとかなり大きくなるので、容量の大きいライブラリも扱えます。

前提

  • Dockerのインストール、イメージ作成、コンテナのプッシュはEC2インスタンスで行う
  • EC2インスタンスに対してはSSH接続して操作する
  • コンテナを扱うためにAmazon ECRを使用する
    • Amazon ECR(Elastic Container Registry):フルマネージドコンテナレジストリで、Dockerイメージ保存・管理ができる

SSH接続のできるEC2インスタンスの用意

  • 下記を参考に準備してください
    miteinoheya.hatenablog.com

  • EC2から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 メディア
    ↑のサイトなどを参考にインストールとコンフィグ設定を行ってください

    • アクセスキーとシークレットアクセスキー
      • ユーザー発行時に発行されていると思います
      • ない場合はAWSマネジメントコンソールでIAM→ユーザー→[自分のユーザー名]のページに移動し、セキュリティ認証情報のタブからアクセスキーを作成できます
    • コンフィグ設定
      • リージョンについてはマネジメントコンソールで普段使っているリージョンを設定しておいた方がいいです(指定せずにSSH接続を試みたときにエラーが出たので)
      • 例えば東京ならap-northeast-1です

Dockerfileの準備

  • homeの配下などに適宜docker用のディレクトリを作成し、Dockerfileを作成します

イメージ作成とECRへのプッシュ

  • 以下のコマンドを実行します
    • イメージ名、リポジトリ名は好きな名前を入れてください
      • サイトなど見ているとイメージ名=リポジトリ名とすることが多いみたいです
    • リージョン、AWSアカウントのID(12桁ハイフンなし)は自分の使用しているものを入れてください
# 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
  • ECR上で↓のようになっていればOKです
    • ここではmecab-lambdaというリポジトリ、Dockerイメージを作っています
    • latestとv2というバージョンを作っています

Lambda関数の作成

  • AWS Lambda→関数→関数の作成から作成します

  • コンテナイメージを選び、ECRに保存したコンテナイメージを選択して作成します

  • AWSLambdaBasicExecutionRoleのポリシーが追加されているIAMロールを使用し、関数の作成を押します

    • 他サービスと連携する場合は適宜ポリシーを追加したロールを使用してください
  • その後、適宜トリガーなどを設定すれば実行できると思います

参考