IAM角色访问AWS RDS For MySQL

news2025/5/29 7:11:44

IAM角色访问AWS RDS For MySQL

Tips: 写这篇文章,主要是用作记录;在AWS配置IAM RDS 角色权限访问,官方文档不怎么全,踩了一些坑…

AWS云上配置
  • 开启IAM身份验证

    • 登录AWS控制台
    • 搜索并进入Databases管理页面
    • 选择数据库实例,点击修改按钮
    • 在Database authentication部分,选择Password and IAM database authentication,启用IAM数据库身份验证
      在这里插入图片描述
  • 创建IAM Policy

    • 搜索策略,创建策略,选择JSON配置; Resource指向的是 db实例/数据库账号
    • 示例策略:
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Sid": "Statement1",
                  "Effect": "Allow",
                  "Action": [
                      "rds-db:connect"
                  ],
                  "Resource": [
                      "arn:aws-cn:rds-db:cn-northwest-1:xxxxxxxx:dbuser:cluster-xxxxxxxx/dbuser"
                  ]
              }
          ]
      }
      
      在这里插入图片描述
  • 创建IAM角色并附加策略

    • 创建一个角色,选择RDS,并附加上述策略
      在这里插入图片描述

    • 编辑新创建的权限,信任关系,指向session;即AWS那个字段,取值为个人账号arn

    • 示例信任关系:

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "arn:aws-cn:iam::xxxxx:user/个人acount",
                      "Service": [
                          "rds.amazonaws.com"
                      ]
                  },
                  "Action": "sts:AssumeRole"
              }
          ]
      }
      
AWS Config 配置
  • 新增role配置
    • 登录到宿主机,进入.aws目录
    • 查看configcredentials文件
    • credentials中配置IAM用户的accessIdaccessSecret; config与 credentials 通过 profile {name} 匹配
    • config中新增相关配置:
      [profile prodaccess]
          role_arn = arn:aws:iam::xxxxxxxx:role/ProductionAccessRole
          source_profile = default
      
    • 如果 default的credentials配置无role权限,请切换profile或者授权
Role授权
  • AWS上role信任实体配置
    • 跳板机执行命令:
      aws sts assume-role --role-arn "arn:aws-cn:iam::xxxxx:role/rolename" --role-session-name 主账号 --profile profile
      
      TIPS: 这里的rolename即是需要配置的role
使用IAM身份验证创建数据库账户
  • 创建数据库用户
    • 需要与策略中的用户保持一致,用户名为dbuser,可以换成自己的
    • 命令:
      CREATE USER 'dbuser' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
      
    • 如果要开启SSL:
      ALTER USER 'dbuser'@'%' REQUIRE SSL;
      
命令行连通性验证
  • 写入变量
    • 设置RDS主机名:
      export RDSHOST="rds-aurora-xxx.cluster-xxxx.rds.cn-northwest-1.amazonaws.com.cn"
      
    • 获取token:
      aws rds generate-db-auth-token --hostname $RDSHOST --port 3306 --region cn-northwest-1 --username dbuser --profile xxxx_profile
      
      xxxx_profile是自定义的profile名称,不加–profile 参数默认使用default
    • 将获取到的token写入变量:
      export TOKEN="...token..."
      
    • 引用变量进行连接:
      mysql --host=$RDSHOST --port=3306 --enable-cleartext-plugin --user=dbuser --password=$TOKEN
      
SpringBoot应用接入Datasource
  • 新增配置
    • application.properties中添加:
      aws.rds.host=rds-aurora-xxxxx.cluster-xxxxx.rds.cn-northwest-1.amazonaws.com.cn
      aws.rds.port=3306
      aws.rds.user=dbuser
      aws.rds.dbname=dbuser
      aws.region=cn-northwest-1
      
    • 添加AWS SDK依赖:
      <dependency>
          <groupId>software.amazon.awssdk</groupId>
          <artifactId>rds</artifactId>
          <version>2.20.0</version>
      </dependency>
      
    • 剔除SpringBoot数据源配置文件注入,重新注入DataSource
package com.xxl.job.admin.core.conf;

import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.rds.RdsUtilities;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

@Slf4j
@Configuration
public class DynamicDataSourceConfig {

    @Value("${aws.rds.host}") private String dbHost;
    @Value("${aws.rds.port}") private int dbPort;
    @Value("${aws.rds.user}") private String dbUser;
    @Value("${aws.rds.dbname}") private String dbName;
    @Value("${aws.region}") private String region;

    @Bean
    @Primary
    public DataSource dataSource() {
        log.info("[DynamicDataSourceConfig] create datasource start");
        String token = refreshIamToken();
        log.info("[DynamicDataSourceConfig] get token: {}", token);
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl(buildJdbcUrl());
        dataSource.setUsername(dbUser);
        dataSource.setPassword(token);

        //TODO 验证可用性,可删除
        validateDataSource(dataSource);

        // 每10分钟刷新令牌
        // 临时凭证,默认有效期为15分钟
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        scheduler.scheduleAtFixedRate(() -> 
            dataSource.setPassword(refreshIamToken()), 
            10, 10, TimeUnit.MINUTES
        );
        
        return dataSource;
    }

    private void validateDataSource(HikariDataSource dataSource) {
        try (Connection conn = dataSource.getConnection();
             Statement stmt = conn.createStatement()) {
            ResultSet rs = stmt.executeQuery("SELECT 1");
            log.info("Database connection test succeeded");
        } catch (SQLException e) {
            log.error("Database connection test FAILED", e);
            throw new RuntimeException("Datasource validation failed", e);
        }
    }

    private String refreshIamToken() {
        return generateAuthToken(
            dbHost, 
            dbPort, 
            dbUser, 
            Region.of(region)
        );
    }

    private String buildJdbcUrl() {
        return String.format("jdbc:mysql://%s:%d/%s?" +
                        "allowCleartextPasswords=true&useUnicode=true&characterEncoding=UTF-8"
                        + "&autoReconnect=true&serverTimezone=Asia/Shanghai"
                        + "&useSSL=false&requireSSL=false",
                dbHost, dbPort, dbName);
    }

    private String generateAuthToken(String dbHost, int dbPort, String dbUser, Region region) {
        //profile需做成环境变量
		//dev_mysql_auth_profile, 这里换成对应的profile名称,若没有自定义配置则设置为default
        AwsCredentialsProvider credentialsProvider =
                ProfileCredentialsProvider.create("dev_mysql_auth_profile");
        return RdsUtilities.builder()
                .credentialsProvider(credentialsProvider)
                .region(region)
                .build()
                .generateAuthenticationToken(b -> b
                        .hostname(dbHost)
                        .port(dbPort)
                        .username(dbUser)
                        .region(region)
                );
    }
}

  • 使用默认凭证链,自动获取Pod角色权限:AwsCredentialsProvider
K8s secret 挂载映射
  • 代码中使用:AwsCredentialsProvider
  • 使用默认凭证链,自动获取Pod角色权限:AwsCredentialsProvider
官方文档
  • 参考AWS官方文档以获取更多详细信息。
  • 通用文档:https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.Connecting.Java.html
  • 切换角色:https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_use_switch-role-cli.html
  • 信任授权:https://repost.aws/zh-Hans/knowledge-center/iam-assume-role-error

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2386937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Karakeep | 支持Docker/NAS 私有化部署!稍后阅读工具告别云端依赖,让知识收藏更有序

Karakeep 介绍 Karakeep&#xff08;以前的 Hoarder&#xff09;是一款开源的“Bookmark Everything”应用程序&#xff0c;一款基于 AI 驱动的开源书签管理工具&#xff0c;专为解决传统浏览器书签管理中的混乱问题而设计。其核心目标是通过智能化技术帮助用户高效整理、检索和…

RV1126+FFMPEG多路码流监控项目大体讲解

一.项目介绍&#xff1a; 本项目采用的是易百纳RV1126开发板和CMOS摄像头&#xff0c;使用的推流框架是FFMPEG开源项目。这个项目的工作流程如下(如上图)&#xff1a;通过采集摄像头的VI模块&#xff0c;再通过硬件编码VENC模块进行H264/H265的编码压缩&#xff0c;并把压缩后的…

el-dialog 组件 多层嵌套 被遮罩问题

<el-dialog title"提示" :visible.sync"dialogBindUserVisible" width"30%" append-to-body :before-close"handleClose"> <span>这是一段信息</span> <span slot"footer" class"dialog-footer&q…

探秘谷歌Gemini:开启人工智能新纪元

一、引言 在人工智能的浩瀚星空中&#xff0c;每一次重大模型的发布都宛如一颗璀璨新星闪耀登场&#xff0c;而谷歌 Gemini 的亮相&#xff0c;无疑是其中最为耀眼的时刻之一。它的出现&#xff0c;犹如在 AI 领域投下了一颗重磅炸弹&#xff0c;引发了全球范围内的广泛关注与热…

wordcount在集群上的测试

1.将louts.txt文件从cg计算机复制到master节点上面&#xff0c;存放在/usr/local/hadoop 需要输入密码&#xff1a;83953588abc scp /root/IdeaProjects/mapReduceTest/lotus.txt root172.18.0.2:/usr/local/hadoop /WordCountTest/input 2.将lotus.txt文件从master这台机器…

OpenCV CUDA模块图像过滤------创建一个 Sobel 滤波器函数createSobelFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于创建一个 Sobel 滤波器&#xff0c;用于在 GPU 上进行边缘检测。它基于图像的梯度计算&#xff1a; dx 表示对 x 方向求导的阶数&…

PDF 转 JPG 图片小工具:CodeBuddy 助力解决转换痛点

本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 前言 在数字化办公与内容创作的浪潮中&#xff0c;将 PDF 文件转换为 JPG 图片格式的需求日益频繁。无论是学术文献中的图表提取&#xff0c;还是宣传资料的视觉化呈现&am…

VisionPro 与 C# 联合编程:相机连接实战指南

