家族にスーパーで頼まれた買い物を間違えてしまい、俄かに落ち込んでおります yuku_tasです。


プライベートも仕事もうまく回せるといいですが、 考え事をしているとついミスをしてしまいがち ですね... 短時間集中で効率的に行いたいものです!

新緑の季節も近づいてまいりましたこの頃、プログラマーの皆様はいかがお過ごしでしょうか。

概要

AWS AppRunner + RDS環境の導入。今回はAWS ECRへのコンテナのプッシュまでを行う。

AWS ECRの初期設定

レポジトリとは?

第2回の今回は、AWS ECRへの設定を順次行ってまいりたいとおもいます。

ECRは前回作成した コンテナ の管理を行うサービスです。ソースコードを管理するGitと同様に レポジトリが存在し、バージョン管理を行うことができるようになっています。

こちらを使うことで、App Runnerにどのバージョンのコンテナをリリースしているか?を視覚的に把握することができるようになります。

レポジトリの作成

早速作成を進めていきます。まず、AWS ECRのコンソール画面にログインし入ります。

「使用方法」 を押します。

ar2_1.png

「レポジトリを作成」画面で以下の情報を入力していきます。

他は変更なしで大丈夫です。

ar2_2.png

「レポジトリを作成」を押します。

ar2_3.png

レポジトリが作成されました。

コンテナのプッシュ

次に、作成されたレポジトリのリンクをクリックします。

ar2_4.png

まだこの時点でコンテナは登録(プッシュ)されていません。

プッシュコマンドの表示 を押します。

ar2_5.png

プッシュコマンドが表示されるので、

ar2_6.png

前回作成したレポジトリのフォルダーをFinderで開きます(Macの場合)

ar2_7.png

右クリックして フォルダに新規ターミナル」 を選択します。

ar2_8.png

フォルダが開くので、先ほどのAWS ECRのプッシュコマンドを一つずつ、コピーアンドペーストで打っていきます。

# ログインを行う。成功すると「Login Succeded」と出る
% aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded

# プッシュ用のコンテナのビルドを実行 (前回実行時と異なるので注意)
% docker build -t ecr-test .
[+] Building 2.0s (9/9) FINISHED                                                
 => [internal] load build definition from Dockerfile                       0.0s
 => => transferring dockerfile: 37B                                        0.0s
 => [internal] load .dockerignore                                          0.0s
 => => transferring context: 2B                                            0.0s
 => [internal] load metadata for docker.io/library/php:8.3-apache          1.8s
 => [1/4] FROM docker.io/library/php:8.3-apache@sha256:xxxxxxxxxxxxxxxxxx  0.0s
 => [internal] load build context                                          0.0s
 => => transferring context: 58B                                           0.0s
 => CACHED [2/4] WORKDIR /var/www/html/                                    0.0s
 => CACHED [3/4] COPY src .                                                0.0s
 => CACHED [4/4] RUN service apache2 restart                               0.0s
 => exporting to image                                                     0.0s
 => => exporting layers                                                    0.0s
 => => writing image sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.0s
 => => naming to docker.io/library/ecr-test                                0.0s

#  tagを作成したDocker Imageにつけます。プッシュするためのルールのようなものなのであまり気にせず実行ください
% docker tag ecr-test:latest xxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-test:latest

# 実際のプッシュを行います
docker push xxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-test:latest
The push refers to repository [xxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-test]
197f4d432f28: Preparing 
9c4e1a5398a5: Preparing 
5f70bf18a086: Preparing 
40a9d45c9ad0: Preparing 
0db33a1cca80: Preparing 
7382263332d2: Waiting 
f51ed5d5aff0: Waiting 
aba0751d3f5d: Waiting 
4cb7db2a321f: Waiting 
1b6d427f0e7e: Waiting 
ae52d49a48af: Waiting 
aff252df8d50: Waiting 
896909d66c20: Waiting 
885fdd49d205: Waiting 
71e9b259b299: Waiting 
6e5a1bc9659a: Waiting 
denied: User: arn:aws:iam::xxxx262457:user/sc_ar is not authorized to perform: ecr:InitiateLayerUpload on resource: arn:aws:ecr:ap-northeast-1:064670013128:repository/ecr-test because no resource-based policy allows the ecr:InitiateLayerUpload action

エラーが出ました。(人によっては出ないかもしれない)

まだプッシュを実行する権限が足りない

今プッシュを実行しているユーザーの、権限が足りていない時にこのエラーメッセージが表示 されます。こちらの公式ドキュメントのトラブルシューティングを 確認の上、権限追加します。

IAMユーザーの作成

AWS IAMのユーザー画面に移動します。

ユーザーの作成 => ユーザー名「ecs-test」=> ポリシーを直接アタッチする と進みます。(他は変更なし)

ar2_9.png

「AmazonEC2ContainerRegistryFullAccess」「AWSAppRunnerServicePolicyForECRAccess」ポリシーをアタッチし、ユーザーを作成します

