使用 Cassandra Go 客户端驱动程序以编程方式访问 Amazon Keyspaces - Amazon Keyspaces(Apache Cassandra 兼容)
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Cassandra Go 客户端驱动程序以编程方式访问 Amazon Keyspaces

本部分介绍了如何使用 Go Cassandra 客户端驱动程序连接 Amazon Keyspaces。要为用户和应用程序提供凭证,以通过编程方式访问 Amazon Keyspaces 资源,您可以执行以下任一操作:

  • 创建与特定 Amazon Identity and Access Management (IAM) 用户关联的服务特定凭证。

  • 为了增强安全性,我们建议为所有 Amazon 服务中使用的 IAM 委托人创建 IAM 访问密钥。借助适用于 Cassandra 客户端驱动程序的 Amazon Keyspaces SigV4 身份验证插件,您可以使用 IAM 访问密钥而不是用户名和密码来验证对 Amazon Keyspaces 的调用。有关更多信息,请参阅 为 Amazon Keyspaces 创建和配置 Amazon 证书

开始前的准备工作

在开始之前,您需要完成以下任务。

Amazon Keyspaces 要求使用传输层安全性协议 (TLS) 来帮助保护与客户端的连接。要使用 TLS 连接到 Amazon Keyspaces,您需要下载 Amazon 数字证书,并将 Go 驱动程序配置为使用 TLS。

使用以下命令下载 Starfield 数字证书,并将 sf-class2-root.crt 保存在本地或您的主目录中。

curl https://certs.secureserver.net/repository/sf-class2-root.crt -O
注意

您还可以使用 Amazon 数字证书连接到 Amazon Keyspaces。如果您的客户端成功连接到 Amazon Keyspaces,您可以继续这样做。Starfield 证书为使用旧证书颁发机构的客户端提供了额外的向后兼容性。

curl https://certs.secureserver.net/repository/sf-class2-root.crt -O

使用适用于 Apache Cassandra 的 Gocql 驱动程序和服务特定凭证连接 Amazon Keyspaces

  1. 为您的应用程序创建一个目录。

    mkdir ./gocqlexample
  2. 导航到新目录。

    cd gocqlexample
  3. 为应用程序创建一个文件。

    touch cqlapp.go
  4. 下载 Go 驱动程序。

    go get github.com/gocql/gocql
  5. 将以下示例代码添加到 cqlapp.go 文件。

    package main import ( "fmt" "github.com/gocql/gocql" "log" ) func main() { // add the Amazon Keyspaces service endpoint cluster := gocql.NewCluster("cassandra.us-east-2.amazonaws.com") cluster.Port=9142 // add your service specific credentials cluster.Authenticator = gocql.PasswordAuthenticator{ Username: "ServiceUserName", Password: "ServicePassword"} // provide the path to the sf-class2-root.crt cluster.SslOpts = &gocql.SslOptions{ CaPath: "path_to_file/sf-class2-root.crt", EnableHostVerification: false, } // Override default Consistency to LocalQuorum cluster.Consistency = gocql.LocalQuorum cluster.DisableInitialHostLookup = false session, err := cluster.CreateSession() if err != nil { fmt.Println("err>", err) } defer session.Close() // run a sample query from the system keyspace var text string iter := session.Query("SELECT keyspace_name FROM system_schema.tables;").Iter() for iter.Scan(&text) { fmt.Println("keyspace_name:", text) } if err := iter.Close(); err != nil { log.Fatal(err) } session.Close() }

    使用说明:

    1. "path_to_file/sf-class2-root.crt" 替换为第一步中保存的证书的路径。

    2. 按照以下步骤操作,确保和与您在生成服务特定凭证时获得的用户名和密码ServicePassword相匹配。ServiceUserName 创建用于通过编程方式访问 Amazon Keyspaces 的服务特定凭证。

    3. 有关可用端点的列表,请参阅Amazon Keyspaces 的服务端点

  6. 构建程序。

    go build cqlapp.go
  7. 运行程序。

    ./cqlapp

使用适用于 Apache Cassandra 的 Go 驱动程序和 SigV4 身份验证插件连接 Amazon Keyspaces

以下代码示例展示了如何使用开源 Go 驱动程序的 SigV4 身份验证插件访问 Amazon Keyspaces(Apache Cassandra 兼容)。

请按照为 Amazon Keyspaces 创建和配置 Amazon 证书中的步骤为 IAM 主体创建凭证(如果您尚未创建)。如果应用程序在 Lambda 或 Amazon EC2 实例上运行,则您的应用程序将自动使用该实例的证书。要在本地运行本教程,可以将凭证存储为本地环境变量。

将 Go Sigv4 身份验证插件从存储库添加到您的应用程序中。GitHub该插件支持适用于 Cassandra 的开源 Go 驱动程序 1.2.x 版本,并且依赖于 Go 的 Amazon SDK。

$ go mod init $ go get github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin

在此代码示例中,Amazon Keyspaces 端点由 Cluster 类表示。它使用集群的身份验证器属性 AwsAuthenticator 来获取凭证。

package main import ( "fmt" "github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin/sigv4" "github.com/gocql/gocql" "log" ) func main() { // configuring the cluster options cluster := gocql.NewCluster("cassandra.us-west-2.amazonaws.com") cluster.Port=9142 // the authenticator uses the default credential chain to find Amazon credentials cluster.Authenticator = sigv4.NewAwsAuthenticator() cluster.SslOpts = &gocql.SslOptions{ CaPath: "path_to_file/sf-class2-root.crt", EnableHostVerification: false, } cluster.Consistency = gocql.LocalQuorum cluster.DisableInitialHostLookup = false session, err := cluster.CreateSession() if err != nil { fmt.Println("err>", err) return } defer session.Close() // doing the query var text string iter := session.Query("SELECT keyspace_name FROM system_schema.tables;").Iter() for iter.Scan(&text) { fmt.Println("keyspace_name:", text) } if err := iter.Close(); err != nil { log.Fatal(err) } }

使用说明:

  1. "path_to_file/sf-class2-root.crt" 替换为第一步中保存的证书的路径。

  2. 要使此示例在本地运行,您需要将以下变量定义为环境变量:

    • AWS_ACCESS_KEY_ID

    • AWS_SECRET_ACCESS_KEY

    • AWS_DEFAULT_REGION

  3. 要在代码之外存储访问密钥,请参阅存储用于通过编程方式进行访问的访问密钥中的最佳实践。

  4. 有关可用端点的列表,请参阅Amazon Keyspaces 的服务端点