Forked from nikaera/CloudFrontClientForMediaPackage.ts
Created
November 15, 2022 14:28
-
-
Save nathanagez/e8c33195e572b12c77a79f4ba3492379 to your computer and use it in GitHub Desktop.
CloudFront client for MediaPackage
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import { CloudFront } from "aws-sdk"; | |
| import * as url from "url"; | |
| import { CreateDistributionWithTagsResult, GetDistributionResult, UpdateDistributionResult } from "aws-sdk/clients/cloudfront"; | |
| export class CloudFrontClient { | |
| private cloudFront: CloudFront; | |
| constructor() { | |
| this.cloudFront = new CloudFront({ | |
| region: "ap-northeast-1", | |
| apiVersion: '2020-05-31', | |
| }); | |
| } | |
| async getDistribution(id: string): Promise<GetDistributionResult> { | |
| const distribution = await this.cloudFront.getDistribution({ | |
| Id: id | |
| }).promise() | |
| return distribution; | |
| } | |
| async getDistributionConfig(id: string): Promise<CloudFront.DistributionConfig> { | |
| const config = await this.cloudFront.getDistributionConfig({ | |
| Id: id | |
| }).promise() | |
| return config.DistributionConfig; | |
| } | |
| async deleteDistribution(id: string) { | |
| const distribution = await this.getDistribution(id); | |
| await this.cloudFront.deleteDistribution({ | |
| Id: id, IfMatch: distribution.ETag | |
| }).promise() | |
| } | |
| async disableDistribution(id: string): Promise<UpdateDistributionResult> { | |
| const distribution = await this.getDistribution(id); | |
| const config = distribution.Distribution.DistributionConfig; | |
| config.Enabled = false; | |
| return await this.cloudFront.updateDistribution({ | |
| Id: id, | |
| IfMatch: distribution.ETag, | |
| DistributionConfig: config | |
| }).promise(); | |
| } | |
| async createDistributionForMediaPackage( | |
| id: string, | |
| mediaPackageArn: string, | |
| mediaPackageUrl: string | |
| ): Promise<CreateDistributionWithTagsResult> { | |
| const mediaPackageEndpoint = url.parse(mediaPackageUrl); | |
| const mediaPackageHostname = mediaPackageEndpoint.hostname; | |
| const accountId = mediaPackageHostname.split('.')[0]; | |
| const targetOriginId = `MP-${accountId}` | |
| return await this.cloudFront.createDistributionWithTags({ | |
| DistributionConfigWithTags: { | |
| Tags: { | |
| Items: [ | |
| { | |
| Key: 'mediapackage:cloudfront_assoc', | |
| Value: mediaPackageArn | |
| }, | |
| { | |
| Key: 'Id', | |
| Value: id | |
| }, | |
| { | |
| Key: 'Product', | |
| Value: 'product' | |
| }, | |
| { | |
| Key: 'Stage', | |
| Value: 'dev' | |
| } | |
| ] | |
| }, | |
| DistributionConfig: { | |
| CallerReference: new Date().toISOString(), | |
| Comment: `Managed by MediaPackage - ${id}`, | |
| Enabled: true, | |
| Origins: { | |
| Items: [ | |
| { | |
| DomainName: mediaPackageHostname, | |
| Id: targetOriginId, | |
| CustomOriginConfig: { | |
| HTTPPort: 80, | |
| HTTPSPort: 443, | |
| OriginProtocolPolicy: 'match-viewer' | |
| } | |
| }, | |
| { | |
| DomainName: 'mediapackage.amazonaws.com', | |
| Id: "TEMP_ORIGIN_ID/channel", | |
| CustomOriginConfig: { | |
| HTTPPort: 80, | |
| HTTPSPort: 443, | |
| OriginProtocolPolicy: 'match-viewer' | |
| } | |
| } | |
| ], | |
| Quantity: 2 | |
| }, | |
| DefaultCacheBehavior: { | |
| ForwardedValues: { | |
| Cookies: { | |
| Forward: 'whitelist', | |
| WhitelistedNames: { | |
| Quantity: 3, | |
| Items: [ | |
| 'end', 'm', 'start' | |
| ] | |
| } | |
| }, | |
| QueryString: true, | |
| Headers: { | |
| Quantity: 0 | |
| }, | |
| QueryStringCacheKeys: { | |
| Quantity: 0 | |
| } | |
| }, | |
| MinTTL: 6, | |
| TargetOriginId: "TEMP_ORIGIN_ID/channel", | |
| TrustedSigners: { | |
| Enabled: false, | |
| Quantity: 0 | |
| }, | |
| ViewerProtocolPolicy: 'redirect-to-https', | |
| AllowedMethods: { | |
| Items: [ | |
| 'GET', 'HEAD' | |
| ], | |
| Quantity: 2, | |
| }, | |
| MaxTTL: 60 | |
| }, | |
| CustomErrorResponses: { | |
| Quantity: 10, | |
| Items: [ | |
| { | |
| ErrorCode: 400, | |
| ErrorCachingMinTTL: 1 | |
| }, { | |
| ErrorCode: 403, | |
| ErrorCachingMinTTL: 1 | |
| }, { | |
| ErrorCode: 404, | |
| ErrorCachingMinTTL: 1 | |
| }, { | |
| ErrorCode: 405, | |
| ErrorCachingMinTTL: 1 | |
| }, { | |
| ErrorCode: 414, | |
| ErrorCachingMinTTL: 1 | |
| }, { | |
| ErrorCode: 416, | |
| ErrorCachingMinTTL: 1 | |
| }, { | |
| ErrorCode: 500, | |
| ErrorCachingMinTTL: 1 | |
| }, { | |
| ErrorCode: 501, | |
| ErrorCachingMinTTL: 1 | |
| }, { | |
| ErrorCode: 502, | |
| ErrorCachingMinTTL: 1 | |
| }, { | |
| ErrorCode: 503, | |
| ErrorCachingMinTTL: 1 | |
| } | |
| ] | |
| }, | |
| CacheBehaviors: { | |
| Quantity: 2, | |
| Items: [{ | |
| MinTTL: 6, | |
| PathPattern: 'index.ism/*', | |
| TargetOriginId: targetOriginId, | |
| ViewerProtocolPolicy: 'redirect-to-https', | |
| AllowedMethods: { | |
| Items: [ | |
| 'GET', 'HEAD' | |
| ], | |
| Quantity: 2, | |
| }, | |
| ForwardedValues: { | |
| Cookies: { | |
| Forward: 'whitelist', | |
| WhitelistedNames: { | |
| Quantity: 3, | |
| Items: [ | |
| 'end', 'm', 'start' | |
| ] | |
| } | |
| }, | |
| QueryString: true, | |
| Headers: { | |
| Quantity: 0 | |
| }, | |
| QueryStringCacheKeys: { | |
| Quantity: 0 | |
| }, | |
| }, | |
| SmoothStreaming: true | |
| }, { | |
| MinTTL: 6, | |
| PathPattern: '*', | |
| TargetOriginId: targetOriginId, | |
| ViewerProtocolPolicy: 'redirect-to-https', | |
| AllowedMethods: { | |
| Items: [ | |
| 'GET', 'HEAD' | |
| ], | |
| Quantity: 2, | |
| }, | |
| ForwardedValues: { | |
| Cookies: { | |
| Forward: 'whitelist', | |
| WhitelistedNames: { | |
| Quantity: 3, | |
| Items: [ | |
| 'end', 'm', 'start' | |
| ] | |
| } | |
| }, | |
| QueryString: true, | |
| Headers: { | |
| Quantity: 0 | |
| }, | |
| QueryStringCacheKeys: { | |
| Quantity: 0 | |
| }, | |
| } | |
| }] | |
| }, | |
| PriceClass: 'PriceClass_All' | |
| } | |
| } | |
| }).promise() | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment