AWS Elastic Beanstalk部署失败

时间:2015-09-18 06:45:36

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

当我尝试将Java Web应用程序部署到Elastic Beanstalk Tomcat容器时,它失败并出现以下错误:

Service:AmazonCloudFormation, Message:TemplateURL must reference a valid S3 object to which you have access.

请注意以下几点:

  • 通过在EC2服务器上运行的Jenkins自动部署。
  • 此错误不是一个持续的问题。有时它已成功部署,但有时它因上述错误而失败。

5 个答案:

答案 0 :(得分:4)

我遇到了这个确切的问题,我可以说它完全是随机的,但事实证明它与IAM角色有关。在我使用数据库迁移脚本添加.ebextensions之前,一切都运行良好,之后我无法让Bamboo构建器再次运行。然而,我设法弄清楚了(不,多亏了亚马逊关于EB需要什么权限的非现有文档)。

我根据这个要点制定了IAM政策:https://gist.github.com/magnetikonline/5034bdbb049181a96ac9

但是我不得不做一些修改。这个特定的问题是由S3上的限制性政策引起的,所以我只是替换了

提供的那个
{
    "Action": [
        "s3:Get*"
    ],
    "Effect": "Allow",
    "Resource": [
        "arn:aws:s3:::elasticbeanstalk-*/*"
    ]
},

这允许具有该策略的用户对存储桶执行各种Get操作,因为我无法找到需要哪个特定的操作。

答案 1 :(得分:1)

上传到beanstalk涉及将一个压缩的工件发送到S3以及修改cloudformation模板(这部分是免提)。

可能附加到jenkins运行程序(或访问凭据)的IAM角色无权访问相关的S3存储桶。通过IAM确保这一点。请参阅:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/AWSHowTo.iam.html

答案 2 :(得分:0)

这是一个边缘案例,但我想在这里为后人捕捉它。有时可以将此错误消息作为一般错误消息返回。我花了很多时间与AWS一起解决这个错误,发现它与安全令牌服务(STS)凭据到期有关。生成STS凭据时,会话的最长持续时间为36小时。如果生成36小时密钥,则Elastic Beanstalk使用的某些服务不会考虑此会话长度并认为会话已过期。要解决此问题,我们不再允许会话长度超过2小时的STS凭据。

答案 3 :(得分:0)

我也一直在努力解决这个问题,就像在Rick's case中一样,结果证明这是一个权限问题。但他的解决方案对我没用。

我修好了

  

服务:AmazonCloudFormation,消息:TemplateURL必须引用您有权访问的有效S3对象。

单独添加"s3:Get*"是不够的,我还需要"s3:List*"

有趣的是,我只针对三个EB环境中的问题。事实证明,其他环境确实同时部署到所有节点,而有问题的环境已启用滚动更新(显然,执行其他操作,添加新实例等)。

以下是适用的最终IAM政策:gist: IAM policy to allow Continuous Integration user to deploy to AWS Elastic Beanstalk

答案 4 :(得分:-1)

我有同样的问题。根据我从AWS支持中收集的内容,IAM用户需要完全访问S3才能执行部署等操作。这是因为EB使用CloudFormation,它使用S3来存储模板。您需要附加托管策略" AWSElasticBeanstalkFullAccess"执行部署的IAM用户,或创建如下所示的策略并将其附加到用户。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*"
        }
    ]
}

理想情况下,亚马逊应该有办法将资源限制在特定的存储桶中,但它现在看起来并不现在可行!