【问题标题】:Elastic BeanStalk MultiContainer docker failsElastic BeanStalk MultiContainer 泊坞窗失败
【发布时间】:2017-05-04 07:41:04
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我发现这个问题是因为我遇到了同样的错误。以下是我在 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 身份验证文件中的 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]
      

      好的,repo 就在那里。所以...我的身份验证不好?是的,事实证明我遵循了 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 消息的含义),但它最终部署了。对不起小说;希望它可以帮助某人。

      【讨论】:

      • github.com/micahhausler/container-transform 对 Dockerrun.aws.json 格式非常有帮助
      • 嘿,很好的答案/教程!只剩下一个问题:如何在 Dockerrun.aws.json 中准确指定 dockercfg.json?桶名很清楚,但“关键”……是文件名吗??
      • 我在 Dockerrun.aws.json 中的部分看起来:{ "AWSEBDockerrunVersion": 2, "authentication": { "bucket": "elasticbeanstalk-us-west-2-xxxxxxx464", "key": "config.json" }, "containerDefinitions": [ {... 并且我已授予 AmazonS3FullAccess。我仍然得到CannotPullContainerError: API error (500): Get https://registry.gitlab.com/v2/XYZ/db/manifests/latest: denied: access forbidden php:
      • "authentication": { "bucket": "my-bucket", "key": "mydockercfg" },
      • 谢谢,我解决了我的问题。凭证文件 config.json 的格式只是 { "registry.gitlab.com": { "auth": "xxxx" } }。我不得不关闭我的 Mac 凭证管理器的使用并删除我的本地 config.json。然后,在本地执行 docker login 后,使用这个新的访问令牌重新创建文件(我认为它是 OAuth ?)。
      猜你喜欢
      • 2015-10-08
      • 2017-10-12
      • 2017-08-30
      • 1970-01-01
      • 2021-11-05
      • 2018-12-20
      • 2019-06-28
      • 2016-10-20
      • 1970-01-01
      相关资源
      最近更新 更多