node.jsamazon-web-servicesaws-lambdaaws-mediapackage

Injecting media to AWS MediaPackage from lambda function


I am trying to deliver hls media from a lambda function using nodejs to an AWS MediaPackage input endpoint. I am doing the following and seems to be pushing the media file chunks (ts files):

  const auth = 'Basic ' + Buffer.from(endpoints[0].Username + ':' + endpoints[0].Password).toString('base64');
  const options = {
    hostname: endpoints[0].Url.hostname,
    path: endpoints[0].Url.path,
    headers: {
      'Content-Type': 'application/json',
      'Authorization': auth,
      'Content-Length': Buffer.byteLength(data.Body)
    },
    body: data.Body // body of ts file
  };
  console.log(options);

  const res = await httpsPut(options); //Promise using https put to send the body in options

However, I don't see any logs in CloudWatch to the MediaPackage Channel

Is this the right way to send inject media to MediaPackage? I couldn't find any documentation

Thanks,


Solution

  • Well, I finally got it working following the documentation and doing a bit of try and error. In this MediaPackage documentation they mention that it only supports webdav auth so I ended up using a webdav module to handle the puts of files.

    Assuming you are passing valid inputs, the working solution ended up looking like this:

    /**
     * Helper PUT with Webdav and digest authentication to AWS MediaPackage
     * @param mediaPackageEndpoints
     * @param fileName
     * @param data
     */
    const putToMediaPackage = async function(mediaPackageEndpoints, fileName, data) {
      const url = new URL(mediaPackageEndpoints[0].Url);
      const client = createClient(
        url.toString().replace('/channel', ''),
        {
          username: mediaPackageEndpoints[0].Username,
          password: mediaPackageEndpoints[0].Password,
          digest: true
        }
      );
    
      await client.putFileContents(fileName, data);
      return client;
    }