こんにちは。よっしーです(^^)
今日は、Terrafromを利用して構築したECRにイメージをプッシュする方法についてご紹介します。
前提
Terraformを利用したECRの構築方法は下記の記事にあります。
背景
ECS環境を構築するにあたり、ECRの作成が必要だったので、前回の記事ではECR環境の構築をご紹介しました。本記事では、その環境にイメージをプッシュする方法をご紹介します。
作業ディレクトリの作成
下記のコマンドで作業ディレクトリを作成します。
mkdir push_image
cd push_image
使用するコマンドのバージョン指定
下記のコマンドを実行します。
asdf local awscli 2.13.7
もし、指定のバージョンがインストールされていなければ、下記の手順でインストールできます。
# awscli
asdf install awscli 2.13.7
詳しくは下記のサイトをご覧ください。
下記のコマンドで指定のバージョンが利用できることを確認します。
% aws --version
aws-cli/2.13.7 Python/3.11.4 Darwin/22.5.0 exe/x86_64 prompt/off
イメージ作成
本記事では、nginxのイメージを作成します。
まず、下記の内容でDockerfileを新規作成します。
FROM nginx:1.24-alpine
下記のコマンドを実行します。
docker build --platform linux/amd64 -t learn_ecs_nginx:latest .
下記のコマンドを実行して、イメージが作成されていることを確認します。
% docker images learn_ecs_nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
learn_ecs_nginx latest 9b1e1f0d8b2a 13 hours ago 40.6MB
このイメージを使用して、ローカルで起動確認をします。
下記のコマンドを実行します。
docker run --rm --name learn_ecs_nginx -p 80:80 -d -it learn_ecs_nginx
下記のコマンドを実行し、同じような出力になっていれば成功です。
% curl http://localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
下記のコマンドを実行して、起動したイメージを停止します。
docker stop learn_ecs_nginx
ECRにイメージを登録する
ECRの作成
下記の記事を参考にECRを作成します。
AWSコマンドの準備
下記の記事を参考にAWS CLIの準備をします。
イメージのタグ付け
下記のコマンドを実行します。プロファイルにterraformを使用していますが、ご自身の環境に合わせて読み替えてください。
# アカウントIDの取得
AID=$(aws --profile terraform sts get-caller-identity --query Account --output text)
# ECRへログイン
aws ecr get-login-password --region ap-northeast-1 --profile terraform | docker login --username AWS --password-stdin $AID.dkr.ecr.ap-northeast-1.amazonaws.com
下記のコマンドを実行します。
aws ecr describe-repositories --output json --profile terraform | jq -r '.repositories[].repositoryName'
意図したリポジトリ名が表示されていることを確認します。
% aws ecr describe-repositories --output json --profile terraform | jq -r '.repositories[].repositoryName'
learn_aws_ecr
下記のコマンドを実行します。
docker tag learn_ecs_nginx:latest $AID.dkr.ecr.ap-northeast-1.amazonaws.com/learn_aws_ecr:0.0.1
イメージの登録
下記のコマンドを実行します。このコマンドで、ECRにイメージが登録されます。
docker push $AID.dkr.ecr.ap-northeast-1.amazonaws.com/learn_aws_ecr:0.0.1
下記のコマンドを実行して、イメージが登録されていることを確認します。
% aws ecr list-images --repository-name learn_aws_ecr --output json --profile terraform --query "imageIds[].imageTag"
[
"0.0.1",
"latest"
]
これで、RCRへのイメージ登録は完了になります。このイメージを使用して、ECS環境を構築したいと思います。その内容は次回以降の記事になります。
解説
この記事で使用したコマンドは、Amazon Web Services(AWS)を使用して、DockerコンテナをAmazon Elastic Container Registry(ECR)にアップロードするための一連のステップを表しています。以下、各コマンドの説明です。
AID=$(aws --profile terraform sts get-caller-identity --query Account --output text)
- AWSのSecurity Token Service(STS)を使用して、アクセスしているAWSアカウントのID(Account ID)を取得しています。
--profile terraform
は、AWS CLIが使用するプロファイルを指定しており、設定された認証情報を使用してコマンドを実行します。
aws ecr get-login-password --region ap-northeast-1 --profile terraform | docker login --username AWS --password-stdin $AID.dkr.ecr.ap-northeast-1.amazonaws.com
- ECRリポジトリにDockerイメージをアップロードするために、DockerクライアントをECRにログインさせます。
get-login-password
コマンドは、DockerクライアントがECRにログインするためのトークン(パスワード)を取得します。このトークンはdocker login
コマンドに渡されます。--region ap-northeast-1
は、リージョンを指定しています。--username AWS
は、ログインするユーザー名として “AWS” を指定しています。--password-stdin
は、パスワードを標準入力から渡すことを示しています。$AID.dkr.ecr.ap-northeast-1.amazonaws.com
は、ECRリポジトリのURIを指定しています。
aws ecr describe-repositories --output json --profile terraform | jq -r '.repositories[].repositoryName'
- AWS CLIを使用して、ECR内のすべてのリポジトリの情報を取得します。
jq
コマンドを使用して、取得したJSONデータから各リポジトリの名前を抽出して表示します。
docker tag learn_ecs_nginx:latest $AID.dkr.ecr.ap-northeast-1.amazonaws.com/learn_aws_ecr:0.0.1
- ローカルの Docker イメージをタグ付けして、ECRリポジトリにアップロードする準備をします。
learn_ecs_nginx:latest
は、ローカルのDockerイメージの名前とタグです。$AID.dkr.ecr.ap-northeast-1.amazonaws.com/learn_aws_ecr:0.0.1
は、ECRリポジトリにアップロードするためのタグ付けされた名前とタグです。
docker push $AID.dkr.ecr.ap-northeast-1.amazonaws.com/learn_aws_ecr:0.0.1
- タグ付けされたDockerイメージをECRリポジトリにアップロードします。
aws ecr list-images --repository-name learn_aws_ecr --output json --profile terraform --query "imageIds[].imageTag"
- 特定のECRリポジトリ内のイメージのタグ一覧を表示します。
--repository-name learn_aws_ecr
は、操作するリポジトリの名前を指定します。--query "imageIds[].imageTag"
は、取得するデータのクエリを指定しています。
おわりに
今日は、Terrafromを利用して構築したECR環境にイメージをプッシュする方法についてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント