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;
}