تایپاسکریپت - استقرار تابع لمبدا روی AWS با Pulumi
من در تلاش هستم تا یک تابع لامبدا را در حساب AWS خود مستقر کنم که فایلی را که در "lambda-bucket-in" آپلود میشود، فشرده کرده و به یک باکت "lambda-bucket-out" منتقل کند. مثالی که میخواهم دنبال کنم همین است، بهویژه روش دوم (روش اول کار خود را به درستی انجام میدهد).
کد پولومی من به شرح زیر است:
import * as aws from "@pulumi/aws";
import * as pulumi from "@pulumi/pulumi";
const tpsReports = new aws.s3.Bucket("lambda-bucket-in");
const tpsZips = new aws.s3.Bucket("lambda-bucket-out");
// First, create some IAM machinery:
const zipFuncRole = new aws.iam.Role("zipTpsReportsFuncRole", {
assumeRolePolicy: {
Version: "2012-10-17",
Statement: [{
Action: "sts:AssumeRole",
Principal: {
Service: "lambda.amazonaws.com",
},
Effect: "Allow",
Sid: "",
}],
},
});
new aws.iam.RolePolicyAttachment("zipTpsReportsFuncRoleAttach", {
role: zipFuncRole,
policyArn: aws.iam.ManagedPolicy.AWSLambdaExecute,
});
// Next, create the Lambda function itself:
const zipFunc = new aws.lambda.Function("zipTpsReportsFunc", {
environment: {
variables: {
"TPS_ZIP_BUCKET": tpsZips.bucket,
},
},
code: new pulumi.asset.AssetArchive({
".": new pulumi.asset.FileArchive("app"),
}),
runtime: "nodejs12.x",
role: zipFuncRole.arn,
});
// Finally, register the Lambda to fire when a new TPS report arrives:
tpsReports.onObjectCreated("zipTpsReports", zipFunc);
در حالی که فایل «app»، همراه با تابع لامبدا به این صورت است:
const AdmZip = require("adm-zip");
const s3 = new aws.sdk.S3();
for (const rec of e.Records || []) {
const zip = new AdmZip();
const [ buck, key ] = [ rec.s3.bucket.name, rec.s3.object.key ];
console.log(`Zipping ${buck}/${key} into ${tpsZips.bucket.get()}/${key}.zip`);
const data = await s3.getObject({ Bucket: buck, Key: key }).promise);
zip.addFile(key, data.Body);
await s3.putObject({
Bucket: tpsZips.bucket.get(),
Key: `${key}.zip`,
Body: zip.toBuffer(),
}).promise();
}
در حالی که در حال اجرای pulumi با دستور pulumi up --yes هستید و پس از وارد کردن رمز عبور، این پیغام را بر میگرداند:
Previewing update (my-lambda):
Type Name Plan Info
+ pulumi:pulumi:Stack bucket-my-lambda-my-lambda create 1 error; 48 messages
+ ├─ aws:s3:Bucket lambda-bucket-out create
+ ├─ aws:s3:Bucket lambda-bucket-in create
+ │ ├─ aws:s3:BucketEventSubscription zipTpsReports create
+ │ └─ aws:s3:BucketNotification zipTpsReports create
+ ├─ aws:iam:Role zipTpsReportsFuncRole create
+ └─ aws:iam:RolePolicyAttachment zipTpsReportsFuncRoleAttach create
Diagnostics:
pulumi:pulumi:Stack (bucket-my-lambda-my-lambda):
TypeError: Cannot read property 'split' of undefined
at deserializeProperty (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/rpc.js:472:48)
at Object.deserializeProperties (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/rpc.js:126:24)
at /home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:524:43
at Generator.next (<anonymous>)
at /home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:21:71
at new Promise (<anonymous>)
at __awaiter (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:17:12)
at resolveOutputs (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:519:12)
at Object.<anonymous> (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:321:19)
at Generator.throw (<anonymous>)
TypeError: Cannot read property 'split' of undefined
at deserializeProperty (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/rpc.js:472:48)
at Object.deserializeProperties (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/rpc.js:126:24)
at /home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:524:43
at Generator.next (<anonymous>)
at /home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:21:71
at new Promise (<anonymous>)
at __awaiter (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:17:12)
at resolveOutputs (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:519:12)
at Object.<anonymous> (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:321:19)
at Generator.throw (<anonymous>)
unhandled rejection: CONTEXT(1251): monitor.registerResource(resource:zipTpsReports[aws:lambda/permission:Permission])-initial
STACK_TRACE:
Error:
at Object.debuggablePromise (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/debuggable.js:69:75)
at runAsyncResourceOp (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:634:75)
at Object.<anonymous> (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:257:9)
at Generator.next (<anonymous>)
at /home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:21:71
at new Promise (<anonymous>)
at __awaiter (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:17:12)
at /home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:219:63
at runMicrotasks (<anonymous>)
at processTicksAndRejections (internal/process/task_queues.js:93:5)
unhandled rejection: CONTEXT(1251): monitor.registerResource(resource:zipTpsReports[aws:lambda/permission:Permission])-initial
STACK_TRACE:
Error:
at Object.debuggablePromise (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/debuggable.js:69:75)
at runAsyncResourceOp (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:634:75)
at Object.<anonymous> (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:257:9)
at Generator.next (<anonymous>)
at /home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:21:71
at new Promise (<anonymous>)
at __awaiter (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:17:12)
at /home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:219:63
at runMicrotasks (<anonymous>)
at processTicksAndRejections (internal/process/task_queues.js:93:5)
error: Running program '/home/andrea/Piratech/pulumi/bucket-my-lambda' failed with an unhandled exception:
TypeError: Cannot read property 'split' of undefined
at deserializeProperty (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/rpc.js:472:48)
at Object.deserializeProperties (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/rpc.js:126:24)
at /home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:524:43
at Generator.next (<anonymous>)
at /home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:21:71
at new Promise (<anonymous>)
at __awaiter (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:17:12)
at resolveOutputs (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:519:12)
at Object.<anonymous> (/home/andrea/Piratech/pulumi/bucket-my-lambda/node_modules/@pulumi/pulumi/runtime/resource.js:321:19)
at Generator.throw (<anonymous>)
آیا کسی میداند چگونه این مشکل را حل کند و این مخفف چه معنی میدهد؟ از کمک شما متشکرم.
پاسخ شماره ۱
من مشکوک هستم که مشکل ممکن است در بخش کد تابع Lambda باشد، احتمالاً شما نیاز دارید که از مسیر مطلق برای دایرکتوری "app" استفاده کنید. شما میتوانید این تغییر را امتحان کنید و کد را با این جایگزین کنید.
new pulumi.asset.AssetArchive({
".": new pulumi.asset.FileArchive(path.join(__dirname, "app")),
}),
و مسیر وارداتی در ابتدای اسکریپت:
import * as path from "path";
