Elastic BeanStalk MultiContainer docker失败

问题描述 投票:3回答:2

我想在弹性beanstalk中部署一个多容器应用程序。我收到以下错误。

错误1:由于VPC的配置问题或EC2实例失败,EC2实例无法与AWS Elastic Beanstalk通信。检查您的VPC配置并尝试再次启动环境。

我只使用公有子网和安全组设置了VPC,允许所有流量进入和出站。我知道生产级别部署不鼓励这样做,但我已经降低了复杂性以找出错误原因。

因此,负载均衡器和EC2实例位于与Internet网关连接的同一公共子网内。它们共享相同的安全组,允许所有流量。

在上述错误之前,我还得到另一个错误说明

错误2:在环境中找不到ecs任务定义(或空定义文件)

话虽如此,我已将Dockerrun.aws.json文件与源代码包中的.ebextensions文件夹捆绑在一起,beanstalk用于部署。在完成所有这些错误后,请深入研究两个问题:

  1. 当我打包包含containerDefinitions的dockerrun.aws.json文件时,我无法理解为什么没有出现ecs任务错误?
  2. 由于没有运行ecs任务,因此实例中没有任何内容正在运行。这是为什么beanstalk和ELB无法与实例通信? (假设我的公共子网和所有流量安全组都不是问题)
amazon-web-services amazon-ecs amazon-elastic-beanstalk
2个回答
4
投票

我发现了这个问题因为我得到了同样的错误。以下是我在Beanstalk上实际部署多容器应用程序的步骤:

为了解决这个特定错误,我使用了eb CLI工具。出于某种原因,使用eb deploy而不是压缩和上传我自己解决了这个问题。它实际上没有用,但它给了我一个新的错误。

所以,我改变了我的Dockerrun.aws.json,一种需要更多文档的文件格式,直到我不再收到错误。

然后,我得到了更好的错误!

ERROR: [Instance: i-0*********0bb37cf] Command failed on instance. 
Return code: 1 Output: (TRUNCATED)..._api_call
raise ClientError(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (AccessDenied) when 
calling the GetObject operation: Access Denied
Failed to download authentication credentials [config file name] from [bucket name].
Hook /opt/elasticbeanstalk/hooks/appdeploy/enact/02update-
credentials.sh failed. For more detail, check /var/log/eb-activity.log 
using console or EB CLI.

根据this part of the docs解决这个问题的方法是

  1. 在IAM控制台中打开Roles页面。
  2. 选择aws-elasticbeanstalk-ec2-role。
  3. 在“权限”选项卡上的“托管策略”下,选择“附加策略”。
  4. 选择应用程序使用的其他服务的托管策略。例如,AmazonS3FullAccessAmazonDynamoDBFullAccess。 (对于我们的问题,S3一个)
  5. 选择附加策略。

这部分真的令人兴奋,因为我又得到了一个错误:Authentication credentials are not in JSON format as expected. Please generate the credentials using 'docker login'.(请记住,我试图跟随the instructions关于如何做到这一点,但是,哦,好吧)。事实证明这一个在我身上,我在存储在S3上的DockerHub auth文件中存在格式错误的JSON。我将文件重命名为dockercfg.json以进行语法检查,似乎Beanstalk / ECS可以将.json作为名称的一部分,因为这次...有一个不同的错误:CannotPullContainerError: Error: image [DockerHub organization]/[repo name]:latest not found)。嗯,也许有拼写错误?让我们检查:

$ docker run -it [DockerHub organization]/[repo name]:latest
Unable to find image '[DockerHub organization]/[repo name]:latest' locally
latest: Pulling from [DockerHub organization]/[repo name]

好的,回购在那里。所以...我的认证很糟糕?是的,结果我在DockerHub auth文档中跟随了一个你应该做的事情。你的dockercfg.json应该是这样的

{
  "https://index.docker.io/v1/": {
    "auth": "ZWpMQ=Vyd5zOmFsluMTkycN0ZGYmbn=WV2FtaGF2",
    "email": "[email protected]"
  }
}

还有一些错误(卷sourcePath必须是绝对路径!这就是invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed消息的含义),但它最终部署了。对不起小说;希望它可以帮助某人。


3
投票

问题是VPC。即使我只有一个公共子网的简单VPC,beanstalk也无法与实例通信,因此无法在实例中部署ECS任务定义和docker容器。

通过创建两个子网,即公共和私有,并在公有子网中具有NAT实例,后者成为私有子网中实例的路由器。使上述设置对我有用,我可以将ECS任务定义成功部署到私有子网中的EC2实例。

© www.soinside.com 2019 - 2024. All rights reserved.