private createVideoConvertTaskAndRequiredResources()

in cdk/lib/partners/ACE.ts [82:174]


    private createVideoConvertTaskAndRequiredResources(dependenices: lambda.LayerVersion) {
        const mediaConvertRole = new iam.Role(this, "MediaConvertRole", {
            roleName: "MediaConvertRole",
            assumedBy: new iam.ServicePrincipal("mediaconvert.amazonaws.com")
        });

        mediaConvertRole.addToPolicy(new iam.PolicyStatement({
                effect: iam.Effect.ALLOW,
                actions: ["s3:*"],
                resources: [
                    this.sourceBucket.bucketArn, `${this.sourceBucket.bucketArn}/*`,
                    this.destinationBucket.bucketArn, `${this.destinationBucket.bucketArn}/*`
                ]
            })
        );

        const mediaConvertQueue = new CfnQueue(this, "MediaConvertQueue", {
            name: "SyndicationQueue",
            pricingPlan: "ON_DEMAND",
            status: "ACTIVE"
        });

        const jobTemplate = new CfnJobTemplate(this, "TranscodingJobTemplate", {
            description: `Job Template to transcode videos for Partner ${this.providerIdentifier}`,
            category: "GENERIC",
            name: `${this.providerIdentifier}-TranscodingJobTemplate`,
            settingsJson: {
                OutputGroups: [
                    {
                        Name: "File Group",
                        Outputs: [
                            {
                                Preset: "System-Generic_Hd_Mp4_Hev1_Aac_16x9_Sdr_1280x720p_30Hz_4Mbps_Qvbr_Vq9",
                                Extension: "mp4",
                                NameModifier: "_720p"
                            }
                        ],
                        OutputGroupSettings: {
                            Type: "FILE_GROUP_SETTINGS",
                            FileGroupSettings: {}
                        }
                    }
                ]
            },
            statusUpdateInterval: "SECONDS_10",
        });

        const videoLambda = new lambda.Function(this, "VideoLambdaFunction", {
            runtime: lambda.Runtime.NODEJS_12_X,
            timeout: Duration.seconds(30),
            handler: "provider-ace.ProcessVideos",
            layers: [dependenices],
            code: lambda.Code.fromAsset(path.join(__dirname, "..", "..", "..", "src", "handlers")),
            environment: {
                JOB_TEMPLATE_NAME: jobTemplate.attrName,
                OUTPUT_BUCKET_NAME: this.destinationBucket.bucketName,
                MEDIA_CONVERT_ROLE_ARN: mediaConvertRole.roleArn,
                MEDIA_CONVERT_QUEUE_ARN: mediaConvertQueue.attrArn,
                MEDIA_CONVERT_ENDPOINT_URL: this.mediaConvertEndpointURL,
            }
        });

        const videoLambdaTask = new tasks.LambdaInvoke(this, `${this.providerIdentifier}-Video`, {
            lambdaFunction: videoLambda,
            payload: TaskInput.fromObject({
                "token": JsonPath.taskToken,
                "bucketName.$": "$.Video.bucketName",
                "objectKey.$": "$.Video.objectKey",
                "assetId.$": "$.AssetId"
            }),
            integrationPattern: IntegrationPattern.WAIT_FOR_TASK_TOKEN
        });

        videoLambda.addToRolePolicy(new iam.PolicyStatement({
            effect: iam.Effect.ALLOW,
            actions: ["iam:PassRole"],
            resources: [mediaConvertRole.roleArn]
        }));

        videoLambda.addToRolePolicy(new iam.PolicyStatement({
            effect: iam.Effect.ALLOW,
            actions: ["mediaconvert:CreateJob"],
            resources: [mediaConvertQueue.attrArn, jobTemplate.attrArn]
        }));

        videoLambda.addToRolePolicy(new iam.PolicyStatement({
            effect: iam.Effect.ALLOW,
            actions: ["mediaconvert:DescribeEndpoints"],
            resources: ["*"]
        }));

        return videoLambdaTask;
    }