Objek Infrequent Access (IA), Arsip, Penyimpanan Arsip Dingin, dan Deep Cold Archive memiliki durasi penyimpanan minimum. Jika kelas penyimpanan suatu objek diubah atau objek dihapus sebelum memenuhi durasi penyimpanan minimum, Anda akan dikenakan biaya untuk penggunaan penyimpanan yang tidak memenuhi durasi tersebut. Untuk menghindari biaya yang tidak perlu, penting untuk memahami cara menentukan apakah objek dengan kelas penyimpanan berbeda telah memenuhi persyaratan durasi penyimpanan minimum sebelum melakukan perubahan kelas penyimpanan atau penghapusan objek.
Durasi penyimpanan minimum untuk objek dengan kelas penyimpanan berbeda
Kelas penyimpanan | Durasi penyimpanan minimum | Metode perhitungan |
Standar | Tidak tersedia | Tidak tersedia |
IA | 30 | Berdasarkan waktu modifikasi terakhir objek. |
Arsip | 60 | Berdasarkan waktu modifikasi terakhir objek. |
Cold Archive | 180 | Berdasarkan waktu ketika kelas penyimpanan objek diubah menjadi Cold Archive. |
Deep Cold Archive | 180 | Berdasarkan waktu ketika kelas penyimpanan objek diubah menjadi Deep Cold Archive. |
Contoh
Kode contoh berikut menunjukkan cara menanyakan metadata objek dan membandingkan nilai parameter LastModified dan TransitionTime objek dengan waktu saat ini untuk menentukan apakah objek memenuhi persyaratan durasi penyimpanan minimum:
Java
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.common.utils.DateUtil;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.HeadObjectRequest;
import com.aliyuncs.exceptions.ClientException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class Demo {
public static void main(String[] args) throws ClientException {
// Tentukan endpoint wilayah tempat bucket berada.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Tentukan ID wilayah yang sesuai dengan endpoint. Contoh: cn-hangzhou.
String region = "cn-hangzhou";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Tentukan nama bucket.
String bucketName = "examplebucket";
// Buat instance OSSClient.
// Panggil metode shutdown untuk melepaskan sumber daya ketika OSSClient tidak lagi digunakan.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Secara eksplisit nyatakan penggunaan algoritma tanda tangan V4.
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
// Tentukan jalur lengkap objek.
String[] objectNames = {"example.txt"};
// Pemetaan antara kelas penyimpanan dan durasi penyimpanan minimum. Satuan: hari.
Map<String, Integer> minimumRetentionPeriod = new HashMap<>();
minimumRetentionPeriod.put("Standard", 0);
minimumRetentionPeriod.put("IA", 30);
minimumRetentionPeriod.put("Archive", 60);
minimumRetentionPeriod.put("ColdArchive", 180);
minimumRetentionPeriod.put("DeepColdArchive", 180);
for (String objectName : objectNames) {
objectName = objectName.trim();
try {
// Tanyakan metadata objek.
HeadObjectRequest headObjectRequest = new HeadObjectRequest(bucketName, objectName);
ObjectMetadata objectMetadata = ossClient.headObject(headObjectRequest);
// Tanyakan kelas penyimpanan dan waktu modifikasi terakhir objek.
String storageClass = String.valueOf(objectMetadata.getObjectStorageClass());
String lastModifiedStr = objectMetadata.getLastModified().toString();
Date lastModified = objectMetadata.getLastModified();
if ("ColdArchive".equals(storageClass) || "DeepColdArchive".equals(storageClass)) {
Object transitionTimeObj = objectMetadata.getRawMetadata().get("x-oss-transition-time");
String transitionTimeStr = String.valueOf(transitionTimeObj);
Date transitionTime = DateUtil.parseRfc822Date(transitionTimeStr);
if (transitionTime != null) {
lastModified = transitionTime;
} else {
throw new Exception(Kelas penyimpanan Objek '" + objectName + '": "+ storageClass
+ ", x-oss-transition-time" + transitionTimeStr + ". ");
}
}
// Tanyakan waktu saat ini.
Date currentTime = new Date();
// Hitung durasi penyimpanan objek. Satuan: hari.
long storageDuration = (currentTime.getTime() - lastModified.getTime()) / (1000 * 60 * 60 * 24);
// Tampilkan informasi objek.
System.out.println("Nama objek: " + objectName);
System.out.println("Kelas penyimpanan: " + storageClass);
System.out.println("Dibuat pada: " + lastModifiedStr);
System.out.println("Durasi penyimpanan: " + storageDuration + "Hari");
// Tentukan apakah objek memenuhi persyaratan durasi penyimpanan minimum.
if (minimumRetentionPeriod.containsKey(storageClass)) {
int minRetention = minimumRetentionPeriod.get(storageClass);
if (storageDuration < minRetention) {
int daysRemaining = minRetention - (int) storageDuration;
System.out.println(objectName + " tidak memenuhi persyaratan durasi penyimpanan minimum. Objek perlu disimpan selama " + daysRemining + " hari lagi. Jika Anda menghapus objek, Anda akan dikenakan biaya"
+ daysRemining + " hari penggunaan penyimpanan untuk objek yang disimpan kurang dari durasi penyimpanan minimum.");
} else {
int daysExceeded = (int) storageDuration - minRetention;
System.out.println(objectName + " memenuhi persyaratan durasi penyimpanan minimum. Objek disimpan " + daysExceeded + " hari lebih lama dari durasi penyimpanan minimum. Anda tidak dikenakan biaya untuk penggunaan penyimpanan untuk objek yang disimpan kurang dari durasi penyimpanan minimum.");
}
} else {
System.out.println(Kelas penyimpanan objekName + " tidak dikenali.");
}
System.out.println("----------------------------------------"); // Pembatas.
} catch (Exception e) {
e.printStackTrace();
System.out.println("Terjadi kesalahan saat saya menanyakan metadata " + objectName + ": " + e.getMessage());
System.out.println("----------------------------------------"); // Pembatas.
}
}
// Matikan instance OSSClient.
ossClient.shutdown();
}
}Python
import datetime
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
# Tentukan nama bucket.
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# Tentukan jalur lengkap objek tunggal.
object_names = ['example.txt']
# Pemetaan antara kelas penyimpanan dan durasi penyimpanan minimum. Unit: hari.
minimum_retention_period = {
'Standard': 0,
'IA': 30,
'Archive': 60,
'ColdArchive': 180,
'DeepColdArchive': 180
}
for object_name in object_names:
object_name = object_name.strip()
try:
# Tanyakan semua metadata objek menggunakan metode head_object.
object_info = bucket.head_object(object_name)
# Tanyakan kelas penyimpanan dan waktu modifikasi terakhir objek.
storage_class = object_info.headers['x-oss-storage-class']
last_modified = object_info.headers['Last-Modified']
# Ubah waktu modifikasi terakhir menjadi objek datetime.
last_modified_time = datetime.datetime.strptime(last_modified, '%a, %d %b %Y %H:%M:%S GMT')
transition_time_str = object_info.headers.get('x-oss-transition-time')
transition_time = None
if storage_class == 'ColdArchive' or storage_class == 'DeepColdArchive':
if transition_time_str:
last_modified_time = datetime.datetime.strptime(transition_time_str, "%a, %d %b %Y %H:%M:%S %Z")
else:
raise Exception(f"Kelas penyimpanan '{object_name}': {storage_class}. x-oss-transition-time: {transition_time_str}.")
# Tanyakan waktu saat ini.
current_time = datetime.datetime.now()
# Hitung durasi penyimpanan objek. Unit: hari.
storage_duration = (current_time - last_modified_time).days
# Tampilkan informasi objek.
print(f "Nama objek: {object_name}")
print(f "Kelas penyimpanan: {storage_class}")
print(f "Dibuat pada: {last_modified}")
print(f "Durasi penyimpanan: {storage_duration} hari")
# Tentukan apakah objek memenuhi persyaratan durasi penyimpanan minimum.
if storage_class in minimum_retention_period:
min_retention = minimum_retention_period[storage_class]
if storage_duration < min_retention:
days_remaining = min_retention - storage_duration
print(f"{object_name} tidak memenuhi persyaratan durasi penyimpanan minimum. Objek perlu disimpan selama {days_remaining} hari lagi. Jika Anda menghapus objek, Anda akan dikenakan biaya {days_remaining} hari penggunaan penyimpanan untuk objek yang disimpan kurang dari durasi penyimpanan minimum.")
else:
days_exceeded = storage_duration - min_retention
print(f"{object_name} memenuhi persyaratan durasi penyimpanan minimum. Objek disimpan {days_exceeded} hari lebih lama dari durasi penyimpanan minimum. Anda tidak dikenakan biaya untuk penggunaan penyimpanan untuk objek yang disimpan kurang dari durasi penyimpanan minimum.")
else:
print(f"Kelas penyimpanan {object_name} tidak dikenali.")
print("-" * 40) # Pembatas.
except Exception as e:
print(f "Terjadi kesalahan saat saya menanyakan metadata {object_name}: {str(e)}")
print("-" * 40) # Pembatas Node.js
const OSS = require("ali-oss");
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
const config = {
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke oss-cn-hangzhou.
region: "oss-cn-hangzhou",
// Tentukan nama bucket.
bucket: "examplebucket",
};
const client = new OSS(config);
// Pemetaan antara kelas penyimpanan dan durasi penyimpanan minimum. Unit: hari.
const minimum_retention_period = {
Standard: 0,
IA: 30,
Archive: 60,
ColdArchive: 180,
DeepColdArchive: 180,
};
// Hitung selisih waktu dalam hari.
function getDays(date1, date2) {
if (!(date1 instanceof Date) || !(date2 instanceof Date)) {
throw new Error("Perlu melewati objek Date yang valid");
}
const timestamp1 = date1.getTime();
const timestamp2 = date2.getTime();
const diffInMilliseconds = Math.abs(timestamp2 - timestamp1);
const diffInDays = diffInMilliseconds / (1000 * 60 * 60 * 24);
return Math.round(diffInDays);
}
// Tentukan jalur lengkap objek.
const object_names = ["example.jpg"];
(async () => {
for (const object_name of object_names) {
try {
// Tanyakan semua metadata objek menggunakan metode head.
const object_info = await client.head(object_name);
const { headers } = object_info.res;
// Tanyakan kelas penyimpanan dan waktu modifikasi terakhir objek.
const storage_class = headers["x-oss-storage-class"];
const last_modified = headers["last-modified"];
let last_modified_time = new Date(last_modified);
const transition_time_str = headers["x-oss-transition-time"];
if (["ColdArchive", "DeepColdArchive"].includes(storage_class)) {
if (transition_time_str)
last_modified_time = new Date(transition_time_str);
else {
const errorStr = Kelas penyimpanan Objek '${object_name}': ${storage_class}. x-oss-transition-time: ${transition_time_str}. x-oss-transition-time hanya tersedia untuk objek yang kelas penyimpanannya diubah menjadi Cold Archive atau Deep Cold Archive berdasarkan aturan siklus hidup.
throw new Error(errorStr);
}
}
const current_time=new Date(); // Tanyakan waktu saat ini.
const storage_duration=getDays (current_time, last_modified_time); // Hitung durasi penyimpanan objek. Unit: hari.
// Tampilkan informasi objek.
console.log ('Nama objek: ${object_name}');
console.log ('Kelas penyimpanan: ${storage_class}');
console.log ('Dibuat pada: ${last_modified}');
console.log ('Durasi penyimpanan: ${storage_duration} hari ');
// Tentukan apakah objek memenuhi persyaratan durasi penyimpanan minimum.
if (Object.keys(minimum_retention_period).includes(storage_class)) {
min_retention = minimum_retention_period[storage_class];
if (storage_duration < min_retention) {
const days_remaining = min_retention - storage_duration;
console.log(
'${object_name} tidak memenuhi persyaratan durasi penyimpanan minimum. Objek perlu disimpan selama ${days_remaining} hari lagi. Jika Anda menghapus objek, Anda akan dikenakan biaya ${days_remaining} hari penggunaan penyimpanan untuk objek yang disimpan kurang dari durasi penyimpanan minimum. `
);
} else {
const days_exceeded = storage_duration - min_retention;
console.log(
'${object_name} memenuhi persyaratan durasi penyimpanan minimum. Objek disimpan ${days_exceeded} hari lebih lama dari durasi penyimpanan minimum. Anda tidak dikenakan biaya untuk penggunaan penyimpanan untuk objek yang disimpan kurang dari durasi penyimpanan minimum. `
);
}
} else console.log(Kelas penyimpanan '${object_name} tidak dikenali. `);
} catch (e) {
console.log ('Terjadi kesalahan saat saya menanyakan metadata ${object_name}:', e);
}
}
})();
PHP
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\Core\OssException;
// Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
$endpoint = 'http://oss-cn-hangzhou.aliyuncs.com';
// Tentukan nama bucket.
$bucketName = 'examplebucket';
// Buat instance OSSClient.
try {
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
$provider = new EnvironmentVariableCredentialsProvider();
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
);
$ossClient = new OssClient($config);
// Tentukan jalur lengkap objek.
$objectNames = ['example.txt'];
$minimumRetentionPeriod = [
'Standard' => 0,
'IA' => 30,
'Archive' => 60,
'ColdArchive' => 180,
'DeepColdArchive' => 180,
];
foreach ($objectNames as $objectName) {
$objectName = trim($objectName);
try {
// Tanyakan semua metadata objek menggunakan metode headObject.
$objectInfo = $ossClient->getObjectMeta($bucketName, $objectName);
// Tanyakan kelas penyimpanan dan waktu modifikasi terakhir objek.
$storageClass = $objectInfo['x-oss-storage-class'];
$lastModified = $objectInfo['last-modified'];
// Ubah waktu modifikasi terakhir objek menjadi timestamp.
$lastModifiedTime = strtotime($lastModified);
if (in_array($storageClass, array("ColdArchive", "DeepColdArchive")) && isset($objectInfo["x-oss-transition-time"])) {
$lastModifiedTime = strtotime($objectInfo["x-oss-transition-time"]);
}
// Tanyakan waktu saat ini.
$currentTime = time();
// Hitung durasi penyimpanan objek. Unit: hari.
$storageDuration = floor(($currentTime - $lastModifiedTime) / (60 * 60 * 24));
// Tampilkan informasi objek.
echo "Nama objek: $objectName\n";
echo "Kelas penyimpanan: $storageClass\n";
echo "Dibuat pada: $lastModified\n";
echo "Durasi penyimpanan: $storageDuration hari\n";
// Tentukan apakah objek memenuhi persyaratan durasi penyimpanan minimum.
if (isset($minimumRetentionPeriod[$storageClass])) {
$minRetention = $minimumRetentionPeriod[$storageClass];
if ($storageDuration < $minRetention) {
$daysRemaining = $minRetention - $storageDuration;
echo "$objectName tidak memenuhi persyaratan durasi penyimpanan minimum. Objek perlu disimpan selama $daysRemaining hari lagi. Jika Anda menghapus objek, Anda akan dikenakan biaya $daysRemaining hari penggunaan penyimpanan untuk objek yang disimpan kurang dari durasi penyimpanan minimum. \n";
} else {
$daysExceeded = $storageDuration - $minRetention;
System.out.println(echo "$objectName memenuhi persyaratan durasi penyimpanan minimum. Objek disimpan $daysExceeded hari lebih lama dari durasi penyimpanan minimum. Anda tidak dikenakan biaya untuk penggunaan penyimpanan untuk objek yang disimpan kurang dari durasi penyimpanan minimum. \n";
}
} else {
Kelas penyimpanan echo "$objectName tidak dikenali. \n";
}
echo str_repeat("-", 40) . "\n"; // Pembatas.
} catch (OssException $e) {
echo "Terjadi kesalahan saat saya menanyakan metadata $objectName: " . $e->getMessage() . "\n";
echo str_repeat("-", 40) . "\n"; // Pembatas.
}
}
} catch (OssException $e) {
printf(__FUNCTION__ . ": GAGAL\n");
printf($e->getMessage() . "\n");
return;
}
Go
package main
import (
"context"
"fmt"
"log"
"net/http"
"strings"
"time"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
func main() {
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion("cn-hangzhou").
WithEndpoint("https://oss-cn-hangzhou.aliyuncs.com")
client := oss.NewClient(cfg)
// Tentukan jalur lengkap objek yang akan diperiksa.
objectNames := []string{"example.txt"}
// Tentukan durasi penyimpanan minimum (dalam hari) untuk setiap kelas penyimpanan.
minimumRetentionPeriod := map[string]int{
"Standard": 0,
"IA": 30,
"Archive": 60,
"ColdArchive": 180,
"DeepColdArchive": 180,
}
// Tentukan nama bucket.
bucketName := "examplebucket"
for _, objectName := range objectNames {
objectName = strings.TrimSpace(objectName)
if objectName == "" {
continue
}
// Query metadata objek.
objectInfo, err := client.HeadObject(context.TODO(), &oss.HeadObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
})
if err != nil {
log.Printf("Terjadi kesalahan saat mengambil metadata %s: %v\n", objectName, err)
continue
}
// Periksa apakah storageClass nil.
if objectInfo.StorageClass == nil {
log.Printf("Peringatan: Kelas penyimpanan %s adalah nil. Melewati objek ini.\n", objectName)
continue
}
storageClass := *objectInfo.StorageClass
currentTime := time.Now().Unix()
// Hitung durasi penyimpanan dalam hari.
storageDuration := (currentTime - objectInfo.LastModified.Unix()) / (60 * 60 * 24)
// Untuk Cold Archive dan Deep Cold Archive, gunakan waktu transisi jika tersedia.
if storageClass == "ColdArchive" || storageClass == "DeepColdArchive" {
transitionTimeStr := objectInfo.Headers.Get("x-oss-transition-time")
if transitionTimeStr != "" {
transitionTime, err := time.Parse(http.TimeFormat, transitionTimeStr)
if err != nil {
log.Printf("Peringatan: Gagal mengurai x-oss-transition-time untuk %s: %v. Menggunakan waktu pembuatan.\n", objectName, err)
} else {
storageDuration = (currentTime - transitionTime.Unix()) / (60 * 60 * 24)
}
}
}
// Cetak informasi dasar objek.
fmt.Printf("Nama objek: %s\n", objectName)
fmt.Printf("Kelas penyimpanan: %s\n", storageClass)
fmt.Printf("Dibuat pada: %s\n", objectInfo.LastModified.Format("2006-01-02 15:04:05"))
fmt.Printf("Durasi penyimpanan: %d hari\n", storageDuration)
// Periksa apakah persyaratan durasi penyimpanan minimum terpenuhi.
minRetention, exists := minimumRetentionPeriod[storageClass]
if !exists {
fmt.Printf("Kelas penyimpanan %s tidak dikenali.\n", objectName)
fmt.Println("----------------------------------------")
continue
}
if minRetention == 0 {
// Kelas penyimpanan Standard tidak memiliki persyaratan durasi penyimpanan minimum.
fmt.Printf("%s menggunakan kelas penyimpanan Standard, yang tidak memiliki persyaratan durasi penyimpanan minimum. Anda dapat menghapus objek tanpa dikenakan biaya untuk durasi penyimpanan yang tidak mencukupi.\n", objectName)
} else {
daysRemaining := minRetention - int(storageDuration)
if daysRemaining > 0 {
// Objek belum memenuhi persyaratan durasi penyimpanan minimum.
fmt.Printf("%s tidak memenuhi persyaratan durasi penyimpanan minimum. Objek perlu disimpan selama %d hari lagi. Jika Anda menghapus objek sekarang, Anda akan dikenakan biaya untuk %d hari penggunaan penyimpanan objek yang disimpan kurang dari durasi penyimpanan minimum.\n",
objectName, daysRemaining, daysRemaining)
} else {
// Objek telah memenuhi persyaratan durasi penyimpanan minimum.
fmt.Printf("%s telah memenuhi persyaratan durasi penyimpanan minimum (disimpan selama %d hari, diperlukan %d hari). Anda dapat menghapus objek tanpa dikenakan biaya untuk durasi penyimpanan yang tidak mencukupi.\n",
objectName, int(storageDuration), minRetention)
}
}
fmt.Println("----------------------------------------")
}
}Referensi
Kode contoh sebelumnya menunjukkan cara menanyakan metadata objek menggunakan metode head_object dan membandingkan nilai parameter LastModified dan TransitionTime objek dengan waktu saat ini untuk menentukan apakah objek memenuhi persyaratan durasi penyimpanan minimum. Jika Anda ingin menentukan apakah beberapa objek memenuhi persyaratan durasi penyimpanan minimum, gunakan operasi GetBucket (ListObjects), ListObjectVersions(GetBucketVersions), dan ListBucketInventory.