无法从 Elastic Beanstalk 连接到 Amazon SimpleDB
Posted
技术标签:
【中文标题】无法从 Elastic Beanstalk 连接到 Amazon SimpleDB【英文标题】:Could not connect to Amazon SimpleDB from Elastic Beanstalk 【发布时间】: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 凭证,所以我不明白为什么它在第一种情况下工作但在另一种情况下失败。有人可以帮帮我吗?
【问题讨论】:
【参考方案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。
选择您要模拟的服务 选择与该服务相关的操作 要么使用现有策略,要么创建新的临时策略来试用它【讨论】:
以上是关于无法从 Elastic Beanstalk 连接到 Amazon SimpleDB的主要内容,如果未能解决你的问题,请参考以下文章
无法通过 Python Elastic Beanstalk 中的 Flask SQLAlchemy URI 连接到 AWS MySQL RDS 实例
无法连接到 Elastic Beanstalk 上的 ActionCable
当我将 Spring Boot 应用程序部署到 AWS Elastic Beanstalk 并且无法从本地 Spring Boot 连接到 RDS 时出现 502 错误网关
无法连接到使用 Elastic Beanstalk 创建的 RDS 实例