我想在弹性beanstalk中部署一个多容器应用程序。我收到以下错误。
错误1:EC2实例无法与AWS Elastic通信 Beanstalk,或者是因为VPC的配置问题或者是 EC2实例失败。检查您的VPC配置并尝试启动 再次环境。
我已经设置了仅包含公有子网的VPC和允许所有流量进入和出站的安全组。我知道生产级别部署不鼓励这样做,但我已经降低了复杂性以找出错误的原因。
因此,负载均衡器和EC2实例位于与Internet网关连接的同一公有子网内。它们共享相同的安全组,允许所有流量。
在出现上述错误之前,我还会收到另一个错误说明
错误2:在环境中找不到ecs任务定义(或空定义文件)
说完了,我已将 Dockerrun.aws.json
文件与.ebextensions
文件夹捆绑在beanstalk用于部署的源包中。
在完成所有这些错误后,请深入研究两个问题:
dockerrun.aws.json
文件时,我无法理解为什么会出现没有ecs任务错误? 答案 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解决这个问题的方法是
在IAM控制台中打开Roles页面。
选择aws-elasticbeanstalk-ec2-role。
在“权限”选项卡上的“托管策略”下,选择“附加策略”。
选择应用程序使用的其他服务的托管策略。例如,AmazonS3FullAccess
或AmazonDynamoDBFullAccess
。 (对于我们的问题,S3一个)
选择附加政策。
这一部分非常令人兴奋,因为我又遇到了另一个错误: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实例。