Skip to content

02 Bucket Queue Event Bus

JP Barbosa edited this page Sep 11, 2022 · 11 revisions

Bucket, Queue, and Event Bus

Bucket

code ./stacks/resources/bucket.ts
import { Bucket, Stack } from "@serverless-stack/resources";

export const createBucket = (stack: Stack) =>
  new Bucket(stack, "bucket", {
    cors: true,
    cdk: {
      bucket: {
        eventBridgeEnabled: true,
      },
    },
  });

Queue

code ./stacks/resources/queue.ts
import { Queue, Stack, Table, Bucket } from "@serverless-stack/resources";
import { PolicyStatement } from "aws-cdk-lib/aws-iam";

type CreateQueueOptions = { bucket: Bucket; table: Table };

type CreateQueue = (stack: Stack, options: CreateQueueOptions) => Queue;

export const createQueue: CreateQueue = (stack: Stack, { bucket, table }) => {
  const queuePolicy = new PolicyStatement({
    actions: ["rekognition:*"],
    resources: ["*"],
  });

  const queue = new Queue(stack, "queue", {
    consumer: {
      function: {
        handler: "functions/process.handler",
        initialPolicy: [queuePolicy],
        environment: {
          table: table.tableName,
        },
      },
    },
  });

  queue.attachPermissions([table, bucket]);

  return queue;
};

Event Bus

code ./stacks/resources/bus.ts
import { Bucket, EventBus, Queue, Stack } from "@serverless-stack/resources";
import * as events from "aws-cdk-lib/aws-events";

type CreateBusOptions = { bucket: Bucket; queue: Queue };

type CreateBus = (stack: Stack, options: CreateBusOptions) => EventBus;

export const createBus: CreateBus = (stack: Stack, { bucket, queue }) =>
  new EventBus(stack, "bus", {
    cdk: {
      eventBus: events.EventBus.fromEventBusName(
        stack,
        "ImportedBus",
        "default"
      ),
    },
    rules: {
      rule1: {
        pattern: {
          source: ["aws.s3"],
          detailType: ["Object Created"],
          detail: {
            bucket: {
              name: [bucket.bucketName],
            },
          },
        },
        targets: {
          process: queue,
        },
      },
    },
  });

Update stack

./stacks/MyStack.ts
import { StackContext } from "@serverless-stack/resources";
import {
  createBucket,
  createQueue,
  createBus,
} from "./resources";

export function MyStack({ stack }: StackContext) {
  const bucket = createBucket(stack);
  const queue = createQueue(stack, { bucket, table });
  const bus = createBus(stack, { bucket, queue });
}
Clone this wiki locally