Elastic BeanStalk MultiContainer docker失败

时间:2016-12-19 09:30:17

标签: amazon-web-services amazon-ecs amazon-elastic-beanstalk

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

  

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

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

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

在出现上述错误之前,我还会收到另一个错误说明

  

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

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

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

2 个答案:

答案 0 :(得分: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. 选择附加政策。

  6. 这一部分非常令人兴奋,因为我又遇到了另一个错误: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": "your@email.com"
      }
    }
    

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

答案 1 :(得分:3)

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

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