UNPKG

mira

Version:

NearForm Accelerator for Cloud Native Serverless AWS

90 lines (77 loc) 3.56 kB
import { CfnOutput, Construct, Duration } from '@aws-cdk/core' import { Topic } from '@aws-cdk/aws-sns' import { SingletonFunction, Runtime, AssetCode } from '@aws-cdk/aws-lambda' import { FollowMode } from '@aws-cdk/assets' import { SnsEventSource } from '@aws-cdk/aws-lambda-event-sources' import { AccountPrincipal, Effect, ManagedPolicy, PolicyStatement, Role, ServicePrincipal } from '@aws-cdk/aws-iam' import { MiraStack } from '../../../stack' import { MiraConfig } from '../../../../config/mira-config' // interface CertificateManagerProps { // readonly environment: string // } import path from 'path' export class CertificateManager extends MiraStack { // constructor (parent: Construct, props: CertificateManagerProps) { constructor (parent: Construct) { const id = MiraConfig.getBaseStackName('CertificateManager') super(parent, id) const account = MiraConfig.getEnvironment() const { hostedZoneId } = MiraConfig.getDomainConfig() if (!hostedZoneId) { throw new Error('Cannot find hostedZoneId in config.') } const allowedPrincipals = MiraConfig.getDomainAllowedPrincipals().map(account => new AccountPrincipal(account.env.account)) const code = new AssetCode(path.join(__dirname, '..', '..', '..', '..', 'lambdas'), { follow: FollowMode.ALWAYS }) const DomainManagerRole = new Role(this, 'Route53ManagerRole', { assumedBy: new ServicePrincipal('lambda.amazonaws.com') }) DomainManagerRole.addToPolicy(new PolicyStatement({ effect: Effect.ALLOW, resources: [`arn:aws:route53:::hostedzone/${hostedZoneId}`], actions: ['route53:ChangeResourceRecordSets'] })) DomainManagerRole.addToPolicy(new PolicyStatement({ effect: Effect.ALLOW, resources: ['*'], actions: ['acm:RequestCertificate', 'acm:DescribeCertificate', 'acm:DeleteCertificate', 'acm:ListCertificates'] })) DomainManagerRole.addToPolicy(new PolicyStatement({ effect: Effect.ALLOW, resources: ['*'], actions: ['route53:GetChange'] })) DomainManagerRole.addToPolicy(new PolicyStatement({ effect: Effect.ALLOW, resources: [`arn:aws:iam::${account.env.account}:role/${MiraConfig.getBaseStackName('DomainManager-Role')}`], // arn:aws:iam::714436996402:role/Piotrzimoch-Mira-DomainManager-Role actions: ['sts:AssumeRole'] })) DomainManagerRole.addManagedPolicy(ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole')) const certificateSubscriptionTopic = new Topic(this, 'CertificateSubscriptionTopic', { displayName: 'Certificate Subscription Topic', topicName: MiraConfig.getBaseStackName('CertificateSubscriptionTopic') }) certificateSubscriptionTopic.addToResourcePolicy(new PolicyStatement({ principals: allowedPrincipals, effect: Effect.ALLOW, resources: [certificateSubscriptionTopic.topicArn], actions: ['sns:Publish'] })) const CertificateManagerLambda = new SingletonFunction(this, 'CertificateManagerLambda', { code, handler: 'certificate-manager.handler', runtime: Runtime.NODEJS_10_X, timeout: Duration.minutes(15), uuid: 'dfb3da1c-591a-4225-a327-d56a74823a5e', environment: { HOSTED_ZONE: hostedZoneId }, role: DomainManagerRole }) CertificateManagerLambda.addEventSource(new SnsEventSource(certificateSubscriptionTopic)) new CfnOutput(this, 'certificateSubscriptionTopicArn', { value: certificateSubscriptionTopic.topicArn }) } }