eb cli で elasticbeanstalk を使用して AWS マルチコンテナをデプロイしようとすると CannotPullContainerError が発生する

eb cli で elasticbeanstalk を使用して AWS マルチコンテナをデプロイしようとすると CannotPullContainerError が発生する

CLIを使用してシンプルな Docker イメージを AWS ElasticBeanstalk にデプロイしようとしましたebが、次のエラーのため ECS で Docker サービスを開始できません。

参照形式が無効です: リポジトリ名は小文字でなければなりません

私のDockerrun.aws.jsonファイル:

{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "name": "ipsec-vpn-server",
      "image": "hwdsl2/ipsec-vpn-server:latest",
      "essential": true,
      "memory": 128,
      "portMappings": [
        {
          "hostPort": 500,
          "containerPort": 500
        },
        {
          "hostPort": 4500,
          "containerPort": 4500
        }
      ]
    }
  ]
}

私の.ebignore

# Only keep Dockerrun.aws.json
*
!Dockerrun.aws.json

AWSElasticBeanstalkMulticontainerDocker役割を次に添付しましたaws-elasticbeanstalk-service-role:

aws --profile my-profile-name \
iam attach-role-policy \
policy-arn arn:aws:iam::aws:policy/AWSElasticBeanstalkMulticontainerDocker \
--role-name aws-elasticbeanstalk-service-role

AWSElasticBeanstalkMulticontainerDocker ポリシー (aws-elasticbeanstalk-service-role)

次のように aws eb 環境を作成しました:

export VPN_USER="some_secret_user"
export VPN_PASSWORD="some_secret_password"    
export VPN_IPSEC_PSK="some_secret_ipsec_psk"

eb create vpn-example \
--profile my-profile-name \
--region us-east-1 \
--platform multi-container-docker-17.09.1-ce-\(generic\) \
--envvars VPN_USER=${VPN_USER} \
--envvars VPN_PASSWORD=${VPN_PASSWORD} \
--envvars VPN_IPSEC_PSK=${VPN_IPSEC_PSK} \
--cname some-vpn-example-domain

環境は正しく作成されましたが、ご覧のとおり、正常ではありません ;)

eb 環境

環境の作成はしばらく実行され、ロード バランサーなどを作成します。ただし、ECS ダッシュボードでタスクを何度も起動しようとすると、しばらくすると失敗します。

ECS クラスター

単一のタスクをクリックすると、次のように表示されます。 参照形式が無効です: リポジトリ名は小文字でなければなりません

状態:

停止しました (CannotPullContainerError: API エラー (400): 無効)

詳細ステータス理由:

CannotPullContainerError: API エラー (400): 無効な参照形式: リポジトリ名は小文字である必要があります

最新のイベントでは、Elastic Beanstalk 環境で次の警告が表示されます。

環境のヘルスが「低下」から「重大」に遷移しました。すべてのインスタンスでコマンドが失敗しました。すべてのインスタンスで ELB ヘルスが失敗しているか、利用できません。

eb logs出力は全くありません。

containerDefinitions私は'sでは大文字を一切使用しませんimage。私が見つけた唯一の奇妙な点は、Imageタスク内の列に、大文字Dockerrun.aws.jsonがどこにあると予想されるかが示されていることですhwdsl2/ipsec-vpn-server(そう思います)。

また、これはタスクではなくサービスだと思っていました。ご協力いただければ幸いです。

ログを読む方法が見つからないようです。最初からやり直してみたところ、eb createコマンドのログは次のようになりました。

WARNING: The Multi-container Docker platform requires additional ECS permissions. Add the permissions to the aws-elasticbeanstalk-ec2-role or use your own instance profile by typing "-ip {profile-name}".
For more information see: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker_ecs.html#create_deploy_docker_ecs_role
Creating application version archive "app-xxxx-xxxxxx_xxxxxx".
Uploading example-vpn/app-xxxx-xxxxxx_xxxxxx.zip to S3. This may take a while.
Upload Complete.
Environment details for: vpn-dev-01
  Application name: example-vpn
  Region: us-east-1
  Deployed Version: app-xxxx-xxxxxx_xxxxxx
  Environment ID: e-mtwbaums2n
  Platform: arn:aws:elasticbeanstalk:us-east-1::platform/Multi-container Docker running on 64bit Amazon Linux/2.9.0
  Tier: WebServer-Standard-1.0
  CNAME: example-vpn-SNIP.us-east-1.elasticbeanstalk.com
  Updated: 2018-03-22 18:55:03.173000+00:00
Printing Status:
INFO: createEnvironment is starting.
INFO: Using elasticbeanstalk-us-east-1-xxxxxxxxxxxx as Amazon S3 storage bucket for environment data.
INFO: Created security group named: sg-SNIP
INFO: Created security group named: awseb-e-SNIP
INFO: Created load balancer named: awseb-e-SNIP
INFO: Created Auto Scaling launch configuration named: awseb-e-SNIP
INFO: Created Auto Scaling group named: awseb-SNIP
INFO: Waiting for EC2 instances to launch. This may take a few minutes.
INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:us-east-1:SNIP
INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:us-east-1:SNIP
INFO: Created CloudWatch alarm named: awseb-e-SNIP
INFO: Created CloudWatch alarm named: awseb-e-SNIP
ERROR: Failed to start ECS task: arn:aws:ecs:us-east-1:xxxxxxxxxxxx:task/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx is STOPPED.
ERROR: ECS task stopped due to: Essential container in task exited. (ipsec-vpn-server: )
ERROR: Failed to start ECS task: arn:aws:ecs:us-east-1:xxxxxxxxxxxx:task/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx is STOPPED.
ERROR: Failed to start ECS task after retrying 2 times.
ERROR: [Instance: i-xxxxxxxxxxxxxxxxx] Command failed on instance. Return code: 1 Output: trying 2 times.' --severity ERROR
+ exit 1.
Hook /opt/elasticbeanstalk/hooks/appdeploy/enact/03start-task.sh failed. For more detail, check /var/log/eb-activity.log using console or EB CLI.
INFO: Command execution completed on all instances. Summary: [Successful: 0, Failed: 1].
ERROR: Create environment operation is complete, but with errors. For more information, see troubleshooting documentation.

別のDockerイメージで再度試してみたnginx:latestところ、サービスは開始されました。問題はhwdsl2/ipsec-vpn-server:latest直接。ローカルでもう一度試してみました:

docker pull hwdsl2/ipsec-vpn-server:latest
eb local run --debug

そして、次のエラーが表示されました:

ipsecvpnserver_1 | Error: This Docker image must be run in privileged mode.
ipsecvpnserver_1 |
ipsecvpnserver_1 | For detailed instructions, please visit:
ipsecvpnserver_1 | https://github.com/hwdsl2/docker-ipsec-vpn-server
ipsecvpnserver_1 |
elasticbeanstalk_ipsecvpnserver_1 exited with code 1

elasticbeanstalk のログは必ずしも読みやすいとは限りません。私はこれを追加しましたDockerrun.aws.json:

"privileged": true,

現在、ローカルで実行すると正常に起動しますeb local runが、クラウドではまだ失敗します。

私が作ったhwdsl2/docker-ipsec-vpn-server の問題

関連情報