シェルスクリプトで AWS Lambda 用 docker イメージ の動作チェックと ECR にプッシュする

以下の内容で、ドッカーイメージを構築し、ローカルで動作確認後、ECRのリポジトリにイメージをプッシュする。

### 変更履歴
2024/10/31: シンプルな処理内容に修正
2024/11/03: ログイン認証する行を追記

### こんな感じの内容
作成するイメージ名: simple_lambda_function
コンテナ名: simple_container
タグ名: 今日の日付+イメージ名
Lamda関数名: simple_function
テストに用いるデータ: json形式

前準備:
・ECRにsimple_lambda_functionのリポジトリを作成する。

テストデータ:
```json
{"input": "Are you Okay"}
```


### Windows上のWSLで実行可能なシェルスクリプトの用意
```bash
#/bin/bash

# あなたのAWSアカウントID
export AWS_ACCOUNT_ID='012345678910'

# リポジトリ名
export REPOGITORY_NAME='simple_lambda_function'
# コンテナ名
export CONTAINER_NAME='simple_container'
# リージョン
export REGION='ap-northeast-1'
# ドッカーデスクトップのホスト側のポート
export HOST_OS_LOCAL_PORT_NUMBER=10000
# ドッカー内のポート
export DOCKER_CONTAINER_PORT_NUMBER='8080'

set -e
echo "#################### START #####################"
aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com


# docker イメージビルド
echo "#################### Image Build & Container run. #####################"
docker build --provenance=false -t $REPOGITORY_NAME . || exit
docker container run --rm -d --name $CONTAINER_NAME -p $HOST_OS_LOCAL_PORT_NUMBER:$DOCKER_CONTAINER_PORT_NUMBER $REPOGITORY_NAME || exit

if docker ps | grep $CONTAINER_NAME; then
    echo "#################### invoke test ######################"
    curl -d '{"input": "are you ok?"}' http://localhost:$HOST_OS_LOCAL_PORT_NUMBER/2015-03-31/functions/function/invocations || exit

    # テストコンテナの停止
    echo ""
    echo "#################### docker stop ######################"
    docker stop $CONTAINER_NAME 2>&1
else
    echo is not running $CONTAINER_NAME
    exit
fi

# タグ付け
echo "#################### docker tag ######################"
docker tag $REPOGITORY_NAME:latest $AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$REPOGITORY_NAME:latest 2>&1

# リポジトリにプッシュ
echo "#################### docker push ######################"
docker push $AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$REPOGITORY_NAME:latest 2>&1


```
実行結果：

```bash
@DESKTOP-LAPTOPS:/mnt/c/repos/simple_lambda_function$ bash docker2ECR.sh
#################### START #####################
[+] Building 1.0s (7/7) FINISHED                                                                                                                                                            docker:default
 => [internal] load build definition from dockerfile 
 ...
 
#################### docker build Okay!!!####################
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
#################### docker run Okay!!!####################
6c20cfd9c4bb   simple_lambda_function   "/lambda-entrypoint.…"   Less than a second ago   Up Less than a second     0.0.0.0:10000->8080/tcp   simple_container
#################### invoke test ######################
{"statusCode": 200, "body": "recieved_message: Are you Okay?"}
#################### docker stop ######################
simple_container
#################### docker tag ######################
#################### docker push ######################
The push refers to repository [■■■■■■■■■■■■■■.dkr.ecr.ap-northeast-1.amazonaws.com/■■■■■■■■■■■■■■■]
bf922ea61555: Layer already exists
c863ffdfd2d1: Layer already exists
5d7c9b87d3ce: Layer already exists
c5a7082ff81e: Layer already exists
ac6e3c517a18: Layer already exists
35e8cd243a50: Layer already exists
33be6fae4e71: Layer already exists
latest: digest: sha256:■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ size: 1683
```


以下の記事を参考にしました.
参考：

https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea

https://techblog.raccoon.ne.jp/archives/1626051594.html

https://qiita.com/kyamamoto9120/items/f1cda89ffc7cb5254f17