如何使用AWS IAM身份验证从Java / Spring应用程序连接到AWS RDS MySQL?

时间:2018-05-07 19:15:27

标签: java spring-data amazon-rds spring-jdbc amazon-iam

我是AWS世界的新手并且还在学习。我尝试的事情只用了一个月。

我一直在寻找它已经有好几天了,并且找不到正确的,更合适的解决方案。因此,如果有人可以通过提供示例代码,向正确的方向提供一些指针或指南来帮助我,那将是很棒的。

我有 AWS RDS MySQL 实例并创建了一个数据库。我已将“ IAM DB已启用身份验证”配置为“是”。

根据AWS文档创建 IAM角色政策

最后,我有一个 EC2实例与Tomcat一起部署并在其中运行 Java / Spring应用程序。我能够成功使用数据库凭据(如db用户名,密码,数据库URL等)访问MySQL数据库。所以我知道现在设置正确。

有人可以帮我了解如何使用 spring-jdbc AWS IAM身份验证(我在上面创建的IAM角色)从我的Java / Spring应用程序连接到此数据库)?

我在某处看到我需要在我的应用程序环境中使用证书文件或证书包文件,并且我需要生成令牌以连接到数据库。但我无法思考如何将它组合在一起。

任何帮助都将受到高度赞赏。

感谢。

2 个答案:

答案 0 :(得分:1)

我最近有一个类似的问题。

这就是我所做的:

  • 包含的Spring Cloud AWS JDBC和Spring Data JPA
  • 实现了自定义DataSourceFactory,该数据源将生成IAM访问令牌并将其用于连接

您可以找到完整的分步指南here

顺便说一句,Spring Cloud AWS JDBC提供了一些其他好处,例如只读副本或故障转移支持,并且您只需要提供RDS实例的实例ID,而不必提供完整的规范端点。

答案 1 :(得分:0)

我知道这是一个比较老的问题,但是经过一番搜索,我发现了一个非常简单的方法,您现在可以使用MariaDB驱动程序进行此操作。在版本2.5中,他们向驱动程序添加了AWS IAM credential plugin。它将自动处理令牌的生成,缓存和刷新。

我已经在默认的HikariCP连接池中使用Spring Boot 2.3进行了测试,并且在以下设置下对我来说工作正常:

spring.datasource.url=jdbc:mariadb://host/db?credentialType=AWS-IAM&useSsl&serverSslCert=classpath:rds-combined-ca-bundle.pem
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.username=iam_username
#spring.datasource.password=dont-need-this
spring.datasource.hikari.maxLifetime=600000

下载rds-combined-ca-bundle.pem并将其放在src/main/resources中,以便您可以通过SSL连接。
您还将在类路径上也需要这些依赖项:

runtime 'org.mariadb.jdbc:mariadb-java-client'
runtime 'com.amazonaws:aws-java-sdk-rds:1.11.880'

驱动程序使用标准的DefaultAWSCredentialsProviderChain,因此请确保您具有凭据,并且其策略允许在运行应用程序的任何地方都可以访问IAM DB。

此外,如果您想要故障转移支持(如他的答案中提到的@markusgulden),则可以使用here中所述的aurora模式。这样,您的端点将看起来像

jdbc:mariadb:aurora://host/db?credentialType=AWS-IAM&useSsl&serverSslCert=classpath:rds-combined-ca-bundle.pem

希望这对其他人有帮助-我在网上发现的大多数示例都涉及自定义代码,后台线程等-但使用新的驱动程序功能要容易得多!