【问题标题】:Could not connect to Amazon SimpleDB from Elastic Beanstalk无法从 Elastic Beanstalk 连接到 Amazon SimpleDB
【发布时间】:2015-12-10 05:17:06
【问题描述】:

我有一个与 Amazon SimpleDB 通信的应用程序。在 localhost 上运行时一切正常,我将这个 webapp 部署到我的 Tomcat 实例。

我在本地 Tomcat 和部署应用程序的 Elastic Beanstalk 上都将 AWS 凭证指定为环境变量。

但是,在 Elastic Beanstalk 上,我得到一个 Autowire 异常(它是一个 spring-boot 应用程序),这是由以下原因引起的:

Caused by: com.amazonaws.AmazonServiceException: User (arn:aws:sts::295923482971:assumed-role/aws-elasticbeanstalk-ec2-role/i-b35eef66) does not have permission to perform (sdb:ListDomains) on resource (arn:aws:sdb:us-east-1:295923482971:domain/). Contact account owner. (Service: AmazonSimpleDB; Status Code: 403; Error Code: AuthorizationFailure; Request ID: a20f4ed9-a54d-ec13-2886-b5d31cce3778)
    at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1088)
    at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:735)
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:461)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:296)
    at com.amazonaws.services.simpledb.AmazonSimpleDBClient.invoke(AmazonSimpleDBClient.java:1021)
    at com.amazonaws.services.simpledb.AmazonSimpleDBClient.listDomains(AmazonSimpleDBClient.java:708)
    at com.amazonaws.services.simpledb.AmazonSimpleDBClient.listDomains(AmazonSimpleDBClient.java:974)
    at com.berrycloud.paypal.service.impl.SimpleDBServiceImpl.init(SimpleDBServiceImpl.java:53)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at 

这发生在启动过程中,我将以下代码自动装配到一个类中:

  @PostConstruct
  private void init() {
    log.debug("Setting database client endpoint: {}", endpoint);
    client.setEndpoint(endpoint);

    // check if the domain exists
    log.debug("Listing existing domains...");

    final List<String> tableNames = client.listDomains().getDomainNames();
    if (!tableNames.contains(domain)) {
      // if not, create it
      log.debug("Creating domain {}", domain);
      client.createDomain(new CreateDomainRequest(domain));
    }
  }

我在本地和 Elastic Beanstalk 上都使用相同的 AWS 凭证,所以我不明白为什么它在第一种情况下工作但在另一种情况下失败。有人可以帮帮我吗?

【问题讨论】:

    标签: java tomcat amazon-web-services spring-boot amazon-elastic-beanstalk


    【解决方案1】:

    您对用户有任何政策吗?一般来说,这说明IAM政策不够好,你可以阅读更多here

    您可以尝试添加:

    {
       "Version": "2015-09-14",
       "Statement":[{
          "Effect":"Allow",
          "Action":"sdb:ListDomains",
          "Resource":"arn:aws:sdb:us-east-1:295923482971:domain/<youraccount>"
          }
       ]
    }
    

    【讨论】:

    • 但是如果与我使用的凭据相关的用户没有此策略,那么它首先不会在 localhost 上工作,对吧?因为我可以使用这些凭据从本地计算机连接到 SimpleDB...
    • 对,我看到了.. 我不确定,我没有设置可以重现,但可能对于内部 aws 服务,还有其他检查
    【解决方案2】:

    甚至还有一种简单的方法可以使用

    找出缺少的策略

    PolicySimulator from AWS

    • 选择您要模拟的服务
    • 选择与该服务相关的操作
    • 要么使用现有策略,要么创建新的临时策略来试用它

    【讨论】:

      猜你喜欢
      • 2015-04-13
      • 2021-02-14
      • 2016-08-24
      • 2011-09-06
      • 1970-01-01
      • 2016-11-09
      • 2015-09-18
      • 1970-01-01
      • 2021-10-07
      相关资源
      最近更新 更多