如何通过TypeScript SDK调用API估算OCI实例及存储成本?
OCI资源成本估算的TypeScript SDK实现方案
可行方案:基于OCI Pricing Service SDK实现
OCI官方提供的Pricing Service API及对应TypeScript SDK,可直接获取各类资源的单价,结合你传入的资源数量计算总成本,完全匹配你的需求。
步骤1:安装依赖
先安装OCI Pricing模块和通用认证模块:
npm install @oci-pricing @oci-common
步骤2:实现成本估算逻辑
以下是符合你请求/响应格式的TypeScript代码示例:
import { PricingClient, GetProductPricesRequest } from "@oci-pricing"; import { ConfigFileAuthenticationDetailsProvider } from "@oci-common"; // 初始化OCI认证(依赖本地~/.oci/config配置文件) const authProvider = new ConfigFileAuthenticationDetailsProvider(); const pricingClient = new PricingClient({ authenticationDetailsProvider: authProvider }); // 你的输入资源列表 const inputResources = [ { "name": "compute.standard.x86", "shape": "VM.Standard2.1", "region": "us-ashburn-1", "quantity": 2 }, { "name": "storage.standard", "region": "us-ashburn-1", "quantity": 100 } ]; // 批量计算资源成本 async function calculateResourceCosts() { const outputPrices = []; for (const resource of inputResources) { let filterConfig; // 根据资源类型配置价格查询过滤条件 switch (resource.name) { case "compute.standard.x86": filterConfig = { productFamily: "Compute Instance", attributes: { shape: resource.shape }, pricingModel: "PAY_AS_YOU_GO" }; break; case "storage.standard": filterConfig = { productFamily: "Block Storage", attributes: { storageType: "Standard" }, pricingModel: "PAY_AS_YOU_GO" }; break; default: console.warn(`Unsupported resource type: ${resource.name}`); continue; } // 构建价格查询请求 const priceRequest: GetProductPricesRequest = { compartmentId: "ocid1.tenancy.oc1..your-tenancy-ocid", // 替换为你的租户OCID filter: { region: resource.region, productFamily: filterConfig.productFamily, attributes: filterConfig.attributes, pricingModel: filterConfig.pricingModel } }; try { const priceResponse = await pricingClient.getProductPrices(priceRequest); if (!priceResponse.items?.length) { console.warn(`No price found for resource: ${JSON.stringify(resource)}`); continue; } const priceItem = priceResponse.items[0]; const unitPrice = priceItem.prices?.[0].unitPrice; if (!unitPrice) continue; // 计算总成本并格式化输出 const formattedPrice = { name: resource.name, ...(resource.shape && { shape: resource.shape }), region: resource.region, quantity: resource.quantity, price: { amount: parseFloat(unitPrice.amount) * resource.quantity, currency: unitPrice.currency, unit: resource.name.includes("compute") ? "HOUR" : "GB" } }; outputPrices.push(formattedPrice); } catch (err) { console.error(`Failed to fetch price for ${resource.name}:`, err); } } // 输出你需要的响应格式 console.log(JSON.stringify({ prices: outputPrices }, null, 2)); } // 执行计算 calculateResourceCosts();
关键说明
- 认证配置:代码依赖本地
~/.oci/config文件中的认证信息,确保该文件包含正确的租户OCID、用户OCID、密钥路径等。 - 过滤条件调整:不同资源类型的
productFamily和attributes需要对应OCI官方定义的产品属性,比如对象存储需将productFamily改为Object Storage,attributes调整为对应的存储层级。 - 单位与定价模型:示例中使用按需付费(PAY_AS_YOU_GO),如果需要预留实例或其他定价模型,修改
pricingModel参数即可;价格单位需根据资源类型调整(比如存储通常是每月每GB,实例是每小时)。 - 扩展支持:可以通过添加更多
case分支支持其他资源类型(如数据库、网络资源等)。
内容的提问来源于stack exchange,提问作者Samuel A. Souza
相关产品推荐
相关产品推荐

