プライベートリポジトリから Docker イメージを取り出して、自分の Elastic Beanstalk プラットフォームで使用したいと考えています。
簡単な説明
プライベートリポジトリからイメージをプルすると、Elastic Beanstalk インスタンスから次のエラーが表示されることがあります。
**/var/log/ecs/ecs-agent.log からのエラーメッセージ\ [CanNotPullContainerError] デーモンからのエラー応答:{username}/{repo} のプルアクセスが拒否されました。リポジトリが存在しないか、「Docker ログイン」が必要な可能性があります: 拒否: リソースへのリクエストされたアクセスは拒否されました」module=docker_client.go **
このエラーは、プライベートレジストリと Elastic Beanstalk の間に認証ギャップがある場合に発生します。プライベートリポジトリのイメージを使用するには、Elastic Beanstalk はプライベートリポジトリをホストしているオンラインレジストリでの認証が必要となります。プライベートリポジトリからイメージを取得してデプロイする前に、認証を受ける必要があります。Elastic Beanstalk 環境の認証情報を取得して保存し、プライベートリポジトリへの認証を行うには 2 つのオプションがあります。
- AWS Systems Manager (SSM) Parameter Store
- DockerRun.aws.json ファイル
解決方法
DockerRun.aws.json ファイルを使用してプライベートリポジトリから Docker イメージを取得するには、以下の手順を実行してください。
- 有効な認証トークンを生成する
- Amazon シンプルストレージサービス (Amazon S3) バケットを作成し、認証ファイルを保存する
- Dockerrun.aws.json v2 ファイルを作成する
有効な認証トークンを生成する
**注:**AWS コマンドラインインターフェイス (AWS CLI) のコマンドの実行中にエラーが発生した場合は、最新バージョンの AWS CLI を実行しているかを確認してください。
-
次のコマンドを実行して、マシンに Docker をインストールします。
$ brew install docker
-
dockerhub でアカウントを作成します。
-
リポジトリを作成し、イメージをリポジトリに転送します。
-
Docker ログインコマンドを実行します。
$ Docker login
-
次のコマンドを使用して、credentials.env という名前のファイルを作成します。
$ vi credentials.env
-
以前に作成したファイルに次の認証情報を追加します。
注:すべてのサンプル文字列を指定した値に置き換えてから、ファイルを保存してエディターモードを終了してください。
DOCKER_USERNAME=example-user-name
DOCKER_PASSWORD=example-password
DOCKER_REGISTRY=https://index.docker.io/v1/
-
以下のコマンドを実行します。
docker run -it --rm \
-env-file=credentials.env \
v "$(pwd):/opt/data/" \
v "/var/run/docker.sock:/var/run/docker.sock" \
codeship/dockercfg-generator /opt/data/dockercfg
-
.dockercfg ファイルを取得してください。
$ cat /opt/data/dockercfg
出力例:
{
"https://index.docker.io/v1/ ": {
"auth": '**************************AMTE="
},
"HttpHeaders": {
"User-Agent": "Docker-Client/18.03.1-ce (linux)"
}
}
**注:**アプリケーションソースバンドルには必ず .dockercfg ファイルを含めてください。
Amazon S3 バケットを作成して認証ファイルを保存する
安全な Amazon S3 バケットを作成 し、.dockercfg ファイルをバケット転送します。次のことを確認してください。
- Amazon S3 バケットは、それを使用している環境と同じ AWS リージョンでホストされています。Elastic Beanstalk は、他のリージョンでホストされている Amazon S3 バケットからファイルをダウンロードすることはできません。
- S****3: GetObject オペレーションの権限は、インスタンスプロファイルの AWS Identity and Access Management (IAM) ロールに付与されています。
Dockerrun.aws.json v2 ファイルを作成する
次のコマンドを実行して DockerRun.aws.json v2 ファイルを作成し、認証パラメータの下に Amazon S3 バケット情報を追加します。
- バケットパラメータには、Amazon S3 バケット情報を追加します。
- 画像パラメータには、画像名とタグを追加します。これは dockerhub アカウントから取得することができます。
{
"AWSEBDockerrunVersion": 2,
"authentication": {
"bucket": "example-bucket-name",
"key": ".dockercfg"
},
"volumes": [
{
"name": "php-app",
"host": {
"sourcePath": "/var/app/current/php-app"
}
},
{
"name": "nginx-proxy-conf",
"host": {
"sourcePath": "/var/app/current/proxy/conf.d"
}
}
],
"containerDefinitions": [
{
"name": "php-app",
"image": "example-image-name",
"essential": true,
"memory": 128,
"mountPoints": [
{
"sourceVolume": "php-app",
"containerPath": "/var/www/html",
"readOnly": true
},
{
"sourceVolume": "awseb-logs-php-app",
"containerPath": "/var/log/sample-app"
}
]
},
{
"name": "nginx-proxy",
"image": "nginx",
"essential": true,
"memory": 128,
"portMappings": [
{
"hostPort": 80,
"containerPort": 80
}
],
"links": [
"php-app"
],
"mountPoints": [
{
"sourceVolume":"php-app",
"containerPath": "/var/www/html",
"readOnly": true
},
{
"sourceVolume": "awseb-logs-nginx-proxy",
"containerPath": "/var/log/nginx"
},
{
"sourceVolume": "nginx-proxy-conf",
"containerPath": "/etc/nginx/conf.d",
"readOnly": true
}
]
}
]
}
**注:**上記のコマンドにより、Elastic Beanstalk インスタンスはオンラインレジストリで正常に認証されます。
関連情報
プライベートリポジトリの画像を使用する
AWS Elastic Beanstalk からのプライベート Docker イメージへのアクセス