UNPKG

aws-spa

Version:

A no-brainer script to deploy a single page app on AWS

123 lines (100 loc) 4.43 kB
"use strict"; 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;