Kelas penyimpanan Infrequent Access (IA), Archive, Cold Archive, dan Deep Cold Archive masing-masing memiliki durasi penyimpanan minimum. Jika Anda menghapus objek atau mengonversi kelas penyimpanannya sebelum periode tersebut berakhir, OSS akan menagih biaya atas penggunaan penyimpanan objek yang disimpan kurang dari durasi penyimpanan minimum.
Untuk menghindari biaya tak terduga, pastikan objek telah memenuhi persyaratan durasi penyimpanan minimum sebelum menghapusnya atau mengonversi kelas penyimpanannya.
Durasi penyimpanan minimum berdasarkan kelas penyimpanan
| Storage class | Minimum storage duration | Duration calculated from |
|---|---|---|
| Standard | None | N/A |
| Infrequent Access (IA) | 30 days | Last modified time |
| Archive | 60 days | Last modified time |
| Cold Archive | 180 days | Time when the storage class was converted to Cold Archive |
| Deep Cold Archive | 180 days | Time when the storage class was converted to Deep Cold Archive |
Dua operasi yang memicu biaya penghapusan dini: menghapus objek dan mengonversi kelas penyimpanannya. Pastikan objek telah memenuhi persyaratan durasi penyimpanan minimum sebelum melakukan salah satu operasi tersebut.
Periksa apakah objek memenuhi persyaratan durasi penyimpanan minimum
Contoh kode berikut mengkueri metadata objek menggunakan operasi HeadObject dan membandingkan nilai header Last-Modified atau x-oss-transition-time dengan waktu saat ini. Untuk objek Cold Archive dan Deep Cold Archive, durasi dihitung berdasarkan x-oss-transition-time (waktu konversi kelas penyimpanan), bukan Last-Modified.
Python
import datetime
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, 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 path lengkap objek tunggal.
object_names = ['example.txt']
# Pemetaan antara kelas penyimpanan dan durasi penyimpanan minimum. Satuan: 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:
# Kueri semua metadata objek menggunakan metode head_object.
object_info = bucket.head_object(object_name)
# Kueri 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}.")
# Kueri waktu saat ini.
current_time = datetime.datetime.now()
# Hitung durasi penyimpanan objek. Satuan: hari.
storage_duration = (current_time - last_modified_time).days
# Tampilkan informasi objek.
print(f "Object name: {object_name}")
print(f "Storage class: {storage_class}")
print(f "Created at: {last_modified}")
print(f "Storage duration: {storage_duration} days")
# 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 tersebut, Anda akan dikenai biaya penggunaan penyimpanan selama {days_remaining} hari 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 telah disimpan {days_exceeded} hari melebihi durasi minimum. Anda tidak dikenai biaya 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 mengkueri metadata {object_name}: {str(e)}")
print("-" * 40) # PembatasJava
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 titik akhir wilayah tempat bucket berada.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Tentukan ID Wilayah yang memetakan ke titik akhir. Contoh: cn-hangzhou.
String region = "cn-hangzhou";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda menjalankan kode contoh, pastikan bahwa variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Tentukan nama bucket.
String bucketName = "examplebucket";
// Buat instans OSSClient.
// Panggil metode shutdown untuk melepaskan sumber daya saat OSSClient tidak lagi digunakan.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Deklarasikan secara eksplisit 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 {
// Kueri metadata objek.
HeadObjectRequest headObjectRequest = new HeadObjectRequest(bucketName, objectName);
ObjectMetadata objectMetadata = ossClient.headObject(headObjectRequest);
// Kueri 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("Storage class of \"Object '" + objectName + '\'": "+ storageClass
+ ", x-oss-transition-time" + transitionTimeStr + ". ");
}
}
// Kueri 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 " + daysRemaining + " hari lagi. Jika Anda menghapus objek, Anda akan dikenakan biaya"
+ daysRemaining + " 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 objek yang disimpan kurang dari durasi penyimpanan minimum.");
}
} else {
System.out.println("Kelas penyimpanan " + objectName + " tidak dikenali.");
}
System.out.println("----------------------------------------"); // Pembatas.
} catch (Exception e) {
e.printStackTrace();
System.out.println("Terjadi kesalahan saat mengkueri metadata " + objectName + ": " + e.getMessage());
System.out.println("----------------------------------------"); // Pembatas.
}
}
// Matikan instans OSSClient.
ossClient.shutdown();
}
}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 path lengkap objek yang akan diperiksa.
objectNames := []string{"example.txt"}
// Definisikan 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
}
// Kueri 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 mengkueri metadata %s: %v\n", objectName, err)
continue
}
// Periksa apakah storageClass bernilai nil.
if objectInfo.StorageClass == nil {
log.Printf("Peringatan: Kelas penyimpanan %s bernilai 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 sebagai gantinya.\n", objectName, err)
} else {
storageDuration = (currentTime - transitionTime.Unix()) / (60 * 60 * 24)
}
}
}
// Cetak informasi dasar objek.
fmt.Printf("Object name: %s\n", objectName)
fmt.Printf("Storage class: %s\n", storageClass)
fmt.Printf("Created at: %s\n", objectInfo.LastModified.Format("2006-01-02 15:04:05"))
fmt.Printf("Storage duration: %d days\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 dikenai biaya karena durasi penyimpanan 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 dikenai biaya penggunaan penyimpanan selama %d hari untuk 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 dikenai biaya karena durasi penyimpanan tidak mencukupi.\n",
objectName, int(storageDuration), minRetention)
}
}
fmt.Println("----------------------------------------")
}
}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 instans OSSClient.
try {
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, 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 path lengkap objek.
$objectNames = ['example.txt'];
$minimumRetentionPeriod = [
'Standard' => 0,
'IA' => 30,
'Archive' => 60,
'ColdArchive' => 180,
'DeepColdArchive' => 180,
];
foreach ($objectNames as $objectName) {
$objectName = trim($objectName);
try {
// Kueri semua metadata objek menggunakan metode headObject.
$objectInfo = $ossClient->getObjectMeta($bucketName, $objectName);
// Kueri kelas penyimpanan dan waktu modifikasi terakhir objek.
$storageClass = $objectInfo['x-oss-storage-class'];
$lastModified = $objectInfo['last-modified'];
// Konversi 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"]);
}
// Kueri waktu saat ini.
$currentTime = time();
// Hitung durasi penyimpanan objek. Satuan: hari.
$storageDuration = floor(($currentTime - $lastModifiedTime) / (60 * 60 * 24));
// Tampilkan informasi objek.
echo "Object name: $objectName\n";
echo "Storage class: $storageClass\n";
echo "Created at: $lastModified\n";
echo "Storage duration: $storageDuration days\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 tersebut, Anda akan dikenai biaya penggunaan penyimpanan selama $daysRemaining hari 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 telah disimpan $daysExceeded hari melebihi durasi minimum. Anda tidak dikenai biaya 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 mengkueri metadata $objectName: " . $e->getMessage() . "\n";
echo str_repeat("-", 40) . "\n"; // Pembatas.
}
}
} catch (OssException $e) {
printf(__FUNCTION__ . ": GAGAL\n");
printf($e->getMessage() . "\n");
return;
}Node.js
const OSS = require("ali-oss");
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda menjalankan contoh kode, 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 perbedaan waktu dalam hari.
function getDays(date1, date2) {
if (!(date1 instanceof Date) || !(date2 instanceof Date)) {
throw new Error("Perlu meneruskan 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 {
// Kueri semua metadata objek dengan menggunakan metode head.
const object_info = await client.head(object_name);
const { headers } = object_info.res;
// Kueri kelas penyimpanan dan waktu terakhir diubah 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(); // Kueri 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 dikenai biaya penggunaan penyimpanan selama ${days_remaining} hari 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 dikenai biaya untuk penggunaan penyimpanan 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 melakukan kueri metadata ${object_name}:`, e);
}
}
})();Periksa durasi penyimpanan minimum untuk multiple objek
Untuk memeriksa beberapa objek sekaligus, gunakan operasi GetBucket (ListObjects), ListObjectVersions (GetBucketVersions), atau ListBucketInventory untuk mengambil metadata objek secara massal.