in lib/media-capture-demo.ts [13:159]
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const meetingsTable = new dynamodb.Table(this, "meetings", {
partitionKey: {
name: "Title",
type: dynamodb.AttributeType.STRING,
},
removalPolicy: cdk.RemovalPolicy.DESTROY,
timeToLiveAttribute: "TTL",
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
});
meetingsTable.addGlobalSecondaryIndex({
indexName: "meetingIdIndex",
partitionKey: {
name: "meetingId",
type: dynamodb.AttributeType.STRING,
},
projectionType: dynamodb.ProjectionType.ALL,
});
const mediaCaptureBucket = new s3.Bucket(this, "mediaCaptureBucket", {
publicReadAccess: false,
removalPolicy: cdk.RemovalPolicy.DESTROY,
autoDeleteObjects: true,
});
const mediaCaptureBucketPolicy = new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: ["s3:PutObject", "s3:PutObjectAcl"],
resources: [
mediaCaptureBucket.bucketArn,
`${mediaCaptureBucket.bucketArn}/*`,
],
sid: "AWSChimeMediaCaptureBucketPolicy",
});
mediaCaptureBucketPolicy.addServicePrincipal("chime.amazonaws.com");
mediaCaptureBucket.addToResourcePolicy(mediaCaptureBucketPolicy);
const lambdaChimeRole = new iam.Role(this, "LambdaChimeRole", {
assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"),
});
lambdaChimeRole.addToPolicy(
new iam.PolicyStatement({
resources: ["*"],
actions: ["chime:*"],
})
);
lambdaChimeRole.addManagedPolicy(
iam.ManagedPolicy.fromAwsManagedPolicyName(
"service-role/AWSLambdaBasicExecutionRole"
)
);
const sdkBucket = s3.Bucket.fromBucketName(
this,
"amazon-chime-blog-assets",
"amazon-chime-blog-assets"
);
const createLambda = new NodejsFunction(this, "createLambda", {
entry: "src/createLambda/create.js",
depsLockFilePath: "src/createLambda/package-lock.json",
bundling: {
externalModules: ["aws-sdk"],
nodeModules: ["uuid"],
},
runtime: lambda.Runtime.NODEJS_14_X,
timeout: Duration.seconds(60),
environment: {
MEETINGS_TABLE_NAME: meetingsTable.tableName,
},
role: lambdaChimeRole,
});
meetingsTable.grantReadWriteData(createLambda);
const recordingLambda = new NodejsFunction(this, "recordingLambda", {
entry: "src/recordingLambda/recording.js",
depsLockFilePath: "src/recordingLambda/package-lock.json",
bundling: {
externalModules: ["aws-sdk"],
nodeModules: ["uuid"],
},
runtime: lambda.Runtime.NODEJS_14_X,
role: lambdaChimeRole,
timeout: Duration.seconds(60),
environment: {
MEDIA_CAPTURE_BUCKET: mediaCaptureBucket.bucketName,
ACCOUNT_ID: cdk.Aws.ACCOUNT_ID,
},
});
mediaCaptureBucket.grantReadWrite(recordingLambda);
const processLambda = new lambda.DockerImageFunction(this, "proces", {
code: lambda.DockerImageCode.fromImageAsset("src/processLambda", {
cmd: ["app.handler"],
entrypoint: ["/entry.sh"],
}),
environment: {
MEDIA_CAPTURE_BUCKET: mediaCaptureBucket.bucketName,
MEETINGS_TABLE_NAME: meetingsTable.tableName,
},
timeout: Duration.minutes(15),
memorySize: 10240,
});
meetingsTable.grantReadWriteData(processLambda);
mediaCaptureBucket.grantReadWrite(processLambda);
const processOutputRule = new events.Rule(this, "processRecordingRule", {
eventPattern: {
source: ["aws.chime"],
detailType: ["Chime Media Pipeline State Change"],
detail: {
eventType: ["chime:MediaPipelineDeleted"],
},
},
});
processOutputRule.addTarget(new targets.LambdaFunction(processLambda));
const api = new apigateway.RestApi(this, "meetingApi", {
endpointConfiguration: {
types: [apigateway.EndpointType.REGIONAL],
},
});
const apiURL = new cdk.CfnOutput(this, "apiURL", {
value: api.url,
});
const create = api.root.addResource("create");
const createIntegration = new apigateway.LambdaIntegration(createLambda);
create.addMethod("POST", createIntegration);
addCorsOptions(create);
const record = api.root.addResource("record");
const recordIntegration = new apigateway.LambdaIntegration(recordingLambda);
record.addMethod("POST", recordIntegration);
addCorsOptions(record);
}