

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Cassandra Go 用戶端驅動程式以程式設計方式存取 Amazon Keyspaces
<a name="using_go_driver"></a>

本節說明如何使用 Go Cassandra 用戶端驅動程式連線至 Amazon Keyspaces。若要為使用者和應用程式提供以程式設計方式存取 Amazon Keyspaces 資源的登入資料，您可以執行下列其中一項操作：
+ 建立與特定 AWS Identity and Access Management (IAM) 使用者相關聯的服務特定登入資料。
+ 為了增強安全性，我們建議為所有 AWS 服務中使用的 IAM 主體建立 IAM 存取金鑰。Cassandra 用戶端驅動程式的 Amazon Keyspaces SigV4 身分驗證外掛程式可讓您使用 IAM 存取金鑰來驗證對 Amazon Keyspaces 的呼叫，而不是使用者名稱和密碼。如需詳細資訊，請參閱[建立和設定 Amazon Keyspaces 的 AWS 登入資料](access.credentials.md)。

**Topics**
+ [開始之前](#using_go_driver.BeforeYouBegin)
+ [使用適用於 Apache Cassandra 的 Gocql 驅動程式和服務特定憑證連線至 Amazon Keyspaces](#go_ssc)
+ [使用適用於 Apache Cassandra 的 Go 驅動程式和 SigV4 身分驗證外掛程式連線至 Amazon Keyspaces](#go_SigV4)

## 開始之前
<a name="using_go_driver.BeforeYouBegin"></a>

您需要先完成下列任務，才能開始。

Amazon Keyspaces 需要使用 Transport Layer Security (TLS) 來協助保護與用戶端的連線。若要使用 TLS 連線至 Amazon Keyspaces，您需要下載 Amazon 數位憑證，並將 Go 驅動程式設定為使用 TLS。

 下載下列數位憑證，並將檔案儲存在本機或主目錄中。

1. AmazonRootCA1

1. AmazonRootCA2

1. AmazonRootCA3

1. AmazonRootCA4

1. Starfield Class 2 根目錄 （選用 – 用於回溯相容性）

若要下載憑證，您可以使用下列命令。

```
curl -O https://www.amazontrust.com/repository/AmazonRootCA1.pem
curl -O https://www.amazontrust.com/repository/AmazonRootCA2.pem
curl -O https://www.amazontrust.com/repository/AmazonRootCA3.pem
curl -O https://www.amazontrust.com/repository/AmazonRootCA4.pem
curl -O https://certs.secureserver.net/repository/sf-class2-root.crt
```

**注意**  
Amazon Keyspaces 先前使用錨定至 Starfield 類別 2 CA 的 TLS 憑證。 AWS 正在將所有 遷移 AWS 區域 至根據 Amazon Trust Services (Amazon 根 CAs 發行的憑證。在此轉換期間，請將用戶端設定為信任 Amazon 根 CAs1–4 和 Starfield 根，以確保所有區域的相容性。

使用範例中的名稱 *keyspaces-bundle.pem*，將所有下載的憑證合併成單一`pem`檔案。您可以執行下列 命令，即可進行新增：請記下 檔案的路徑，您稍後會需要此項目。

```
cat AmazonRootCA1.pem \
 AmazonRootCA2.pem \
 AmazonRootCA3.pem \
 AmazonRootCA4.pem \
 sf-class2-root.crt \
 > keyspaces-bundle.pem
```

## 使用適用於 Apache Cassandra 的 Gocql 驅動程式和服務特定憑證連線至 Amazon Keyspaces
<a name="go_ssc"></a>

1. 為您的應用程式建立目錄。

   ```
   mkdir ./gocqlexample
   ```

1. 導覽至新目錄。

   ```
   cd gocqlexample
   ```

1. 為您的應用程式建立 檔案。

   ```
   touch cqlapp.go
   ```

1. 下載 Go 驅動程式。

   ```
   go get github.com/gocql/gocql
   ```

1. 將下列範例程式碼新增至 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 keyspaces-bundle.pem
       cluster.SslOpts = &gocql.SslOptions{
               CaPath: "path_to_file/keyspaces-bundle.pem",
               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/keyspaces-bundle.pem"` 以第一個步驟中儲存的合併憑證檔案路徑取代 。

   1. 依照 的步驟，確保 *ServiceUserName* 和 *ServicePassword* 與您產生服務特定登入資料時取得的使用者名稱和密碼相符[建立服務特定的登入資料，以程式設計方式存取 Amazon Keyspaces](programmatic.credentials.ssc.md)。

   1. 如需可用端點的清單，請參閱 [Amazon Keyspaces 的服務端點](programmatic.endpoints.md)。

1. 建置 程式。

   ```
   go build cqlapp.go
   ```

1. 執行程式。

   ```
   ./cqlapp
   ```

## 使用適用於 Apache Cassandra 的 Go 驅動程式和 SigV4 身分驗證外掛程式連線至 Amazon Keyspaces
<a name="go_SigV4"></a>

下列程式碼範例示範如何使用開放原始碼 Go 驅動程式的 SigV4 身分驗證外掛程式來存取 Amazon Keyspaces （適用於 Apache Cassandra)。

如果您尚未這麼做，請依照 中的步驟建立 IAM 主體的登入資料[建立和設定 Amazon Keyspaces 的 AWS 登入資料](access.credentials.md)。如果應用程式在 Lambda 或 Amazon EC2 執行個體上執行，您的應用程式會自動使用執行個體的登入資料。若要在本機執行本教學課程，您可以將登入資料儲存為本機環境變數。

從 [GitHub 儲存庫](https://github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin)將 Go SigV4 身分驗證外掛程式新增至您的應用程式。外掛程式支援適用於 Cassandra 的開放原始碼 Go 驅動程式 1.2.x 版，並取決於適用於 Go 的 AWS 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 AWS credentials
    cluster.Authenticator = sigv4.NewAwsAuthenticator()

    cluster.SslOpts = &gocql.SslOptions{

            CaPath: "path_to_file/keyspaces-bundle.pem",
            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/keyspaces-bundle.pem"` 將 取代為第一個步驟中儲存的憑證檔案路徑。

1. 若要在本機執行此範例，您需要將下列變數定義為環境變數：
   + `AWS_ACCESS_KEY_ID`
   + `AWS_SECRET_ACCESS_KEY`
   + `AWS_DEFAULT_REGION`

1. 若要將存取金鑰存放在程式碼之外，請參閱 的最佳實務[存放用於程式設計存取的存取金鑰](aws.credentials.manage.md)。

1. 如需可用端點的清單，請參閱 [Amazon Keyspaces 的服務端點](programmatic.endpoints.md)。