使用 IAM 身份验证和 适用于 Go 的 AWS 开发工具包 连接到数据库实例 - Amazon Relational Database Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 IAM 身份验证和 适用于 Go 的 AWS 开发工具包 连接到数据库实例

您可以使用 适用于 Go 的 AWS 开发工具包 连接到 RDS for MySQL 或 RDS for PostgreSQL 数据库实例,如下所述。

以下是使用 IAM 身份验证连接到数据库实例的先决条件:

要运行上述代码示例,您需要使用 AWS 网站上提供的 适用于 Go 的 AWS 开发工具包

根据需要修改以下变量的值:

  • dbName – 要访问的数据库

  • dbUser – 要访问的数据库账户

  • dbHost – 要访问的数据库实例的终端节点

  • dbPort – 用于连接到数据库实例的端口号

  • region – 在其中运行数据库实例的 AWS 区域

此外,请确保示例代码中的导入库存在于您的系统中。

重要

本节中的示例使用以下代码提供从本地环境访问数据库的凭证:

creds := credentials.NewEnvCredentials()

如果要从 AWS 服务(如 Amazon EC2 或 Amazon ECS)访问数据库,则可以用以下代码替换:

sess := session.Must(session.NewSession())

creds := sess.Config.Credentials

如果您进行此更改,请确保添加以下导入:

"github.com/aws/aws-sdk-go/aws/session"

使用 IAM 身份验证和 适用于 Go 的 AWS 开发工具包 V2 进行连接

您可以使用 IAM 身份验证和 适用于 Go 的 AWS 开发工具包 V2 连接到数据库实例

生成 IAM 身份验证令牌

身份验证包提供了生成身份验证令牌(用于连接到 RDS MySQL 和 PostgreSQL 数据库实例)的实用程序。使用 BuildAuthToken 方法,您可以通过提供数据库终端节点、AWS 区域、用户名和一个 AWS.credentialProvider 植入来生成数据库身份验证令牌,它会返回 IAM 凭证并具有使用 IAM 数据库身份验证连接到数据库的权限。

以下示例演示了如何使用 BuildAuthToken 创建用于连接到 MySQL 数据库实例的身份验证令牌。

