Created
December 12, 2020 09:27
-
-
Save nikaera/d9d616a089998ff2d23b210faf3a85c3 to your computer and use it in GitHub Desktop.
CloudFront client for MediaPackage
This file contains 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