packages/deploy-aws/src/aws_sdk_handler/handle_acm.ts
import { ACM, config } from 'aws-sdk'
import { findAliasConfig } from '../lib'
export async function checkForAliasConfig(pkgJson: any, handler: ACMHandler) {
const domains: string[] = pkgJson.seagull && pkgJson.seagull.domains
const needAliases = domains && domains.length > 0
return needAliases ? await getAliasConfig(domains, handler) : undefined
}
async function getAliasConfig(domains: string[], handler: ACMHandler) {
const arns = await handler.listCertificates()
const getArnDomains = async (arn: string) => getCertDomains(arn, handler)
const arnsWithSchemata = await Promise.all(arns.map(getArnDomains))
return findAliasConfig(arnsWithSchemata, domains)
}
async function getCertDomains(acmCertRef: string, handler: ACMHandler) {
return { acmCertRef, names: await handler.describeCertificate(acmCertRef) }
}
export class ACMHandler {
private acm: ACM
constructor() {
const credentials = config.credentials
this.acm = new ACM({ credentials, region: 'us-east-1' })
}
async listCertificates() {
const params = { CertificateStatuses: ['ISSUED'] }
const response = await this.acm.listCertificates(params).promise()
const certSumList = (response && response.CertificateSummaryList) || []
const arns = certSumList.map(certSum => certSum && certSum.CertificateArn)
return arns.filter(arn => arn !== undefined) as string[]
}
async describeCertificate(acmCertRef: string) {
const params = { CertificateArn: acmCertRef }
const description = await this.acm.describeCertificate(params).promise()
const cert = description.Certificate
return (cert && cert.SubjectAlternativeNames) || []
}
}