
# 通过HTTPS方式连接GeminiDB兼容DynamoDB实例
在使用GeminiDB兼容DynamoDB接口进行数据操作时，为了保证数据传输的安全性，通常需要通过HTTPS方式连接。本文将详细介绍使用HTTPS方式连接GeminiDB兼容DynamoDB接口的基本操作，帮助用户顺利完成配置，确保数据的安全传输。
#### 使用须知
- 目标实例需要与弹性云服务器位于同一区域、同一VPC和同一子网内，以确保正常访问。
- 弹性云服务器必须处于目标实例所属安全组允许访问的范围内。 **场景一：** 如果目标实例所属安全组为**默认安全组**， 则无需设置安全组规则。
  **场景二：** 如果目标实例所属安全组**非默认安全组**，请查看安全组规则是否允许该弹性云服务器访问。
  - 如果安全组规则允许弹性云服务器访问，即可连接实例。
  
  - 如果安全组规则不允许弹性云服务器访问，需要在实例安全组添加一条"入"的访问规则。 设置安全组的具体操作请参考[8.4.4.5.1 给GeminiDB兼容DynamoDB接口实例设置安全组规则](https://support.huaweicloud.com/dynamodbug-nosql/nosql_dynamodb_0049.html)。
    
   
- 实例必须开启SSL的功能，详情参见[开启SSL](https://support.huaweicloud.com/dynamodbug-nosql/nosql_dynamodb_0054.html)，并[下载证书](https://support.huaweicloud.com/dynamodbug-nosql/nosql_dynamodb_0055.html)。以Java应用为例，导入证书命令为：
  ```
  keytool -importcert -alias hw -file ca.cert -keystore <cacerts_path> -storepass password
  ```
  其中，*cacerts_path*建议指定为JDK默认的信任库文件路径，例如/\~/jdk/jdk1.8.0_242/jre/lib/security/cacerts。
  
 
![](https://support.huaweicloud.com/dynamodbug-nosql/public_sys-resources/note_3.0-zh-cn.png)
1. 出于兼容性考虑，开启SSL后HTTP访问仍保持开放，数据可能通过明文传输。为满足高安全合规要求，建议关闭HTTP，仅保留HTTPS通道。详情您可以在管理控制台右上角，选择"[工单 \> 新建工单](https://console.huaweicloud.com/ticket/#/ticketindex/createIndex)"联系客服进行咨询。
2. HTTPS暂不支持弹性公网IP访问。
#### 前提条件
- 已成功创建GeminiDB兼容DynamoDB接口实例。
- 已创建弹性云服务器，创建弹性云服务器的方法，请参见《弹性云服务器》中"[创建弹性云服务器](https://support.huaweicloud.com/usermanual-ecs/ecs_03_7002.html)"章节。
- 弹性云服务器上已安装JDK或Python开发环境。
 
#### 操作步骤
GeminiDB完全兼容DynamoDB接口。本章节仅给出部分代码示例。
1. 添加 Maven 依赖。在 pom.xml 中添加 AWS SDK for Java 2.x 相关的依赖。 
   ```
   <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>dynamodb</artifactId>
            <version>2.x.x</version>
        </dependency>
    </dependencies>
   ```
   
   
2. 通过DynamoDbClient使用HTTPS连接GeminiDB兼容DynamoDB接口。 
   **Java示例：**
   ```
   import com.amazonaws.auth.AWSCredentialsProvider;
   import com.amazonaws.auth.AWSStaticCredentialsProvider;
   import com.amazonaws.auth.BasicAWSCredentials;
   import com.amazonaws.client.builder.AwsClientBuilder;
   import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
   import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
   import com.amazonaws.services.dynamodbv2.model.*;
   public class HttpsDemo {
       public static AWSCredentialsProvider myCredentials = new AWSStaticCredentialsProvider(
               new BasicAWSCredentials("your_ak", "your_sk"));
       public static void main(String[] args) {
           AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
                   .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("https://your_elb_ip", "cn-north-1"))
                   .withCredentials(myCredentials)
                   .build();
           System.out.println(client.listTables());
           CreateTableRequest request = new CreateTableRequest()
                   .withTableName("test_001")
                   .withProvisionedThroughput(new ProvisionedThroughput(1000L, 1000L))
                   .withKeySchema(
                           new KeySchemaElement("id", KeyType.HASH)
                   )
                   .withAttributeDefinitions(
                           new AttributeDefinition("id", ScalarAttributeType.N)
                   );
           System.out.println(client.createTable(request));
       }
   }
   ```
   **Python示例：**
   ```
   import boto3
   ENDPOINT_URL = 'https://your_elb_ip'
   CA_BUNDLE_PATH = 'ca.crt'
   dynamodb = boto3.client(
   'dynamodb',
   aws_access_key_id = 'your_ak',
   aws_secret_access_key = 'your_sk',
   endpoint_url = ENDPOINT_URL,
   region_name = 'cn-north-1',
   verify = CA_BUNDLE_PATH
   )
   try:
       response = dynamodb.list_tables()
       print(response.get('TableNames'))
   except Exception as e:
       print(e)
   ```
   
   
 
