触って学ぶLambda ~コンテナ駆動~

aws

今回は、Lambdaをコンテナイメージで動かしてみます。

コンテナイメージを使う理由ですが、
1モジュールで完結するような小さなプログラムであれば、コンテナイメージを使う必要は無いと思いますが、
中規模のプログラムであれば、ローカル環境で実装・デバッグして、動作したものをそのままLambda上で動作させたいですよね。

そんな時は、プログラム環境をコンテナ化して、Lambdaをコンテナイメージで動作させることでやりたいことが実現出来ます。

コンテナのベースイメージはAWSベースイメージを、
イメージ作成環境はEC2インスタンスを使っていきます。

では、作ってみましょう!

やりたいこと

  • Lambdaをコンテナイメージで動かす

やることリスト

  • コンテナイメージ作成
  • ECR(Amazon Elastic Container Registry)リポジトリ作成
  • ECRへイメージ登録
  • コンテナイメージを使ってLambda関数の作成

料金の確認

AWSサービスには、無料で使えるサービスもありますが、当然有料サービスもあります。

本章では、分かる範囲でAWSサービスの料金について書こうと思いますが、私の理解不足で漏れていることもあります。

各サービスを使う際は、料金がどのくらい掛かるかを理解した上で、自己責任で利用ください。

コンテナイメージ作成

コンテナイメージを作成する環境はEC2インスタンスを利用します。

Dockerインストール

Dockerコマンドを利用する為に、Dockerをインストールします。

$ sudo yum install docker
$ sudo systemctl start docker && sudo systemctl enable docker
$ sudo usermod -a -G docker ec2-user

EC2にログインしなおすと、docker コマンドが使えるようになります。

ファイル作成

コンテナイメージを作成する為のファイル構成は以下になります。

./hello_ecr
├Dockerfile
└app.py

app.py

import json

def handler(event, context):
    return {
        'statusCode': 200,
        'body': json.dumps('Hello ecr from Lambda!')
    }

Dockerfile

FROM public.ecr.aws/lambda/python:3.11

# 関数コードおよびランタイムの依存関係を {LAMBDA_TASK_ROOT} にコピーします。
COPY app.py ${LAMBDA_TASK_ROOT}

# CMD 引数を Lambda 関数ハンドラに設定します。
CMD [ "app.handler" ]

Dockerイメージ作成

hello_ecr フォルダ内で以下コマンドを実行します。

$ docker build -t <イメージ名> .

動作確認

下記コマンドを実行し、
‘Hello ecr from Lambda!’
が返って来れば成功です。

$ docker run -d -p 9000:8080 <イメージ名>
$ curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

ECRリポジトリ作成

Lambdaからコンテナイメージを使う為には、事前にECRのリポジトリにdocker imageを登録してあげる必要があります。

その為、先ずはECRにリポジトリを作成してあげましょう。

AWSコンソール画面から、
Amazon Elastic Container Registry サービスを開きます。

リポジトリの作成

Repositories > 「リポジトリを作成」 ボタンを押下。

可視性設定に、「プライベート」を選択。

リポジトリ名に、任意の名前を入力。

後の設定はデフォルトで、最後尾の「リポジトリを作成」ボタンを押下します。

ECRへイメージ登録

さきほど作成したdocker imageを、ECRのリポジトリに登録します。

ポリシー設定

EC2からECRのリポジトリに登録するには、許可ポリシーを設定する必要があります。
また、合わせて信頼ポリシーも記載しておきます。

EC2のIAMロールにアタッチしてください。

許可ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken",
                "ecr:BatchCheckLayerAvailability",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload",
                "ecr:PutImage"
            ],
            "Resource": "*"
        }
    ]
}

信頼ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
 	    "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

イメージのデプロイ

「get-login-password」 コマンドを実行して Amazon ECR レジストリに EC2インスタンス を認証します。

$ aws ecr get-login-password --region <リージョン名> | docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com

リポジトリにイメージをプッシュできるように、イメージにタグを付けます。

$ docker tag <イメージ名>:latest <アカウントID>.dkr.ecr.<リージョン名>.amazonaws.com/<リポジトリ名>:latest

リポジトリにイメージをプッシュします。

$ docker push <アカウントID>.dkr.ecr.<リージョン名>.amazonaws.com/<リポジトリ名>:latest

Lambda関数の作成

下準備が整いました・・・
さて、いよいよコンテナイメージを使って、Lambda関数を作ってみましょう!

AWSコンソール画面から、
Amazon Lambda サービスを開きます。

関数の作成

関数 > 「関数の作成」 ボタンをクリックし、設定画面に遷移します。

「コンテナイメージ URI」には、イメージを登録したリポジトリのURIを入力します。
また、「イメージを参照」ボタンを押して、イメージを選択します。

最後に、最後尾の「関数の作成」ボタンを押下して、Lambda関数の作成終了です♪

動作確認

関数内の「テスト」タブの「テスト」ボタンを押します。
「”statusCode”: 200」の次の行に、
‘Hello ecr from Lambda!’
が返って来れば成功です。

最後に

如何でしたか?
座学で勉強するより更なる学びがあったのではないでしょうか。

タイトルとURLをコピーしました