sparse-intern-71089
08/05/2022, 2:23 AMvictorious-memory-43562
08/05/2022, 2:48 AMmillions-furniture-75402
08/05/2022, 9:05 PMmillions-furniture-75402
08/05/2022, 9:09 PMconst eventBridgeRuleCloudTrailAction = new aws.cloudwatch.EventRule(`${appName}-cloudtrail-s3-action`, {
  description: "CloudTrail event filtered down to S3 on the asset buckets",
  eventPattern: pulumi
    .all([assetInputBucket.id, assetOutputBucket.id])
    .apply(([assetInputBucketName, assetOutputBucketName]) => {
      return JSON.stringify({
        source: ["aws.s3"],
        "detail-type": ["AWS API Call via CloudTrail"],
        detail: {
          eventSource: ["<http://s3.amazonaws.com|s3.amazonaws.com>"],
          eventName: [
            "CompleteMultipartUpload",
            "CopyObject",
            "DeleteObject",
            "DeleteObjects",
            "PutObject",
            "UpdateObject",
          ],
          requestParameters: {
            bucketName: [assetInputBucketName, assetOutputBucketName],
          },
        },
      });
    }),
});
new aws.cloudwatch.EventTarget(`${appName}-ebt-cloudtrail-action-sqs`, {
  rule: eventBridgeRuleCloudTrailAction.name,
  arn: cloudTrailEventQueue.arn,
  inputTransformer: {
    inputPaths: {
      detailType: "$.detail-type",
      eventName: "$.detail.eventName",
      id: "$.id",
      requestParameters: "$.detail.requestParameters",
      source: "$.source",
    },
    inputTemplate: `{
      "detail": {\
        "eventId": <id>,\
        "eventName": <eventName>,\
        "eventSource": <source>,\
        "messageType": "Event",\
        "requestParameters": <requestParameters>,\
        "version": "0"\
      },
      "detail-type": <detailType>,
      "id": <id>,
      "source": <source>
    }`,
  },
});millions-furniture-75402
08/05/2022, 9:09 PMmillions-furniture-75402
08/05/2022, 9:15 PM"I thought maybe I could run it from lambda, but that wasn’t working"This should work, what wasn't working?
victorious-memory-43562
08/05/2022, 9:49 PMERROR	CommandError: code: -2
 stdout: 
 stderr: 
 err?: Error: spawn pulumi ENOENT
    at Object.createCommandError (/var/task/node_modules/@pulumi/automation/errors.ts:73:21)
    at ChildProcess.<anonymous> (/var/task/node_modules/@pulumi/automation/cmd.ts:86:27)
    at ChildProcess.emit (events.js:400:28)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:283:12)
    at onErrorNT (internal/child_process.js:472:16)
    at processTicksAndRejections (internal/process/task_queues.js:82:21) {
  commandResult: CommandResult {
    stdout: '',
    stderr: '',
    code: -2,
    err: Error: spawn pulumi ENOENT
        at Process.ChildProcess._handle.onexit (internal/child_process.js:277:19)
        at onErrorNT (internal/child_process.js:472:16)
        at processTicksAndRejections (internal/process/task_queues.js:82:21) {
      errno: -2,
      code: 'ENOENT',
      syscall: 'spawn pulumi',
      path: 'pulumi',
      spawnargs: [Array]
    }
  }
}victorious-memory-43562
08/05/2022, 9:50 PMvictorious-memory-43562
08/05/2022, 9:51 PMmillions-furniture-75402
08/08/2022, 12:13 PMmillions-furniture-75402
08/08/2022, 12:15 PMmillions-furniture-75402
08/08/2022, 12:20 PMconst lambdaImage = containerRepository.buildAndPushImage({
  dockerfile: "lambda.Dockerfile",
  env: {
    DOCKER_BUILDKIT: "1",
  },
});
const lambdaFunctionApi = new aws.lambda.Function(
  `${appName}-api`,
  {
    imageUri: lambdaImage,
    imageConfig: { commands: ["lambdaApiHandler.handler"] },
    ...
  },
  { dependsOn: [applicationRole, lambdaImage] },
);
(lambda.Dockerfile example)
FROM public.ecr.aws/lambda/nodejs:16
ARG FUNCTION_DIR="/var/task"
RUN mkdir -p ${FUNCTION_DIR}
COPY dist/app ${FUNCTION_DIR}
COPY dist/lambda-layer/nodejs/node_modules ${FUNCTION_DIR}/node_modules
Lambda layer method:
const lambdaLayer = new aws.lambda.LayerVersion(`${appName}-lambda-layer`, {
  code: new pulumi.asset.FileArchive("./dist/lambda-layer"),
  compatibleRuntimes: [aws.lambda.NodeJS12dXRuntime],
  layerName: `${appName}-lambda-layer`,
});
const lambdaFunctionApi = new aws.lambda.Function(
  `${appName}-api`,
  {
    code: new pulumi.asset.FileArchive("./dist/app"),
    handler: "lambdaApiHandler.handler",
    layers: [lambdaLayer.arn],
    ...
  },
  { dependsOn: [applicationRole, lambdaLayer] },
);