我试图从谷歌云计算和计算引擎API获取数据。我在AWS lambda中使用Google的nodejs SKD。函数在dev中运行完成并获得所需的结果(使用AWS toolkit for vscode)。测试λ,我得到了
“errorMessage”:“请求ID:...错误:运行时退出,出现错误:signal:killed“我读到的是与过度使用内存有关。此外,当我尝试记录API调用的结果时,我什么也没有收到。
服务帐户中的“我的应用程序默认凭据”文件如下所示:
{
"type": "service_account",
"project_id": "",
"private_key_id": "",
"private_key": "",
"client_email": "",
"client_id": "",
"auth_uri": "",
"token_uri": "",
"auth_provider_x509_cert_url": "",
"client_x509_cert_url": "",
"universe_domain": "googleapis.com"
}
它的路径在lambdas env中。
我的lambda部分代码是:
const AWS = require('aws-sdk');
const { CloudCatalogClient } = require('@google-cloud/billing').v1;
const { MachineTypesClient } = require('@google-cloud/compute').v1;
const FROM_NANOS = 1000000000.0;
const FROM_GIBY = 1024;
async function getSkuList() {
const billingClient = new CloudCatalogClient();
const computeEngineServiceId = await getComputeEngineServiceId (billingClient);
const billingRequest = {
parent: computeEngineServiceId,
};
// https://cloud.google.com/nodejs/docs/reference/billing/latest/billing/v1.cloudcatalogclient
const skuList = await billingClient.listSkusAsync(billingRequest);
console.dir("skuList: ", skuList) // shows only text in lambdas logs
// billingClient.close();
return [ skuList, billingClient ];
}
// Get Compute-Engine service id
async function getComputeEngineServiceId (billingClient) {
let computeEngine = null;
let pageToken = null;
do {
const serviceList = await billingClient.listServicesAsync({ pageToken });
pageToken = serviceList.nextPageToken;
for await (const service of serviceList) {
if (service.displayName === "Compute Engine") {
computeEngine = service.name;
break;
}
}
} while (!computeEngine && pageToken)
if (!computeEngine) {
throw new Error("Compute engine service not found");
}
return computeEngine;
}
// Get instances list for zone us-east1-a
async function getInstancesTypes() {
const instancesClient = new MachineTypesClient();
const instancesRequest = {
project: process.env.projectId,
zone: "us-east1-a",
};
const res = [];
const instances = await instancesClient.listAsync(instancesRequest);
console.dir("instances: ", instances) // shows only text in lambdas logs
for await (const type of instances) {
const instance = {
instanceType: type.name,
memorySize: type.memoryMb,
cpuCount: type.guestCpus,
}
res.push(instance);
}
instancesClient.close();
return res;
}
// LAMBDA HANDLER
exports.handler = async function(event, context, callback) {
try {
...
const [skuList, billingClient ] = await getSkuList();
const instancesTypes = await getInstancesTypes();
for await (const sku of skuList) {
...
}
billingClient.close()
const resultV1 = {
timestamp: Date.now(),
cloudProvider: 'GCP',
...
};
console.log(" : ", JSON.stringify(resultV1));
callback(null, "Success");
} catch (error) {
console.error(error.message);
throw error;
}
};
你知道我该怎么做才能让事情顺利进行吗?谢谢!
1条答案
按热度按时间k2fxgqgv1#
错误消息
Runtime exited with error: signal: killed
通常在AWS Lambda函数超过其分配的资源或执行时间限制时发生。Google Cloud Compute Engine API可能需要大量资源或时间才能完成某些操作,而AWS Lambda有一些可能导致此错误的限制。
AWS Lambda允许您配置分配给函数的内存量。请尝试增加分配的内存,以便为函数执行提供更多资源。更高的内存分配也增加了该函数可用的CPU能力。如果您的函数执行CPU密集型任务,请考虑同时调整超时配置。对于需要更长时间才能完成的任务,可能需要更长的超时时间。
如果问题仍然存在,最好联系AWS支持以获得进一步帮助。