ar2_10.png

作成した ecr-test ユーザーを選択し、

ar2_11.png

セキュリティ認証情報 タブをクリック 下に移動してアクセスキー 項目で「アクセスキーを作成」をクリック

ar2_12.png

コマンドラインインターフェース を選択 (上記のレコメンデーションを〜にもクリックを入れてOKですが、説明の内容とリスクは把握していただいた上おすすめください。)

ar2_13.png

説明タグは入力しない形で大丈夫です。

表示されたアクセスキー・シークレットを手元にメモしておきます。

ar2_14.png
aws configureで設定

コンソール に戻り、aws configure --profile ecr-testで先ほどのアクセスキーを設定します。(--profile オプションの指定がないと、 以前に設定されたAWSのプロファイルが上書きされてしまう ので注意。)

% aws configure --profile ecr-test
AWS Access Key ID [None]: AKIxxxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json

再度プッシュ

プロジェクトルートに戻り、先ほどのプッシュコマンドを再度実行します。

時間が経って下記のように 「認証トークンの有効期限が切れている」と出た場合は、ログインのコマンドからやり直して ください。

denied: Your authorization token has expired. Reauthenticate and try again.

以下を再実行します。

% docker push xxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-test:latest
The push refers to repository [xxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-test]
197f4d432f28: Layer already exists
9c4e1a5398a5: Layer already exists
5f70bf18a086: Layer already exists
40a9d45c9ad0: Layer already exists
0db33a1cca80: Layer already exists
7382263332d2: Layer already exists
f51ed5d5aff0: Layer already exists
aba0751d3f5d: Layer already exists
4cb7db2a321f: Layer already exists
1b6d427f0e7e: Layer already exists
ae52d49a48af: Layer already exists
aff252df8d50: Layer already exists
896909d66c20: Layer already exists
885fdd49d205: Layer already exists
71e9b259b299: Layer already exists
6e5a1bc9659a: Layer already exists
latest: digest: sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx size: 3655
Signing and pushing trust metadata
Enter passphrase for root key with ID abcdefg:

パスワードの実行を求められてしまいました...

一時的にDockerの改竄防止機能を無効にする

私の場合は他のプロジェクトで、DockerContentTrust(改竄防止機能)をオンにしていたことがパスワードを聞かれ PUSHできない原因でした。

こちらのコマンドを実行し、

export DOCKER_CONTENT_TRUST=0

先ほどのコマンドを再度実行すると無事プッシュできました!

% docker push xxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-test:latest
...中略...
latest: digest: sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx size: 3655

なお、 本来、DOCKER_CONTENT_TRUSTは1に設定するべき ですが、今回はプッシュしたコンテナを複数人で利用するわけではないので、認証周りの問題を修正する必要はないと判断 しました。(商用利用時には、パスワード認証がきくように適切に設定を行うべき)

このプッシュしたECRイメージをどうAppRunnerに連携するかは、次回以降解説してまいります。

トラブルシューティング

Error: trust data missing for remote repository

push時に

rootキー・レポジトリキーを入力後 以下のエラーが出た時は、

Signing and pushing trust metadata
Enter passphrase for root key with ID xxxxx:
Enter passphrase for new repository key with ID xxxxx:
Repeat passphrase for new repository key with ID xxxxx:
Error: trust data missing for remote repository xxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-test or remote repository not found: timestamp key trust data unavailable.  Has a notary repository been initialized?

ログインから、プッシュまで「プッシュコマンドの表示」に沿ってやり直せば プッシュ自体は成功しているのでそのまま、次へ進められました。 (実運用時にこれでよいかは確認が必要)

補足: Apple Mac Siliconマシーンで実行される方は以下のようにすること!

次のApp Runner立ち上げの段階で、以下のようなエラーが出てしまいました。

05-04-2024 12:46:38 AM exec /usr/local/bin/docker-php-entrypoint: exec format error

これは、Apple Mac Siliconマシーンでビルドを実行する際のオプションが足りていないことに起因していたようです。以下のように実行すると動くので、 ビルドおよび、後続のpushをやり直し ましょう。

docker build --platform linux/amd64 -t ecr-test .

まとめ

今回はローカルでビルドしたDocker イメージを AWS ECRに登録するところまでを解説しました。

引っかかりやすいポイントがなかなか多いですが、一度設定ができるようになってしまえば特に難しいことはございません。必要に応じて、初期設定において必要となるコストを受容してまいりましょう。

次回は、AWS ECRに今回作成したDocker Imageをプッシュし、経由して 肝心のApp Runnerにデプロイ・疎通確認する までを解説してまいります。

弊社ではこのような新しい技術を通じたWebサービスの開発・保守・運営を承っておりますので 御用の際にはぜひお申し付けくださいませ。

参考URL: モルドスプーン株式会社


この記事が何かのお役に立てれば幸いです。
最後までお読みいただきありがとうございました!