LoginSignup
34
27

More than 1 year has passed since last update.

AWS Lambda 関数を Docker コンテナを使ってビルド & デプロイ

Last updated at Posted at 2021-09-10

シリーズ目次

概要

記事 第一回 コンテナ Lambda の”いろは”、AWS CLI でのデプロイに挑戦 ! を参考に

windows10 で AWS Lambda 関数を Docker コンテナを使ってビルド & デプロイ する方法を書きました

AWS Lambda 関数を Docker コンテナを使ってビルド & デプロイ するには以下の3ステップが必要です

1.Docker イメージを作成する
2.Docker イメージAmazon ECR リポジトリ にプッシュする
3.Lambda関数Amazon ECR リポジトリ(の Docker イメージ) から ビルドする

image.png

前提条件

Docker Desktop がインストールされていること

この記事は Windows10 上で Docker を用いて操作しています。

この記事の作業はローカル環境に Docker Desktop がインストールされていることを前提で進めます。インストールされていない場合は、インストールしてから進めてください。

Amazon CLI がインストールされていること

Amazon CLI
https://aws.amazon.com/jp/cli/

aws configure (初期化) が済んでいること

> aws configure
AWS Access Key ID [None]: ATI********CS
AWS Secret Access Key [None]: ***erg***sdfg***bs1sderg**
Default region name [None]: ap-northeast-1
Default output format [None]: json

実装

1.Docker イメージを作成する手順

手順1-1: 2つのテキストファイルを用意する

作業するフォルダを決めて
以下の2つのテキストファイルを作成しましょう

image.png

それぞれのファイルの中身は以下の通りとします。

app.py
import json

def handler(event, context):
    return {
        "statusCode": 200,
        "body": json.dumps(
            {
                "message": "hello world",
            }
        ),
    }
Dockerfile
FROM public.ecr.aws/lambda/python:3.8
COPY app.py   ./
CMD ["app.handler"]  

解説
FROM 命令で public.ecr.aws/lambda/python:3.8 と ECR の AWS 公式の公開イメージを指定していますが、amazon/aws-lambda-python:3.8 のように docker hub のイメージを参照することも可能です。
 
COPY コマンドでローカルに配置されている Lambda 関数本体である app.py ファイルをイメージにコピーしています。そして CMD で Lambda 関数のハンドラーを渡しています。

手順1-2: Dockerfile 元にビルド

Dockerfile を元にビルドしてみましょう。
コマンド docker build -t func1 . を実行します。

> docker build -t func1 .

[+] Building 19.2s (7/7) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                           

・・・<中略>・・・                                                                                                                 

=> => extracting sha256:d79191d95889cb243767819f51824443759d257388bb5ef05babed549d31a2c4                                                                                                                       
=> [2/2] COPY app.py   ./                                                                                                                                                                                      
=> exporting to image                                                                                                                                                                                          
=> => naming to docker.io/library/func1                                                                                                                                                                       

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

ビルド成功しました

image.png

2.Docker イメージを Amazon ECR にプッシュする手順

手順2-1: Amazon ECR に今回作成する Lambda 関数のイメージ用のリポジトリを作成します。

さて、ここから Amazon ECR に今回作成する Lambda 関数のイメージ用のリポジトリを作成します。

Amazon ECR とは
Elastic Container Registry の略で
Dockerのコンテナイメージを保存しておくためのレジストリで、
Dockerコンテナイメージを保存・管理・デプロイが簡単に出来ます。

image.png

手順2-2: Docker に リポジトリの URI を含めたタグを付与します。

ECR 上にリポジトリが作成されたら、リポジトリの URI を含めたタグを付与します。

docker tag func1:latest ${ACCOUNTID}.dkr.ecr.${REGION}.amazonaws.com/func1:latest

image.png

Docker Desktop の Images に追加されます。
image.png

手順2-3:リポジトリに push する前に、ECR にログインします。

> aws ecr get-login-password | docker login --username AWS --password-stdin ${ACCOUNTID}.dkr.ecr.${REGION}.amazonaws.com
Login Succeeded

手順2-4:リポジトリに push

リポジトリに push しましょう。

PS> docker push ${ACCOUNTID}.dkr.ecr.${REGION}.amazonaws.com/func1:latest
The push refers to repository [${ACCOUNTID}.dkr.ecr.${REGION}.amazonaws.com/func1]
29fe8a4ae381: Pushed 
20b4eff3dd4d: Pushing  68.11MB/92.13MB
11284767d41d: Pushing  87.48MB/199.7MB
d6fa53d6caa6: Pushed 
b09e76f63d5d: Pushed 
0acabcf564c7: Pushed 
f2342b1247df: Pushing  125.9MB/294.9MB
latest: digest: sha256:123*************************************789

push が完了すると、ダイジェストが発行されるので、覚えておく

AWS コンソールで確認すると Docker イメージが Amaxon ECR リポジトリ にアップロードされたのが確認できる
image.png

3.Lambda関数に Amazon ECR リポジトリ(の Docker イメージ) から ビルドする手順

手順3-1: AWS Lambda ダッシュボードから 関数作成 ボタンをクリックする

image.png

手順3-2: コンテナイメージから作成

ここから、Lambda 関数をコンテナイメージを利用して作成していきますが、AWS Lambda のコンテナサポートで、—package-type を指定できるようになりました。

image.png

image.png

できました 今回の Lambda関数名 は, docker_test としました

image.png

手順3-3:作成された関数を実行確認

そしていよいよ実行することができます。作成された関数を実行してみましょう。

> aws lambda invoke --function-name docer_test output ; cat output

image.png

正常に返ってきました!!

34
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
27