aws elasticbeanstalk:无法通过 eb cli 部署到工作环境

Posted

技术标签:

【中文标题】aws elasticbeanstalk:无法通过 eb cli 部署到工作环境【英文标题】:aws elasticbeanstalk: cannot deploy to worker environment via eb cli 【发布时间】:2015-07-20 17:45:27 【问题描述】:

我为我的 eb 应用程序创建了一个工作环境,以便使用 cron.yaml(位于我的应用程序的根目录中)利用其“定期任务”功能。这是一个简单的 sinatra 应用程序(目前),我想用它来向相应的 Web 服务器环境发出请求。

但是,我无法通过 eb cli 进行部署。以下是我运行 eb deploy 时发生的情况。

╰─➤  eb deploy
Creating application version archive "4882".
Uploading myapp/4882.zip to S3. This may take a while.
Upload Complete.
INFO: Environment update is starting.
ERROR: Service:AmazonCloudFormation, Message:Stack named 'awseb-e-1a2b3c4d5e-stack'
aborted operation. Current state: 'UPDATE_ROLLBACK_IN_PROGRESS'
Reason: The following resource(s) failed to create: [AWSEBWorkerCronLeaderRegistry].

我查看了 CloudFormation 仪表板以检查可能的错误。在阅读了一些关于AWSEBWorkerCronLeaderRegistry 的信息后,我发现它很可能是更新/创建的DynamoDB 表。但是,当我查看DynamoDB 仪表板时,没有列出任何表格。

与往常一样,我们非常感谢任何帮助、反馈或指导。

【问题讨论】:

实例配置文件是否有 dynamodb 权限? 我通过 EB Web 控制台创建了环境。我假设(可能是错误的?)安装过程会创建访问 dynamodb 所需的权限。如何授予对环境的安全组/角色的访问权限? docs.aws.amazon.com/elasticbeanstalk/latest/dg/… 【参考方案1】:

如果您不愿意添加完整的 DynamoDB 访问权限(就像我一样),Beanstalk 现在提供了 Worker 环境权限的托管策略 (AWSElasticBeanstalkWorkerTier)。您可以尝试将其中之一添加到您的实例配置文件角色中。

见http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/iam-instanceprofile.html

【讨论】:

【参考方案2】:

我们遇到了同样的问题,并通过将 AmazonDynamoDBFullAccess 附加到 Elastic Beanstalk 角色(在我们的案例中名为 aws-elasticbeanstalk-ec2-role)来修复它。

【讨论】:

遗憾的是,我只是尝试了相同的方法,但它并没有为我解决问题。【参考方案3】:

我在使用 Codepipeline 部署我的工作人员时遇到了同样的错误。最终,我尝试为 AWS-CodePipeline-Service 提供 AmazonDynamoDBFullAccess 策略,这似乎解决了问题。

【讨论】:

【参考方案4】:

正如 Anthony 所建议的,当从 CodePileline 等其他服务触发部署时,其服务角色需要 dynamodb:CreateTable 权限才能在 DynamoDB 中创建领导者注册表(更多信息见下文)。

添加完全访问权限是一种不好的做法,应该避免。此外,托管策略 AWSElasticBeanstalkWorkerTier 没有适当的权限,因为它是让工作人员访问 DynamoDB 并检查他们是否是当前领导者。

1。找到正在尝试创建表的角色:

转到 CloudTrail > 事件历史记录 过滤器事件名称CreateTable 确保错误代码为AccessDenied 找到角色名称(即AWSCodePipelineServiceRole-us-east-1-dev):

2。添加权限:

转到 IAM > 角色 在列表中查找角色 附加策略:

    "Version": "2012-10-17",
    "Statement": [
        
            "Sid": "CreateCronLeaderTable",
            "Effect": "Allow",
            "Action": "dynamodb:CreateTable",
            "Resource": "arn:aws:dynamodb:*:*:table/*-stack-AWSEBWorkerCronLeaderRegistry*"
        
    ]

3。检查结果:

    通过触发管道重新部署 检查 Elasticbeanstalk 是否有错误 (可选)转到 CloudTrail 并确保这次请求成功。

您可以在不确定应该附加什么权限的任何时候使用此技术。

关于 Cron Leader 表

来自Periodic Tasks Documentation:

Elastic Beanstalk 使用领导者选举来确定您的工作程序环境中的哪个实例将定期任务排入队列。每个实例都尝试通过写入 Amazon DynamoDB 表来成为领导者。第一个成功的实例是领导者,并且必须继续写入表以保持领导者状态。如果领导者停止服务,另一个实例会迅速取而代之。

对于那些想知道的人,这个 DynamoDB 表使用了 10 个 RCU 和 5 个 WCU,这些都包含在始终免费层中。

【讨论】:

以上是关于aws elasticbeanstalk:无法通过 eb cli 部署到工作环境的主要内容,如果未能解决你的问题,请参考以下文章

无法提供目录 /var/www/html/public/ [Laravel - Aws Elasticbeanstalk]

为啥无法在 aws elasticbeanstalk 上登录我的 springboot 应用程序?

无法正确停止我的 AWS EC2 实例

AWS Elastic Beanstalk 无法担任角色

通过 Eclipse 插件控制将哪个 GIT 分支部署到 AWS ElasticBeanstalk

通过 git 在 AWS elasticbeanstalk 上获取和部署 PHP 应用程序