使用自定義 ANT 任務上傳到 Amazon S3

工程 | Ben Hale | 2007年4月25日 | ...

可靠的 CI 結構的一個有趣的副作用是,當事情執行可靠時,新的問題開始出現。在 Spring 的 CI 系統開始平穩執行後不久,我們在static.springframework.org上的偶爾出現的空間和頻寬問題變得更加明顯。 Colin Sampaleanu 之前曾研究過如何緩解其中的一些問題,並決定使用 Amazon S3

Amazon S3 是 Amazon Web Services 的一部分,提供極其便宜的線上檔案儲存服務。“極其便宜”是什麼意思?嗯,從網站上看,1 GB*月的儲存成本為 0.15 美元,1 GB 的頻寬成本為 0.20 美元。再加上高頻寬透明映象服務,S3 對於儲存我們的每日快照非常有吸引力。順便說一句,亞馬遜實際上在內部使用完全相同的基礎設施,所以你知道有一個管理團隊保證他們 5 個 9 的承諾。

為了使用 S3 儲存我們的每日快照,我們首先必須替換使用 scp 的舊快照上傳程式。我四處尋找,沒有看到任何上傳到 S3 的 ANT 任務,所以我開始建立自己的任務。我的目標配置非常簡單


<aws:s3 accessKey="${s3.accessKey}" secretKey="${s3.secretKey}">
	<upload bucketName="static.springframework.org"
		file="${target.release.dir}/${release-with-dependencies.zip}"
		toFile="SPR/spring-framework-${spring-version}-with-dependencies-${tstamp}-${build.number}.zip"
		publicRead="true"/>
	<upload bucketName="static.springframework.org"
		file="${target.release.dir}/${release.zip}"
		toFile="SPR/spring-framework-${spring-version}-${tstamp}-${build.number}.zip"
		publicRead="true"/>
</aws:s3>

我希望能夠定義一個由我們的訪問金鑰和金鑰(S3 的加密登入)控制的單個 S3 會話,並在該定義中執行多個上傳。每次上傳都進入一個“儲存桶”,這是 S3 提供的唯一粒度級別。

S3 本身通常用作 RESTful 服務,因此很容易與之互動。為此,我使用了一個名為 jets3t(發音為 jet-set)的庫。對於任何使用 Java 使用 S3 的人來說,這是使用 S3 的首選方式(據我所知,這是 Amazon 認可的唯一庫)。Jets3t 使用與我的 XML 定義類似的範例(或者我使用了他們的範例?),即您建立一個對伺服器的引用,並重復使用該引用來執行多個操作。在 ANT 任務中,我根據訪問金鑰和金鑰建立一組憑據,並將它們繫結到對服務的引用


AWSCredentials credentials = new AWSCredentials(accessKey, secretKey);
S3Service service = new RestS3Service(credentials);

for (Upload upload : uploads) {
	upload.upload(service);
}

正如你所見,我已經模組化了上傳操作,以便將來如果我需要擴充套件 s3 任務來做其他事情(下載、設定許可權等),我可以這樣做。Upload 物件負責完成繁重的工作。它根據 bucketName 建立對儲存桶的引用,根據 toFile 值建立對新物件的引用,然後透過 HTTP 上傳檔案的內容。


private S3Bucket getBucket() {
	return new S3Bucket(bucketName);
}

private S3Object getObject() {
	S3Object object = new S3Object(toFile);
	if (publicRead) {
		object.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
	}
	object.setDataInputFile(file);
	object.setContentLength(file.length());
	return object;
}

S3Bucket bucket = getBucket();
S3Object object = getObject();
service.putObject(bucket, object);

在這個任務的實際程式碼中,我添加了一些漂亮的輸出,這樣你就可以看到檔案上傳的速度以及上傳速度是多少

upload-s3:
   [aws:s3] Uploading /opt/j2ee/domains/springframework.org/build/bamboo-home/xml-data/build-dir/
                SPR-NIGHTLY/spring/target/release/spring-framework-2.0.5-with-dependencies.zip (65132641B)
                to bucket static.springframework.org
   [aws:s3] Transfer Time: 34.0s - Transfer Rate: 1915665.9B/​s
   [aws:s3] Uploading /opt/j2ee/domains/springframework.org/build/bamboo-home/xml-data/build-dir/
                SPR-NIGHTLY/spring/target/release/spring-framework-2.0.5.zip (10752085B)
                to bucket static.springframework.org
   [aws:s3] Transfer Time: 6.0s - Transfer Rate: 1792014.1B/​s

這項工作對我們來說非常成功,以至於我們已經將其擴充套件到 Spring 產品組合中的所有基於 ANT 的構建。 Spring Framework、Spring LDAP、Spring Web Flow 和 Spring Modules 現在都上傳到這個 S3 每日快照儲存庫,而我待辦事項清單上的一件事也是為 Maven 專案提供一些關愛。這樣做的好處是,我們已經釋放了超過 30GB 的空間,並大大減少了頻寬使用量,而過去兩個月的所有這些費用約為 4.00 美元。

由於我必須編寫一些程式碼才能使所有這些工作,我將其放入我們的原始碼控制區域。我還繼續將其放在我們的內部私有 Maven 儲存庫中,該儲存庫映象到公共 Maven 儲存庫。如果您有興趣檢視程式碼,請檢視 SVN 儲存庫。如果您想使用 ANT 任務,您可以從 Maven 獲取它,其 groupIdorg.springframework.awsartifactIdspring-aws-ant請注意,這是完全不受支援且未經記錄的程式碼!它的功能非常有限,目前沒有任何改進或記錄它的計劃。如果我有一些空閒時間,這可能會改變,但不要指望它 :)

看來我的航班現在要降落了,所以我將藉此機會完成。請關注後續文章,其中描述了我們如何構建快照下載頁面,以便您可以直接從 S3 獲取快照。

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

先人一步

VMware 提供培訓和認證來加速您的進步。

瞭解更多

獲得支援

Tanzu Spring 在一個簡單的訂閱中提供對 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

檢視 Spring 社群中所有即將舉行的活動。

檢視全部