package main import "context" import "github.com/aws/aws-sdk-go-v2/config" import "github.com/aws/aws-sdk-go-v2/feature/rds/auth" func main() { cfg, err := config.LoadDefaultConfig(context.TODO()) if err != nil { panic("configuration error: " + err.Error()) } authenticationToken, err := auth.BuildAuthToken( context.TODO(), "mydb.123456789012.us-east-1.rds.amazonaws.com:3306", // Database Endpoint (With Port) "us-east-1", // AWS Region "jane_doe", // Database Account cfg.Credentials, ) if err != nil { panic("failed to create authentication token: " + err.Error()) } }

以下示例演示了如何使用 BuildAuthToken 创建用于连接到 PostgreSQL 数据库实例的身份验证令牌。

package main import "context" import "github.com/aws/aws-sdk-go-v2/config" import "github.com/aws/aws-sdk-go-v2/feature/rds/auth" func main() { cfg, err := config.LoadDefaultConfig(context.TODO()) if err != nil { panic("configuration error: " + err.Error()) } authenticationToken, err := auth.BuildAuthToken( context.TODO(), "mydb.123456789012.us-east-1.rds.amazonaws.com:5432", // Database Endpoint (With Port) "us-east-1", // AWS Region "jane_doe", // Database Account cfg.Credentials, ) if err != nil { panic("failed to create authentication token: " + err.Error()) } }

连接到数据库实例

以下代码示例演示如何生成一个身份验证令牌,然后使用该令牌连接到数据库实例

此代码连接到 MySQL 数据库实例。

package main import "context" import "github.com/aws/aws-sdk-go-v2/config" import "github.com/aws/aws-sdk-go-v2/feature/rds/auth" func main() { cfg, err := config.LoadDefaultConfig(context.TODO()) if err != nil { panic("configuration error: " + err.Error()) } authenticationToken, err := auth.BuildAuthToken( context.TODO(), "mydb.123456789012.us-east-1.rds.amazonaws.com:3306", // Database Endpoint (With Port) "us-east-1", // AWS Region "jane_doe", // Database Account cfg.Credentials, ) if err != nil { panic("failed to create authentication token: " + err.Error()) } dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?tls=true&allowCleartextPasswords=true", dbUser, authToken, dbEndpoint, dbName, ) db, err := sql.Open("mysql", dsn) if err != nil { panic(err) } err = db.Ping() if err != nil { panic(err) } }

此代码连接到 PostgreSQL 数据库实例。

package main import "context" import "github.com/aws/aws-sdk-go-v2/config" import "github.com/aws/aws-sdk-go-v2/feature/rds/auth" func main() { cfg, err := config.LoadDefaultConfig(context.TODO()) if err != nil { panic("configuration error: " + err.Error()) } authenticationToken, err := auth.BuildAuthToken( context.TODO(), "mydb.123456789012.us-east-1.rds.amazonaws.com:5432", // Database Endpoint (With Port) "us-east-1", // AWS Region "jane_doe", // Database Account cfg.Credentials, ) if err != nil { panic("failed to create authentication token: " + err.Error()) } dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s", dbHost, dbPort, dbUser, authToken, dbName, ) db, err := sql.Open("postgres", dsn) if err != nil { panic(err) } err = db.Ping() if err != nil { panic(err) } }

使用 IAM 身份验证和 适用于 Go 的 AWS 开发工具包 V1 进行连接。

您可以使用 IAM 身份验证和 适用于 Go 的 AWS 开发工具包 V1 连接到数据库实例

生成 IAM 身份验证令牌

您可以使用 rdsutils 软件包,生成用于连接到数据库 实例的令牌。调用 BuildAuthToken 函数以生成令牌。提供数据库实例终端节点、AWS 区域、用户名和 IAM 凭证,以生成用于连接到具有 IAM 凭证的数据库实例的令牌。

以下示例演示了如何使用 BuildAuthToken 创建用于连接到 MySQL 数据库实例的身份验证令牌。

package main import ( "database/sql" "fmt" "log" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/service/rds/rdsutils" ) func main() { dbName := "app" dbUser := "jane_doe" dbHost := "mydb.123456789012.us-east-1.rds.amazonaws.com" dbPort := 3306 dbEndpoint := fmt.Sprintf("%s:%d", dbHost, dbPort) region := "us-east-1" creds := credentials.NewEnvCredentials() authToken, err := rdsutils.BuildAuthToken(dbEndpoint, region, dbUser, creds) if err != nil { log.Fatalf("failed to build auth token %v", err) } }

以下示例演示了如何使用 BuildAuthToken 创建用于连接到 PostgreSQL 数据库实例的身份验证令牌。

package main import ( "database/sql" "fmt" "log" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/service/rds/rdsutils" ) func main() { dbName := "app" dbUser := "jane_doe" dbHost := "mydb.123456789012.us-east-1.rds.amazonaws.com" dbPort := 5432 dbEndpoint := fmt.Sprintf("%s:%d", dbHost, dbPort) region := "us-east-1" creds := credentials.NewEnvCredentials() authToken, err := rdsutils.BuildAuthToken(dbEndpoint, region, dbUser, creds) if err != nil { log.Fatalf("failed to build auth token %v", err) } }

连接到数据库实例

以下代码示例演示如何生成一个身份验证令牌,然后使用该令牌连接到数据库实例

此代码连接到 MySQL 数据库实例。

package main import ( "database/sql" "fmt" "log" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/service/rds/rdsutils" _ "github.com/go-sql-driver/mysql" ) func main() { dbName := "app" dbUser := "jane_doe" dbHost := "mydb.123456789012.us-east-1.rds.amazonaws.com" dbPort := 3306 dbEndpoint := fmt.Sprintf("%s:%d", dbHost, dbPort) region := "us-east-1" creds := credentials.NewEnvCredentials() authToken, err := rdsutils.BuildAuthToken(dbEndpoint, region, dbUser, creds) if err != nil { panic(err) } dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?tls=true&allowCleartextPasswords=true", dbUser, authToken, dbEndpoint, dbName, ) db, err := sql.Open("mysql", dsn) if err != nil { panic(err) } err = db.Ping() if err != nil { panic(err) } }

此代码连接到 PostgreSQL 数据库实例。

package main import ( "database/sql" "fmt" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/service/rds/rdsutils" _ "github.com/lib/pq" ) func main() { dbName := "app" dbUser := "jane_doe" dbHost := "mydb.123456789012.us-east-1.rds.amazonaws.com" dbPort := 5432 dbEndpoint := fmt.Sprintf("%s:%d", dbHost, dbPort) region := "us-east-1" creds := credentials.NewEnvCredentials() authToken, err := rdsutils.BuildAuthToken(dbEndpoint, region, dbUser, creds) if err != nil { panic(err) } dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s", dbHost, dbPort, dbUser, authToken, dbName, ) db, err := sql.Open("postgres", dsn) if err != nil { panic(err) } err = db.Ping() if err != nil { panic(err) } }