我想在弹性beanstalk中部署一个多容器应用程序。我收到以下错误。
错误1:由于VPC的配置问题或EC2实例失败,EC2实例无法与AWS Elastic Beanstalk通信。检查您的VPC配置并尝试再次启动环境。
我只使用公有子网和安全组设置了VPC,允许所有流量进入和出站。我知道生产级别部署不鼓励这样做,但我已经降低了复杂性以找出错误原因。
因此,负载均衡器和EC2实例位于与Internet网关连接的同一公共子网内。它们共享相同的安全组,允许所有流量。
在上述错误之前,我还得到另一个错误说明
错误2:在环境中找不到ecs任务定义(或空定义文件)
话虽如此,我已将Dockerrun.aws.json
文件与源代码包中的.ebextensions
文件夹捆绑在一起,beanstalk用于部署。在完成所有这些错误后,请深入研究两个问题:
dockerrun.aws.json
文件时,我无法理解为什么没有出现ecs任务错误?我发现了这个问题因为我得到了同样的错误。以下是我在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解决这个问题的方法是
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": "[email protected]"
}
}
还有一些错误(卷sourcePath
必须是绝对路径!这就是invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed
消息的含义),但它最终部署了。对不起小说;希望它可以帮助某人。
问题是VPC。即使我只有一个公共子网的简单VPC,beanstalk也无法与实例通信,因此无法在实例中部署ECS任务定义和docker容器。
通过创建两个子网,即公共和私有,并在公有子网中具有NAT实例,后者成为私有子网中实例的路由器。使上述设置对我有用,我可以将ECS任务定义成功部署到私有子网中的EC2实例。