function makeApiEndpointLambdas()

in lib/cdk-stack.ts [156:365]


function makeApiEndpointLambdas(
  scope: cdk.Construct,
  id: string,
  props: makeApiEndpointLambdasProps
): podcastHandlers {
  const listPodcastsId = id + 'ListPodcasts';
  const getPodcastId = id + 'GetPodcast';
  const playPodcastId = id + 'PlayPodcast';

  const commonProps = {
    environment: {
      [ENV_KEY_TRANSCRIBE_STATEMACHINE_ARN]:
        props.transcribeStateMachine.stateMachineArn,
      [ENV_KEY_PODCAST_EPISODE_TABLE_NAME]: props.podcastEpisodeTable.tableName,
      [ENV_KEY_PODCAST_DATA_BUCKET_NAME]: props.podcastBucket.bucketName,
      ...commonStaticLambdaEnvs,
    },
    memorySize: 1024,
    timeout: cdk.Duration.seconds(60),
  };

  // Lambda handler implementations common across all languages
  const addPodcastFn = new lambda.Function(scope, id + 'AddPodcast', {
    runtime: lambda.Runtime.GO_1_X,
    handler: 'main',
    code: lambda.Code.fromAsset('lambda/go/add-podcasts'),
    ...commonProps,
  });

  let handlers: podcastHandlers;
  switch (props.workshopLanguage) {
    case WorkshopLanguage.Go:
      handlers = {
        // Common handlers
        addPodcastFn: addPodcastFn,

        // language specific handlers
        listPodcastsFn: new lambda.Function(scope, listPodcastsId, {
          runtime: lambda.Runtime.GO_1_X,
          handler: 'main',
          code: lambda.Code.fromAsset('lambda/go/list-podcasts'),
          ...commonProps,
        }),
        getPodcastFn: new lambda.Function(scope, getPodcastId, {
          runtime: lambda.Runtime.GO_1_X,
          handler: 'main',
          code: lambda.Code.fromAsset('lambda/go/get-podcast'),
          ...commonProps,
        }),
        playPodcastFn: new lambda.Function(scope, playPodcastId, {
          runtime: lambda.Runtime.GO_1_X,
          handler: 'main',
          code: lambda.Code.fromAsset('lambda/go/play-podcast'),
          ...commonProps,
        }),
      };
      break;

    case WorkshopLanguage.Python:
      handlers = {
        // Common handlers
        addPodcastFn: addPodcastFn,

        // language specific handlers
        listPodcastsFn: new lambda.Function(scope, listPodcastsId, {
          runtime: lambda.Runtime.PYTHON_3_8,
          handler: 'list_podcasts.lambda_handler',
          code: lambda.Code.fromAsset('lambda/python'),
          ...commonProps,
        }),
        getPodcastFn: new lambda.Function(scope, getPodcastId, {
          runtime: lambda.Runtime.PYTHON_3_8,
          handler: 'get_podcast.lambda_handler',
          code: lambda.Code.fromAsset('lambda/python'),
          ...commonProps,
        }),
        playPodcastFn: new lambda.Function(scope, playPodcastId, {
          runtime: lambda.Runtime.PYTHON_3_8,
          handler: 'play_podcast.lambda_handler',
          code: lambda.Code.fromAsset('lambda/python'),
          ...commonProps,
        }),
      };
      break;

    case WorkshopLanguage.Java:
      handlers = {
        // Common handlers
        addPodcastFn: addPodcastFn,

        // language specific handlers
        listPodcastsFn: new lambda.Function(scope, listPodcastsId, {
          runtime: lambda.Runtime.JAVA_11,
          handler: 'com.amazonaws.workshop.ListPodcasts::handleRequest',
          code: lambda.Code.fromAsset('lambda/java'),
          ...commonProps,
        }),
        getPodcastFn: new lambda.Function(scope, getPodcastId, {
          runtime: lambda.Runtime.JAVA_11,
          handler: 'com.amazonaws.workshop.GetPodcast::handleRequest',
          code: lambda.Code.fromAsset('lambda/java'),
          ...commonProps,
        }),
        playPodcastFn: new lambda.Function(scope, playPodcastId, {
          runtime: lambda.Runtime.JAVA_11,
          handler: 'com.amazonaws.workshop.PlayPodcast::handleRequest',
          code: lambda.Code.fromAsset('lambda/java'),
          ...commonProps,
        }),
      };
      break;

    case WorkshopLanguage.Javascript:
      handlers = {
        // Common handlers
        addPodcastFn: addPodcastFn,

        // language specific handlers
        listPodcastsFn: new lambda_nodejs.NodejsFunction(scope, listPodcastsId, {
          entry: 'lambda/javascript/list-podcasts.js',
          bundling: getNodejsBundlingOptions(listPodcastsId),
          ...commonProps,
        }),
        getPodcastFn: new lambda_nodejs.NodejsFunction(scope, getPodcastId, {
          entry: 'lambda/javascript/get-podcast.js',
          bundling: getNodejsBundlingOptions(getPodcastId),
          ...commonProps,
        }),
        playPodcastFn: new lambda_nodejs.NodejsFunction(scope, playPodcastId, {
          entry: 'lambda/javascript/play-podcast.js',
          bundling: getNodejsBundlingOptions(playPodcastId),
          ...commonProps,
        }),
      };
      break;

    default:
      throw new Error(`unknown workshop language, ${props.workshopLanguage}`);
  }

  //------------------------------
  // List Podcast
  //------------------------------
  handlers.listPodcastsFn.addToRolePolicy(
    iamUtils.makePolicyStatement({
      effect: iam.Effect.ALLOW,
      actions: ['dynamodb:Scan'],
      resources: [props.podcastEpisodeTable.tableArn],
    })
  );

  //------------------------------
  // Add Podcast
  //------------------------------
  handlers.addPodcastFn.addToRolePolicy(
    iamUtils.makePolicyStatement({
      effect: iam.Effect.ALLOW,
      actions: ['states:StartExecution'],
      resources: [props.transcribeStateMachine.stateMachineArn],
    })
  );
  handlers.addPodcastFn.addToRolePolicy(
    iamUtils.makePolicyStatement({
      effect: iam.Effect.ALLOW,
      actions: [
        'dynamodb:BatchGetItem',
        'dynamodb:BatchWriteItem',
        'dynamodb:UpdateItem',
      ],
      resources: [props.podcastEpisodeTable.tableArn],
    })
  );

  //------------------------------
  // Get Podcasts
  //------------------------------
  if (handlers.getPodcastFn.role) {
    props.podcastEpisodeTable.grantReadData(handlers.getPodcastFn.role);
  }

  //------------------------------
  // Play Podcast
  //------------------------------
  handlers.playPodcastFn.addToRolePolicy(
    iamUtils.makePolicyStatement({
      effect: iam.Effect.ALLOW,
      actions: ['dynamodb:GetItem'],
      resources: [props.podcastEpisodeTable.tableArn],
    })
  );
  handlers.playPodcastFn.addToRolePolicy(
    iamUtils.makePolicyStatement({
      effect: iam.Effect.ALLOW,
      actions: [
        's3:AbortMultipartUpload',
        's3:GetBucketLocation',
        's3:GetObject',
        's3:ListBucket',
        's3:ListBucketMultipartUploads',
        's3:PutObject',
      ],
      resources: [
        props.podcastBucket.bucketArn,
        props.podcastBucket.bucketArn + '/*',
      ],
    })
  );

  return handlers;
}