2017年12月13日 星期三

AWS DynamoDB SDK v2 基礎使用(二):基礎開發環境建置

因為今年 AWS 推出了第二版的 AWS SDK [1],所以就來紀錄 AWS SDK v2 吧。

在用過第一版的 SDK 以後,其實覺得第二版的 SDK 寫得比較易用,而且還支援 Java Stream API。
不過實務上 AWS SDK v2 的文件 [2-3] 目前相當地不完整,而且網路上也沒太多資料
所以有很多情況是必須依靠第一版的經驗、Javadoc 跟 IDE 的提示來猜測使用方法…。

Maven 設定

在一般狀況下,Maven 需要以下的設定來使用 DynamoDB。

PS. 目前看到 Maven 上比較新的版本是 2.0.0-preview-6,所以這裡先用這個版本作為例子。

<properties>
	<aws.version>2.0.0-preview-6</aws.version>
</properties>

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>software.amazon.awssdk</groupId>
			<artifactId>bom</artifactId>
			<version>${aws.version}</version>
			<type>pom</type>
		</dependency>
	</dependencies>
</dependencyManagement>

<dependencies>
	<dependency>
		<groupId>software.amazon.awssdk</groupId>
		<artifactId>dynamodb</artifactId>
		<version>${aws.version}</version>
	</dependency>
</dependencies>
Credential 設定

在開始使用 DynamoDB 以前,需要讓程式取得足夠的權限,因此需要讓 AWS SDK 存取 Credential。
AWS SDK 預設有幾種存取 Credential 的方法 [4]:

  1. Java system properties - aws.accessKeyId 和 aws.secretKey
  2. Environment variables - AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY
  3. The default credential profiles file - 位於 ~/.aws/credentials 的檔案

扣除上述這幾種預設的讀取方式,雖然也有自己從程式指定 credential,但實務上並不太建議這麼做
因為在程式裡寫 credential,時常發生不小心把 credential 一起 commit 到版本控制系統的狀況
如果使用的版本控制系統本身就是公開的,那就會把 credential 一起公開給全世界共享了….。

以我自己目前的習慣的話,在單機測試時,我會使用 credential profiles file;
而跑在 AWS 上的程式(不管是 EC2、Beanstalk 或者 Lambda 等等),我會用環境變數。

credential profile 來說,在 Windows 上的路徑是 C:\Users\<USER_NAME>\.aws\credentials
內容如下:

[default]
aws_access_key_id=XXXXXXXXXX
aws_secret_access_key=OOOOOOOOOOOOOOOOO

而對於跑在 AWS 上的程式,就不做任何設定,而是指派 Role 給那個資源,讓 AWS SDK 自動從 Role 上取得 Credential。

與 DynamoDB 建立連線

如果不需要任何特殊的設定的話,使用以下的程式碼,就可以建立一個能夠存取 DynamoDB 的連線。

DynamoDBClient client = DynamoDBClient.builder().build();

不過當然,AWS SDK 一向都是設計成 on-demand 的模式,也就是 Client 建立時,還沒有真正地跟服務連線
會一直等到真的有 request 發出去時,才會開始建立連線。
因此實務上會發現建立 Client 的速度很快,但發出第一個 request 時反而有點慢的狀況。

另外需要稍微注意一點的地方是,AWS SDK v2 使用的 package 都是 software.amazon.awssdk
如果開發環境裡同時存在 v1 和 v2 的話,不會產生衝突,但要相當小心不要用錯 XD
因為有很多 Class 名字都完全一樣,依靠 IDE 自動提示的話,很有可能會 import 錯。

參考資料
  1. AWS SDK for Java 2.0 – Developer Preview
  2. AWS SDK for Java 2.0 Developer Guide
  3. AWS SDK for Java API Reference
  4. Working with AWS Credentials

沒有留言: