因為今年 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]:
- Java system properties - aws.accessKeyId 和 aws.secretKey
- Environment variables - AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY
- 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 錯。
沒有留言:
張貼留言