当前位置: 首页 > article >正文

IAM角色访问AWS RDS For MySQL

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/ProductionAccessRolesource_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@Primarypublic 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名称,若没有自定义配置则设置为defaultAwsCredentialsProvider 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

相关文章:

IAM角色访问AWS RDS For MySQL

IAM角色访问AWS RDS For MySQL Tips: 写这篇文章&#xff0c;主要是用作记录&#xff1b;在AWS配置IAM RDS 角色权限访问&#xff0c;官方文档不怎么全&#xff0c;踩了一些坑… AWS云上配置 开启IAM身份验证 登录AWS控制台搜索并进入Databases管理页面选择数据库实例&#x…...

android property 系统

1.使用目的 目的都是为了测试。 减少编译流程。提高测试效率 2.使用方法流程 2.1 初始化默认值 方法一. 配置文件进行配置。 方法二. 手动初始化 setprop test.prop.id 12.2 获取键值并 property_get2.3 配置头文件 <cutils/properties.h>3.注意事项 3.1 关于无法…...

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;引发了全球范围内的广泛关注与热…...

TCP建立连接为什么不是两次握手,而是三次,为什么不能在第二次握手时就建立连接?

一.无法确认客户端的接收能力 三次握手的核心目的是为了确认客户端和服务端双方的发送和接收能力&#xff1a; 确保双方都能成功发送和接收数据。 如果C端发送数据到S端&#xff0c;S端收到数据&#xff0c;则可以确认S端具备正常的接收能力&#xff1b;如果C端发送出去的请求被…...

《Stable Diffusion 3.0企业级落地指南》——技术赋能与商业价值的深度融合实践

Stable Diffusion 3.0&#xff08;SD3&#xff09;作为当前多模态生成式AI技术的集大成者&#xff0c;凭借其创新的扩散Transformer架构&#xff08;DiT&#xff09;、流匹配&#xff08;Flow Matching&#xff09;技术以及超分辨率生成能力&#xff0c;正在重塑企业内容生产的…...

【软考向】Chapter 3 数据结构

线性结构线性表顺序存储 —— 访问易,增删难链式存储 —— 访问难、增删易栈 —— 后进先出 和 队列 —— 先进先出字符串 —— KMP 匹配算法数组、矩阵和广义表数组树 —— 树根为第一层,最大层数为树高/深度,度线索二叉树哈夫曼编码树和森林 —— 树的双亲表示和孩子表示图…...

[原创](计算机数学)(The Probability Lifesaver)(P14): 推导计算 In(1-u) 约等于 -u

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...

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 方向求导的阶数&…...

[面试精选] 0053. 最大子数组和

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一…...

怎么判断一个Android APP使用了Cordova这个跨端框架

要判断一个 Android 应用是否使用了 Cordova 框架&#xff0c;可以通过以下方法逐步验证&#xff1a; 一、安装包结构分析 1. 解压 APK 将 .apk 文件重命名为 .zip 并解压&#xff0c;检查以下特征文件&#xff1a; • assets/www/ 目录&#xff1a; Cordova 的核心 Web 资源&…...

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…...

鸿蒙OSUniApp 实现动态的 tab 切换效果#三方框架 #Uniapp

使用 UniApp 实现动态的 tab 切换效果 在移动应用开发中&#xff0c;tab 切换&#xff08;标签页&#xff09;是提升界面组织性和用户体验的常用交互方式。无论是资讯、商城、社区还是管理后台&#xff0c;tab 组件都能帮助用户高效切换不同内容区域。随着 HarmonyOS&#xff…...

Docker系列(三):深度剖析Dockerfile与图形化容器实战 --- 3种容器构建方法对比与性能调优

引言 在云原生技术驱动软件交付革新的当下&#xff0c;Dockerfile 作为容器化技术的核心载体&#xff0c;通过声明式语法将应用环境固化为可复现、可版本化的“蓝图”&#xff0c;彻底终结了“开发-生产”环境割裂的顽疾。本文以 Ubuntu 24.04 LTS 为实践基础&#xff0c;深度…...

论文阅读: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;&…...

青少年编程与数学 02-020 C#程序设计基础 05课题、数据类型

青少年编程与数学 02-020 C#程序设计基础 05课题、数据类型 一、数据类型及其意义1. 数据类型的概念1.1 值类型&#xff08;Value Types&#xff09;1.2 引用类型&#xff08;Reference Types&#xff09; 2. 数据类型的重要性2.1 类型安全示例 2.2 内存管理示例 2.3 性能优化示…...

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…...

MySQL存储引擎对比及选择指南

MySQL 存储引擎是数据库底层管理数据存储和操作的核心组件&#xff0c;不同存储引擎在事务支持、性能、锁机制、存储方式等方面存在显著差异。以下是常见存储引擎的对比及其适用场景&#xff1a; 1. InnoDB 事务支持&#xff1a;支持 ACID 事务&#xff08;COMMIT/ROLLBACK&am…...

【IDEA问题】springboot本地启动应用报错:程序包不存在;找不到符号

问题&#xff1a; springboot本地启动应用报错&#xff1a; 程序包xxx不存在&#xff1b;找不到符号 解决方案&#xff1a; 1.确保用maven重新导入依赖 2.删除.idea文件夹 3.invalidate caches里&#xff0c;把能选择的都勾选上&#xff0c;然后清除缓存重启 4.再在上方工具栏…...

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)自…...

二十七、面向对象底层逻辑-SpringMVC九大组件之HandlerAdapter接口设计

在 Spring MVC 框架中&#xff0c;HandlerAdapter 是一个看似低调却极为关键的组件。它的存在&#xff0c;不仅解决了不同类型处理器&#xff08;Handler&#xff09;的调用难题&#xff0c;更体现了框架设计中对解耦、扩展性和模块化的深刻思考。本文将从接口设计的角度&#…...