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

iqih9akk  于 2023-05-05  发布在  Java
关注(0)|答案(3)|浏览(177)

我是AWS的新手,还在学习。我只尝试了一个月。
我已经找了好几天了,还没有找到一个正确的、更合适的解决方案。因此,如果有人能给我一个示例代码,提供一些正确方向的指针或指南,那就太好了。
我创建了一个AWS RDS MySQL示例和一个数据库。我已将“IAM DB认证已启用”配置为“是”。
根据AWS文档创建了IAM角色策略
最后,我有一个使用Tomcat的EC2示例,其中部署并运行了我的Java/Spring应用程序。我能够使用数据库凭据(如数据库用户名,密码,数据库URL等)成功访问MySQL数据库。所以我知道现在一切都安排妥当了。
有人能帮助我知道如何使用spring-jdbcAWS IAM Authentication(我在上面创建的IAM角色)从我的Java/Spring应用程序连接到这个数据库吗?
我在某个地方读到,我的应用环境中需要证书文件或证书捆绑文件,并且我需要生成一个token来连接到数据库。但我不知道如何把它放在一起。
任何帮助都将受到高度赞赏。
谢谢

bzzcjhmw

bzzcjhmw1#

我最近遇到了类似的问题。
这就是我所做的:

  • Spring Cloud AWS JDBC和Spring Data JPA
  • 实现了一个自定义DataSourceFactory,它生成一个IAM访问令牌并将其用于连接

您可以找到完整的分步指南here
顺便说一句,Spring Cloud AWS JDBC提供了一些额外的好处,比如读取副本或故障转移支持,并且您只需提供RDS示例的示例ID,而不是完整的规范端点。

polhcujo

polhcujo2#

更新至2023年!

现在,使用AWS JDBC Driver for MySQL对IAM数据库身份验证的支持,可以更轻松地实现这一点。我使用Sping Boot 3和spring-boot-starter-jdbc测试了这个配置。
添加以下依赖项:

runtimeOnly 'software.aws.rds:aws-mysql-jdbc:1.1.6'
runtimeOnly 'software.amazon.awssdk:rds:2.20.57'

将以下内容添加到application.yml:

spring:
  datasource:
    jdbc-url: jdbc:mysql:aws://yourdbcluster-xxxx.cluster-xxxx.your-region.rds.amazonaws.com:3306/yourdb?useAwsIam=true
    username: iam_username
    #password: dont-need-this
    driver-class-name: software.aws.rds.jdbc.mysql.Driver

它应该只是工作!
驱动程序使用AWS default credentials provider chain,因此请确保您具有策略凭据,允许在任何运行应用程序的位置访问IAM DB。要配置故障转移支持,请查看此处的文档。希望这个更新能帮助到其他人!

*这是使用MariaDB驱动程序的旧方法-请参阅上面的更新!

我知道这是一个老问题,但经过一些搜索,我发现一个非常简单的方法,你现在可以使用MariaDB驱动程序来做到这一点。在2.5版本中,他们向驱动程序添加了AWS IAM credential plugin。它将自动处理令牌的生成、缓存和刷新。
我已经使用Sping Boot 2.3和默认的HikariCP连接池进行了测试,在这些设置下,它对我来说工作得很好:

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在他的回答中提到的那样的故障转移支持,您可以使用这里描述的aurora模式。您的端点将如下所示
jdbc:mariadb:aurora://host/db?credentialType=AWS-IAM&useSsl&serverSslCert=classpath:rds-combined-ca-bundle.pem
希望这对其他人有帮助-我在网上找到的大多数例子都涉及自定义代码,后台线程等-但是使用新的驱动程序功能要容易得多!

jljoyd4f

jljoyd4f3#

我建议使用这个库来替换HikariDatasource。其他一切都像正常一样。

<dependency>
  <groupId>io.volcanolabs</groupId>
  <artifactId>rds-iam-hikari-datasource</artifactId>
  <version>1.0.4</version>
</dependency>

相关问题