在工业视觉检测与自动化领域&#xff0c;康耐视&#xff08;Cognex&#xff09;的 VisionPro 是一款功能强大的视觉开发工具&#xff0c;而 C# 凭借其简洁性与高效性&#xff0c;成为许多开发者的首选编程语言。本文将详细介绍如何通过 C# 与 VisionPro 联合编程实现相机连接&a…

论文阅读:Next-Generation Database Interfaces:A Survey of LLM-based Text-to-SQL

地址&#xff1a;Next-Generation Database Interfaces: A Survey of LLM-based Text-to-SQL 摘要 由于用户问题理解、数据库模式解析和 SQL 生成的复杂性&#xff0c;从用户自然语言问题生成准确 SQL&#xff08;Text-to-SQL&#xff09;仍是一项长期挑战。传统的 Text-to-SQ…

OS面试篇

用户态和内核态 用户态和内核态的区别&#xff1f; 内核态和用户态是操作系统中的两种运行模式。它们的主要区别在于权限和可执行的操作&#xff1a; 内核态&#xff08;Kernel Mode&#xff09;&#xff1a;在内核态下&#xff0c;CPU可以执行所有的指令和访问所有的硬件资…

FFMPEG-FLV-MUX编码

一、流程图 二、结构体 1 .AVOutputFormat 一、核心功能与作用 封装格式描述 AVOutputFormat保存了输出容器格式的元数据&#xff0c;包括&#xff1a; 短名称&#xff08;name&#xff09;&#xff1a;如flv、mp4&#xff1b;易读名称&#xff08;long_name&#xff09;&…

React vs Vue.js:选哪个框架更适合你的项目?

摘要 前端开发江湖里&#xff0c;React 和 Vue.js 堪称两大 “顶流” 框架&#xff0c;不少开发者在选择时都犯了难。用 React 吧&#xff0c;听说它性能超强&#xff0c;可学习曲线也陡峭&#xff1b;选 Vue.js&#xff0c;有人夸它上手快&#xff0c;但又担心功能不够强大。…

Kafka|基础入门

文章目录 快速了解Kafka快速上手Kafka理解Kafka的集群Kafka集群的消息流转模型 快速了解Kafka 快速上手Kafka 启动zookeeper 启动kafka 创建topic - 启动发送者 - 启动消费者 Partition 0: [msg1] -> [msg2] -> [msg3] -> ...0 1 2Partition 1: [msg4…

ADS学习笔记(五) 谐波平衡仿真

参考书籍:见资源绑定,书籍4.2 谐波平衡仿真 本文为对实验内容的补充 1. 三阶交调点坐标系图分析 我们来分析图1.5中“三阶交调点”坐标系图里的两条直线分别代表什么。 图中有两条向上倾斜的直线&#xff1a; 斜率较低的那条直线代表&#xff1a;基波输出功率 (Fundamental Out…

PETR- Position Embedding Transformation for Multi-View 3D Object Detection

旷视 ECCV 2022 纯视觉BEV方案transformer网络3D检测 paper&#xff1a;[2203.05625] PETR: Position Embedding Transformation for Multi-View 3D Object Detection code&#xff1a;GitHub - megvii-research/PETR: [ECCV2022] PETR: Position Embedding Transformation …

Prompt Tuning与自然语言微调对比解析

Prompt Tuning 与输入提示词自然语言微调的区别和联系 一、核心定义与区别 维度Prompt Tuning(提示微调)输入提示词自然语言微调本质优化连续向量空间中的提示嵌入(不可直接阅读)优化离散自然语言文本(人类可理解)操作对象模型输入嵌入层的连续向量(如WordEmbedding)自…

QT软件开发环境及简单图形的绘制-图形学(实验一)-[成信]

对于软件的安装这里就不多介绍了。 本文章主要是根据本校图形学的实验知道来做。 创建一个简单的计算机图形学程序 第一步&#xff1a;创建项目及配置 这里创建的项目名和类名尽量和我的一样&#xff0c;避免后面直接复制我的代码时会出现一些名字上面的错误。QtWidgetsAppl…

一文带你彻底理清C 语言核心知识 与 面试高频考点:从栈溢出到指针 全面解析 附带笔者手写2.4k行代码加注释

引言&#xff1a;C 语言的魅力与挑战 从操作系统内核到嵌入式系统&#xff0c;从高性能计算到网络编程&#xff0c;C 语言高效、灵活和贴近硬件的特性&#xff0c;始终占据着不可替代的地位。然而&#xff0c;C 语言的强大也伴随着较高的学习曲线&#xff0c;尤其是指针、内存管…

数据结构第5章 树与二叉树(竟成)

第 5 章 树与二叉树 【考纲内容】 1.树的基本概念 2.二叉树 &#xff08;1&#xff09;二叉树的定义及其主要特征 &#xff08;2&#xff09;二叉树的顺序存储结构和链式存储结构 &#xff08;3&#xff09;二叉树的遍历 &#xff08;4&#xff09;线索二叉树的基本概念和构造 …

# 深入解析BERT自然语言处理框架:原理、结构与应用

深入解析BERT自然语言处理框架&#xff1a;原理、结构与应用 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;框架的出现无疑是一个重要的里程碑。它凭借其强大的语言表示能…