تایپاسکریپت - استقرار تابع لمبدا روی 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";