【问题标题】:AWS Elastic Beanstalk deployment failedAWS Elastic Beanstalk 部署失败
【发布时间】:2015-12-15 05:17:42
【问题描述】:

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

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

请注意以下几点:

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

【问题讨论】:

  • 我确实有同样的问题,但对我来说,只要我添加 .ebextensions 文件夹就会发生这种情况。仍在研究它发生了什么......
  • 在我添加了 ebextensions 文件夹后不久,我看到了完全相同的情况。不过手动部署没有问题。

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


【解决方案1】:

我遇到了这个确切的问题,据我所知它是完全随机的,但结果证明它与 IAM 角色有关。在我使用数据库迁移脚本添加.ebextensions 之前,一切都运行良好,之后我无法让我的 Bamboo builder 再次工作。但是我设法弄清楚了(不,感谢亚马逊不存在关于 EB 需要哪些权限的文档)。

我的 IAM 政策基于此 Gist:https://gist.github.com/magnetikonline/5034bdbb049181a96ac9

但是我不得不进行一些修改。这个特定问题是由于对 S3 获取的限制过于严格,所以我简单地替换了提供的一个

{
    "Action": [
        "s3:Get*"
    ],
    "Effect": "Allow",
    "Resource": [
        "arn:aws:s3:::elasticbeanstalk-*/*"
    ]
},

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

【讨论】:

  • 实际上也偶然发现了这个“要点”,并解决了我与 s3 相关的大量权限问题,这些问题并未引发错误。非常有用....您对“s3:Get*”的观察为我解决了这个问题,谢谢。
【解决方案2】:

上传到 beanstalk 涉及将压缩后的工件发送到 S3 以及修改 cloudformation 模板(这部分无需干预)。

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

【讨论】:

  • 但是为什么它会间歇性地工作?如果我对角色有疑问,那么它根本不应该工作吗?
  • 那么这是客户端问题。 Beanstalk/IAM不是间歇性的。我会看看你部署的如何。如果有任何东西是手动的,请先进行调查。也许有一个脚本/构建/模板修改了 Beanstalk 预计不会更改或已缓存的存储桶。
  • 我想说没有手动步骤。让我再看一遍这些步骤,所有这些步骤在 Jenkins 中都是自动化的,克隆 repo ,构建项目 --> 将 war 文件复制到 s3 存储桶中 --> 部署 beanstalk。 Elastic Beanstalk 部署插件用于完成最后两个步骤。
  • 你有没有想过这个问题?我遇到了完全相同的问题,突然它停止工作,然后一些部署工作,现在又死了。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    我也遇到过这个问题,就像Rick's case 一样,结果证明是权限问题。但他的解决方案对我不起作用。

    我已经修复了

    Service:AmazonCloudFormation、Message:TemplateURL 必须引用您有权访问的有效 S3 对象。

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

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

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

      • 您不需要将所有 S3 存储桶的所有操作都允许 EB 的 IAM 用户。
      • @ddario 归咎于亚马逊及其支持团队。
      猜你喜欢
      • 2017-01-29
      • 2017-01-24
      • 2016-06-19
      • 2021-06-21
      • 2015-09-20
      • 2015-12-17
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多