aws-spa
Version:
A no-brainer script to deploy a single page app on AWS
123 lines (100 loc) • 4.43 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.websiteEndpoint = exports.waitUntil = exports.s3 = exports.route53 = exports.lambda = exports.iam = exports.getS3DomainNameForBlockedBucket = exports.getS3DomainName = exports.getOriginId = exports.cloudfront = exports.bucketRegion = exports.acm = void 0;
var _clientAcm = require("@aws-sdk/client-acm");
var _clientCloudfront = require("@aws-sdk/client-cloudfront");
var _clientIam = require("@aws-sdk/client-iam");
var _clientLambda = require("@aws-sdk/client-lambda");
var _clientRoute = require("@aws-sdk/client-route-53");
var _clientS = require("@aws-sdk/client-s3");
var _logger = require("./logger");
// Bucket region must be fixed so that website endpoint is fixe
// https://docs.aws.amazon.com/fr_fr/general/latest/gr/s3.html
const bucketRegion = 'eu-west-3';
exports.bucketRegion = bucketRegion;
const s3 = new _clientS.S3({
region: bucketRegion
});
exports.s3 = s3;
const lambda = new _clientLambda.Lambda({
region: 'us-east-1'
});
exports.lambda = lambda;
const iam = new _clientIam.IAM({
region: 'us-east-1'
}); // cloudfront certificates must be in us-east-1
exports.iam = iam;
const acm = new _clientAcm.ACM({
region: 'us-east-1'
});
exports.acm = acm;
const cloudfront = new _clientCloudfront.CloudFront();
exports.cloudfront = cloudfront;
const route53 = new _clientRoute.Route53(); // S3 API does not seem to expose this data
// https://docs.aws.amazon.com/fr_fr/general/latest/gr/s3.html
exports.route53 = route53;
const websiteEndpoint = {
'us-east-2': 's3-website.us-east-2.amazonaws.com',
'us-east-1': 's3-website-us-east-1.amazonaws.com',
'us-west-1': 's3-website-us-west-1.amazonaws.com',
'us-west-2': 's3-website-us-west-2.amazonaws.com',
'ap-south-1': 's3-website.ap-south-1.amazonaws.com',
'ap-northeast-3': 's3-website.ap-northeast-3.amazonaws.com',
'ap-northeast-2': 's3-website.ap-northeast-2.amazonaws.com',
'ap-southeast-1': 's3-website-ap-southeast-1.amazonaws.com',
'ap-southeast-2': 's3-website-ap-southeast-2.amazonaws.com',
'ap-northeast-1': 's3-website-ap-northeast-1.amazonaws.com',
'ca-central-1': 's3-website.ca-central-1.amazonaws.com',
'cn-northwest-1': 's3-website.cn-northwest-1.amazonaws.com.cn',
'eu-central-1': 's3-website.eu-central-1.amazonaws.com',
'eu-west-1': 's3-website-eu-west-1.amazonaws.com',
'eu-west-2': 's3-website.eu-west-2.amazonaws.com',
'eu-west-3': 's3-website.eu-west-3.amazonaws.com',
'eu-north-1': 's3-website.eu-north-1.amazonaws.com',
'sa-east-1': 's3-website-sa-east-1.amazonaws.com'
};
exports.websiteEndpoint = websiteEndpoint;
const getS3DomainNameForBlockedBucket = domainName => `${domainName}.s3.${bucketRegion}.amazonaws.com`;
exports.getS3DomainNameForBlockedBucket = getS3DomainNameForBlockedBucket;
const getS3DomainName = domainName => `${domainName}.${websiteEndpoint[bucketRegion]}`;
exports.getS3DomainName = getS3DomainName;
const getOriginId = domainName => `S3-Website-${getS3DomainName(domainName)}`; // re-implement aws-sdk's waitUntilDistributionDeployed() because the aws-sdk one is bugged
exports.getOriginId = getOriginId;
const waitUntilDistributionDeployed = async (params, distribution) => {
return new Promise((resolve, reject) => {
const timeout = setTimeout(() => {
clearInterval(interval);
reject(new Error(`[CloudFront] ❌ Distribution not deployed after ${params.maxWaitTime} seconds`));
}, params.maxWaitTime * 1000);
const interval = setInterval(async () => {
try {
const {
Distribution
} = await params.client.getDistribution({
Id: distribution.Id
});
if (!Distribution) {
return;
}
_logger.logger.info(`[CloudFront] 🔄 Checking distribution status: ${Distribution.Id} has status ${Distribution.Status}`);
if (Distribution.Status === 'Deployed') {
clearInterval(interval);
clearTimeout(timeout);
resolve(Distribution);
}
} catch (error) {
clearInterval(interval);
clearTimeout(timeout);
reject(error);
}
}, 10000);
});
};
const waitUntil = {
distributionDeployed: waitUntilDistributionDeployed,
certificateValidated: _clientAcm.waitUntilCertificateValidated,
invalidationCompleted: _clientCloudfront.waitUntilInvalidationCompleted
};
exports.waitUntil = waitUntil;