@bitblit/ratchet-epsilon-deployment 4.0.354-alpha → 4.0.355-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{Stack as e,Duration as t,Size as o,Lazy as s}from"aws-cdk-lib";import{DockerImageCode as a,DockerImageFunction as i,FunctionUrlAuthType as r,HttpMethod as n}from"aws-cdk-lib/aws-lambda";import{PolicyStatement as c,Effect as m,Role as l,ServicePrincipal as d,ManagedPolicy as u,PolicyDocument as p}from"aws-cdk-lib/aws-iam";import{Topic as b}from"aws-cdk-lib/aws-sns";import{Queue as f}from"aws-cdk-lib/aws-sqs";import{LambdaSubscription as S}from"aws-cdk-lib/aws-sns-subscriptions";import{Rule as L,Schedule as w}from"aws-cdk-lib/aws-events";import{LambdaFunction as A}from"aws-cdk-lib/aws-events-targets";import{DockerImageAsset as h}from"aws-cdk-lib/aws-ecr-assets";import{StringRatchet as g,ErrorRatchet as E}from"@bitblit/ratchet-common";import{FargateComputeEnvironment as N,JobQueue as _,EcsFargateContainerDefinition as O,EcsJobDefinition as I}from"aws-cdk-lib/aws-batch";import{Vpc as T,Subnet as P,SecurityGroup as C}from"aws-cdk-lib/aws-ec2";import{ContainerImage as k}from"aws-cdk-lib/aws-ecs";import{Bucket as y,BucketEncryption as v}from"aws-cdk-lib/aws-s3";import R from"path";import{OriginAccessIdentity as D,OriginProtocolPolicy as B,CloudFrontAllowedMethods as W,CloudFrontAllowedCachedMethods as H,HttpVersion as G,PriceClass as M,ViewerProtocolPolicy as F,CloudFrontWebDistribution as U}from"aws-cdk-lib/aws-cloudfront";import{RecordSet as x,RecordType as V,HostedZone as z}from"aws-cdk-lib/aws-route53";import{CloudFrontTarget as j}from"aws-cdk-lib/aws-route53-targets";import{BucketDeployment as J,Source as Q}from"aws-cdk-lib/aws-s3-deployment";class q{constructor(){}static buildInformation(){return{version:"354",hash:"7b24f210d77b3bafbf3ab4eb103e97300936178a",branch:"alpha-2024-05-12-17",tag:"alpha-2024-05-12-17",timeBuiltISO:"2024-05-12T23:14:35-0700",notes:"No notes"}}}var $;!function(e){e.WebLambda="WebLambda",e.BackgroundLambda="BackgroundLambda",e.AwsBatchHandler="AwsBatchHandler"}($||($={}));class K{constructor(){}static toEnvironmentVariables(e){const t={};return e.forEach((e=>{Object.keys(e).forEach((o=>{t[o]=g.safeString(e[o])}))})),t}static createDefaultPolicyStatementList(e,t,o,s){return(e.additionalPolicyStatements||[]).concat([new c({effect:m.ALLOW,actions:["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],resources:["arn:aws:logs:*:*:*"]}),new c({effect:m.ALLOW,actions:["ses:SendEmail","ses:SendRawEmail"],resources:["arn:aws:ses:*"]}),new c({effect:m.ALLOW,actions:["sqs:*"],resources:[t.queueArn]}),new c({effect:m.ALLOW,actions:["sns:*"],resources:[o.topicArn,s.topicArn]}),new c({effect:m.ALLOW,actions:["batch:*"],resources:["*"]})])}static ALLOW_ECS=new c({effect:m.ALLOW,actions:["ecs:*"],resources:["*"]});static ALLOW_ECR=new c({effect:m.ALLOW,actions:["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer","ecr:GetAuthorizationToken"],resources:["*"]});static ALLOW_RESTRICTED_LOGS=new c({effect:m.ALLOW,actions:["logs:CreateLogStream","logs:PutLogEvents","logs:DescribeLogStreams","logs:CreateLogGroup"],resources:["*"]});static ALLOW_FARGATE_SECRET_READING=[new c({effect:m.ALLOW,actions:["ssm:GetParameters"],resources:["*"]}),new c({effect:m.ALLOW,actions:["secretsmanager:GetSecretValue"],resources:["*"]}),new c({effect:m.ALLOW,actions:["kms:Decrypt"],resources:["*"]})];static ECS_POLICY_STATEMENTS=[K.ALLOW_ECS,K.ALLOW_ECR,K.ALLOW_RESTRICTED_LOGS].concat(K.ALLOW_FARGATE_SECRET_READING)}class Y extends e{webHandler;backgroundHandler;apiDomain;constructor(c,m,E){super(c,m,E);const y=E?.disabledFeatures||[],v=T.fromLookup(this,"Vpc",{vpcId:E.vpcId}),R={subnets:E.vpcPrivateSubnets.map(((e,t)=>P.fromSubnetAttributes(this,`VpcPrivateSubnet${t}`,e)))};E.vpcPublicSubnets.map(((e,t)=>P.fromSubnetAttributes(this,`VpcPublicSubnet${t}`,e)));const D=E.lambdaSecurityGroupIds.map(((e,t)=>C.fromSecurityGroupId(this,`SecurityGroup${t}`,`sg-${e}`))),B=new h(this,m+"DockerImage",{directory:E.dockerFileFolder,file:E.dockerFileName}),W=a.fromImageAsset(E.dockerFileFolder,{file:E.dockerFileName}),H=new b(this,m+"WorkNotificationTopic"),G=new f(this,m+"WorkQueue",{fifo:!0,retentionPeriod:t.hours(8),visibilityTimeout:t.minutes(5),contentBasedDeduplication:!0,...E}),M=new b(this,m+"InterApiTopic"),F={EPSILON_AWS_REGION:g.safeString(e.of(this).region),EPSILON_AWS_AVAILABILITY_ZONES:g.safeString(JSON.stringify(e.of(this).availabilityZones)),EPSILON_BACKGROUND_SQS_QUEUE_URL:g.safeString(G.queueUrl),EPSILON_BACKGROUND_SNS_TOPIC_ARN:g.safeString(H.topicArn),EPSILON_INTER_API_EVENT_TOPIC_ARN:g.safeString(M.topicArn),EPSILON_LIB_BUILD_HASH:g.safeString(q.buildInformation().hash),EPSILON_LIB_BUILD_TIME:g.safeString(q.buildInformation().timeBuiltISO),EPSILON_LIB_BUILD_BRANCH_OR_TAG:g.safeString(q.buildInformation().branch||q.buildInformation().tag),EPSILON_LIB_BUILD_VERSION:g.safeString(q.buildInformation().version)},U=Object.assign({},E.extraEnvironmentalVars||{},F);if(!y.includes($.AwsBatchHandler)){const e=new l(this,m+"BatchExecutionRole",{assumedBy:new d("ecs-tasks.amazonaws.com"),managedPolicies:[u.fromAwsManagedPolicyName("service-role/AWSLambdaVPCAccessExecutionRole")],inlinePolicies:{root:new p({statements:K.ECS_POLICY_STATEMENTS})}}),s=new l(this,m+"BatchJobRole",{assumedBy:new d("ecs-tasks.amazonaws.com"),managedPolicies:[u.fromAwsManagedPolicyName("service-role/AWSLambdaVPCAccessExecutionRole")],inlinePolicies:{root:new p({statements:K.createDefaultPolicyStatementList(E,G,H,M)})}}),a={vpc:v,computeEnvironmentName:m+"ComputeEnv",enabled:!0,maxvCpus:16,replaceComputeEnvironment:!1,securityGroups:D,serviceRole:l.fromRoleArn(this,`${m}ServiceRole`,"arn:aws:iam::"+E.env.account+":role/AWSBatchServiceRole"),spot:!1,terminateOnUpdate:!1,updateTimeout:t.hours(4),updateToLatestImageVersion:!0,vpcSubnets:R},i=new N(this,m+"ComputeEnv",a),r=new _(this,m+"BatchJobQueue",{computeEnvironments:[{order:1,computeEnvironment:i}],enabled:!0,jobQueueName:m+"BatchJobQueue",priority:10,schedulingPolicy:void 0}),n=K.toEnvironmentVariables([U,E.extraEnvironmentalVars||{},{EPSILON_RUNNING_IN_AWS_BATCH:!0}]),c={cpu:4,image:k.fromRegistry(B.imageUri),memory:o.mebibytes(8192),assignPublicIp:!0,command:["Ref::taskName","Ref::taskDataBase64","Ref::traceId","Ref::traceDepth","Ref::taskMetaDataBase64"],environment:n,executionRole:e,jobRole:s,readonlyRootFilesystem:!1,volumes:[]},b=new O(this,`${m}FargateContainerDefinition`,c),f=new I(this,m+"JobDefinition",{jobDefinitionName:m+"JobDefinition",retryAttempts:3,retryStrategies:void 0,schedulingPriority:void 0,timeout:void 0,container:b});U.EPSILON_AWS_BATCH_JOB_DEFINITION_ARN=f.jobDefinitionArn,U.EPSILON_AWS_BATCH_JOB_QUEUE_ARN=r.jobQueueArn}const x=new l(this,"customRole",{roleName:m+"LambdaCustomRole",assumedBy:new d("lambda.amazonaws.com"),managedPolicies:[u.fromAwsManagedPolicyName("service-role/AWSLambdaVPCAccessExecutionRole")],inlinePolicies:{root:new p({statements:K.createDefaultPolicyStatementList(E,G,H,M)})}});if(!y.includes($.WebLambda)){const e={retryAttempts:2,memorySize:E.webMemorySizeMb||128,ephemeralStorageSize:o.mebibytes(512),timeout:t.seconds(E.webTimeoutSeconds||20),code:W,role:x,environment:U,vpc:v,vpcSubnets:R,securityGroups:D};if(this.webHandler=new i(this,m+"Web",e),E?.webLambdaPingMinutes&&E.webLambdaPingMinutes>0){new L(this,m+"WebKeepaliveRule",{schedule:w.rate(t.minutes(Math.ceil(E.webLambdaPingMinutes)))}).addTarget(new A(this.webHandler))}const a=this.webHandler.addFunctionUrl({authType:r.NONE,cors:{allowedOrigins:["*"],allowedHeaders:["Content-Type","X-Amz-Date","Authorization","X-Api-Key"],allowedMethods:[n.ALL],allowCredentials:!0}});this.apiDomain=s.uncachedString({produce:e=>({"Fn::Select":[2,{"Fn::Split":["/",e.resolve(a.url)]}]})})}if(!y.includes($.BackgroundLambda)){this.backgroundHandler=new i(this,m+"Background",{retryAttempts:2,memorySize:E.backgroundMemorySizeMb||3e3,ephemeralStorageSize:o.mebibytes(512),timeout:t.seconds(E.backgroundTimeoutSeconds||900),code:W,role:x,environment:U}),H.addSubscription(new S(this.backgroundHandler)),M.addSubscription(new S(this.backgroundHandler));new L(this,m+"CronRule",{schedule:w.rate(t.minutes(1))}).addTarget(new A(this.backgroundHandler))}}}const X={Update:"Update",DoNotUpdate:"DoNotUpdate"};class Z extends e{constructor(e,o,s){super(e,o,s);const a=new D(this,o+"OriginAccessId"),i=new y(this,o+"DeployBucket",{bucketName:s.targetBucketName,versioned:!1,publicReadAccess:!1,encryption:v.S3_MANAGED}),r=(s.simpleAdditionalMappings||[]).map((e=>{const o=y.fromBucketAttributes(this,e.bucketName+"ImportedBucket",{bucketName:e.bucketName});return{bucket:o,sourceConfig:{s3OriginSource:{s3BucketSource:o,originAccessIdentity:a},behaviors:[{pathPattern:e.pathPattern,isDefaultBehavior:!1,compress:!0,defaultTtl:t.seconds(1),minTtl:t.seconds(1),maxTtl:t.seconds(1),forwardedValues:{queryString:!1}}]}}})),n={s3OriginSource:{s3BucketSource:i,originAccessIdentity:a},behaviors:[{isDefaultBehavior:!0,compress:!0,defaultTtl:t.seconds(1),minTtl:t.seconds(1),maxTtl:t.seconds(1),forwardedValues:{queryString:!1}}]},c=(s.apiMappings||[]).map((e=>({customOriginSource:{domainName:e.apiDomainName,originProtocolPolicy:B.HTTPS_ONLY},behaviors:[{compress:!0,forwardedValues:{queryString:!0,cookies:{forward:"whitelist",whitelistedNames:["idToken"]},headers:["Accept","Referer","Authorization","Content-Type"]},pathPattern:e.pathPattern,defaultTtl:t.seconds(0),maxTtl:t.seconds(0),minTtl:t.seconds(0),allowedMethods:W.ALL,cachedMethods:H.GET_HEAD}]}))),m={httpVersion:G.HTTP2,defaultRootObject:"index.html",originConfigs:[n,...c,...r.map((e=>e.sourceConfig))],errorConfigurations:[{errorCode:404,errorCachingMinTtl:300,responseCode:200,responsePagePath:"/index.html"},{errorCode:403,errorCachingMinTtl:300,responseCode:200,responsePagePath:"/index.html"}],priceClass:M.PRICE_CLASS_ALL,viewerProtocolPolicy:F.REDIRECT_TO_HTTPS,viewerCertificate:{aliases:s.cloudFrontDomainNames,props:{acmCertificateArn:s.cloudFrontHttpsCertificateArn,sslSupportMethod:"sni-only"}}},l=new U(this,o+"CloudfrontDistro",m);if(s?.route53Handling===X.Update&&s?.cloudFrontDomainNames?.length)for(let e=0;e<s.cloudFrontDomainNames.length;e++)new x(this,o+"DomainName-"+s.cloudFrontDomainNames[e],{recordType:V.A,recordName:s.cloudFrontDomainNames[e],target:{aliasTarget:new j(l)},zone:z.fromLookup(this,o,{domainName:Z.extractApexDomain(s.cloudFrontDomainNames[e])})});new J(this,o+"SiteDeploy",{sources:s.pathsToAssets.map((e=>Q.asset(R.resolve(e)))),destinationBucket:i,distribution:l,distributionPaths:["/*"]})}static extractApexDomain(e){const t=g.trimToEmpty(e).split(".");return t.length<2&&E.throwFormattedErr("Not a valid domain name : %s",e),t[t.length-2]+"."+t[t.length-1]}}export{Y as EpsilonApiStack,$ as EpsilonApiStackFeature,K as EpsilonStackUtil,Z as EpsilonWebsiteStack,X as EpsilonWebsiteStackPropsRoute53Handling,q as RatchetEpsilonDeploymentInfo};
1
+ import{Stack as e,Duration as t,Size as o,Lazy as s}from"aws-cdk-lib";import{DockerImageCode as a,DockerImageFunction as i,FunctionUrlAuthType as r,HttpMethod as n}from"aws-cdk-lib/aws-lambda";import{PolicyStatement as c,Effect as m,Role as l,ServicePrincipal as d,ManagedPolicy as u,PolicyDocument as p}from"aws-cdk-lib/aws-iam";import{Topic as b}from"aws-cdk-lib/aws-sns";import{Queue as f}from"aws-cdk-lib/aws-sqs";import{LambdaSubscription as S}from"aws-cdk-lib/aws-sns-subscriptions";import{Rule as L,Schedule as w}from"aws-cdk-lib/aws-events";import{LambdaFunction as A}from"aws-cdk-lib/aws-events-targets";import{DockerImageAsset as h}from"aws-cdk-lib/aws-ecr-assets";import{StringRatchet as g,ErrorRatchet as E}from"@bitblit/ratchet-common";import{FargateComputeEnvironment as N,JobQueue as _,EcsFargateContainerDefinition as O,EcsJobDefinition as I}from"aws-cdk-lib/aws-batch";import{Vpc as T,Subnet as P,SecurityGroup as C}from"aws-cdk-lib/aws-ec2";import{ContainerImage as k}from"aws-cdk-lib/aws-ecs";import{Bucket as y,BucketEncryption as v}from"aws-cdk-lib/aws-s3";import R from"path";import{OriginAccessIdentity as D,OriginProtocolPolicy as B,CloudFrontAllowedMethods as W,CloudFrontAllowedCachedMethods as H,HttpVersion as G,PriceClass as M,ViewerProtocolPolicy as F,CloudFrontWebDistribution as U}from"aws-cdk-lib/aws-cloudfront";import{RecordSet as x,RecordType as V,HostedZone as z}from"aws-cdk-lib/aws-route53";import{CloudFrontTarget as j}from"aws-cdk-lib/aws-route53-targets";import{BucketDeployment as J,Source as Q}from"aws-cdk-lib/aws-s3-deployment";class q{constructor(){}static buildInformation(){return{version:"355",hash:"c2b3df5c6ecad573d661cbd4a241da9d002d184c",branch:"alpha-2024-05-13-2",tag:"alpha-2024-05-13-2",timeBuiltISO:"2024-05-13T10:52:10-0700",notes:"No notes"}}}var $;!function(e){e.WebLambda="WebLambda",e.BackgroundLambda="BackgroundLambda",e.AwsBatchHandler="AwsBatchHandler"}($||($={}));class K{constructor(){}static toEnvironmentVariables(e){const t={};return e.forEach((e=>{Object.keys(e).forEach((o=>{t[o]=g.safeString(e[o])}))})),t}static createDefaultPolicyStatementList(e,t,o,s){return(e.additionalPolicyStatements||[]).concat([new c({effect:m.ALLOW,actions:["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],resources:["arn:aws:logs:*:*:*"]}),new c({effect:m.ALLOW,actions:["ses:SendEmail","ses:SendRawEmail"],resources:["arn:aws:ses:*"]}),new c({effect:m.ALLOW,actions:["sqs:*"],resources:[t.queueArn]}),new c({effect:m.ALLOW,actions:["sns:*"],resources:[o.topicArn,s.topicArn]}),new c({effect:m.ALLOW,actions:["batch:*"],resources:["*"]})])}static ALLOW_ECS=new c({effect:m.ALLOW,actions:["ecs:*"],resources:["*"]});static ALLOW_ECR=new c({effect:m.ALLOW,actions:["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer","ecr:GetAuthorizationToken"],resources:["*"]});static ALLOW_RESTRICTED_LOGS=new c({effect:m.ALLOW,actions:["logs:CreateLogStream","logs:PutLogEvents","logs:DescribeLogStreams","logs:CreateLogGroup"],resources:["*"]});static ALLOW_FARGATE_SECRET_READING=[new c({effect:m.ALLOW,actions:["ssm:GetParameters"],resources:["*"]}),new c({effect:m.ALLOW,actions:["secretsmanager:GetSecretValue"],resources:["*"]}),new c({effect:m.ALLOW,actions:["kms:Decrypt"],resources:["*"]})];static ECS_POLICY_STATEMENTS=[K.ALLOW_ECS,K.ALLOW_ECR,K.ALLOW_RESTRICTED_LOGS].concat(K.ALLOW_FARGATE_SECRET_READING)}class Y extends e{webHandler;backgroundHandler;apiDomain;constructor(c,m,E){super(c,m,E);const y=E?.disabledFeatures||[],v=T.fromLookup(this,"Vpc",{vpcId:E.vpcId}),R={subnets:E.vpcPrivateSubnets.map(((e,t)=>P.fromSubnetAttributes(this,`VpcPrivateSubnet${t}`,e)))};E.vpcPublicSubnets.map(((e,t)=>P.fromSubnetAttributes(this,`VpcPublicSubnet${t}`,e)));const D=E.lambdaSecurityGroupIds.map(((e,t)=>C.fromSecurityGroupId(this,`SecurityGroup${t}`,`sg-${e}`))),B=new h(this,m+"DockerImage",{directory:E.dockerFileFolder,file:E.dockerFileName}),W=a.fromImageAsset(E.dockerFileFolder,{file:E.dockerFileName}),H=new b(this,m+"WorkNotificationTopic"),G=new f(this,m+"WorkQueue",{fifo:!0,retentionPeriod:t.hours(8),visibilityTimeout:t.minutes(5),contentBasedDeduplication:!0,...E}),M=new b(this,m+"InterApiTopic"),F={EPSILON_AWS_REGION:g.safeString(e.of(this).region),EPSILON_AWS_AVAILABILITY_ZONES:g.safeString(JSON.stringify(e.of(this).availabilityZones)),EPSILON_BACKGROUND_SQS_QUEUE_URL:g.safeString(G.queueUrl),EPSILON_BACKGROUND_SNS_TOPIC_ARN:g.safeString(H.topicArn),EPSILON_INTER_API_EVENT_TOPIC_ARN:g.safeString(M.topicArn),EPSILON_LIB_BUILD_HASH:g.safeString(q.buildInformation().hash),EPSILON_LIB_BUILD_TIME:g.safeString(q.buildInformation().timeBuiltISO),EPSILON_LIB_BUILD_BRANCH_OR_TAG:g.safeString(q.buildInformation().branch||q.buildInformation().tag),EPSILON_LIB_BUILD_VERSION:g.safeString(q.buildInformation().version)},U=Object.assign({},E.extraEnvironmentalVars||{},F);if(!y.includes($.AwsBatchHandler)){const e=new l(this,m+"BatchExecutionRole",{assumedBy:new d("ecs-tasks.amazonaws.com"),managedPolicies:[u.fromAwsManagedPolicyName("service-role/AWSLambdaVPCAccessExecutionRole")],inlinePolicies:{root:new p({statements:K.ECS_POLICY_STATEMENTS})}}),s=new l(this,m+"BatchJobRole",{assumedBy:new d("ecs-tasks.amazonaws.com"),managedPolicies:[u.fromAwsManagedPolicyName("service-role/AWSLambdaVPCAccessExecutionRole")],inlinePolicies:{root:new p({statements:K.createDefaultPolicyStatementList(E,G,H,M)})}}),a={vpc:v,computeEnvironmentName:m+"ComputeEnv",enabled:!0,maxvCpus:16,replaceComputeEnvironment:!1,securityGroups:D,serviceRole:l.fromRoleArn(this,`${m}ServiceRole`,"arn:aws:iam::"+E.env.account+":role/AWSBatchServiceRole"),spot:!1,terminateOnUpdate:!1,updateTimeout:t.hours(4),updateToLatestImageVersion:!0,vpcSubnets:R},i=new N(this,m+"ComputeEnv",a),r=new _(this,m+"BatchJobQueue",{computeEnvironments:[{order:1,computeEnvironment:i}],enabled:!0,jobQueueName:m+"BatchJobQueue",priority:10,schedulingPolicy:void 0}),n=K.toEnvironmentVariables([U,E.extraEnvironmentalVars||{},{EPSILON_RUNNING_IN_AWS_BATCH:!0}]),c={cpu:4,image:k.fromRegistry(B.imageUri),memory:o.mebibytes(8192),assignPublicIp:!0,command:["Ref::taskName","Ref::taskDataBase64","Ref::traceId","Ref::traceDepth","Ref::taskMetaDataBase64"],environment:n,executionRole:e,jobRole:s,readonlyRootFilesystem:!1,volumes:[]},b=new O(this,`${m}FargateContainerDefinition`,c),f=new I(this,m+"JobDefinition",{jobDefinitionName:m+"JobDefinition",retryAttempts:3,retryStrategies:void 0,schedulingPriority:void 0,timeout:void 0,container:b});U.EPSILON_AWS_BATCH_JOB_DEFINITION_ARN=f.jobDefinitionArn,U.EPSILON_AWS_BATCH_JOB_QUEUE_ARN=r.jobQueueArn}const x=new l(this,"customRole",{roleName:m+"LambdaCustomRole",assumedBy:new d("lambda.amazonaws.com"),managedPolicies:[u.fromAwsManagedPolicyName("service-role/AWSLambdaVPCAccessExecutionRole")],inlinePolicies:{root:new p({statements:K.createDefaultPolicyStatementList(E,G,H,M)})}});if(!y.includes($.WebLambda)){const e={retryAttempts:2,memorySize:E.webMemorySizeMb||128,ephemeralStorageSize:o.mebibytes(512),timeout:t.seconds(E.webTimeoutSeconds||20),code:W,role:x,environment:U,vpc:v,vpcSubnets:R,securityGroups:D};if(this.webHandler=new i(this,m+"Web",e),E?.webLambdaPingMinutes&&E.webLambdaPingMinutes>0){new L(this,m+"WebKeepaliveRule",{schedule:w.rate(t.minutes(Math.ceil(E.webLambdaPingMinutes)))}).addTarget(new A(this.webHandler))}const a=this.webHandler.addFunctionUrl({authType:r.NONE,cors:{allowedOrigins:["*"],allowedHeaders:["Content-Type","X-Amz-Date","Authorization","X-Api-Key"],allowedMethods:[n.ALL],allowCredentials:!0}});this.apiDomain=s.uncachedString({produce:e=>({"Fn::Select":[2,{"Fn::Split":["/",e.resolve(a.url)]}]})})}if(!y.includes($.BackgroundLambda)){this.backgroundHandler=new i(this,m+"Background",{retryAttempts:2,memorySize:E.backgroundMemorySizeMb||3e3,ephemeralStorageSize:o.mebibytes(512),timeout:t.seconds(E.backgroundTimeoutSeconds||900),code:W,role:x,environment:U}),H.addSubscription(new S(this.backgroundHandler)),M.addSubscription(new S(this.backgroundHandler));new L(this,m+"CronRule",{schedule:w.rate(t.minutes(1))}).addTarget(new A(this.backgroundHandler))}}}const X={Update:"Update",DoNotUpdate:"DoNotUpdate"};class Z extends e{constructor(e,o,s){super(e,o,s);const a=new D(this,o+"OriginAccessId"),i=new y(this,o+"DeployBucket",{bucketName:s.targetBucketName,versioned:!1,publicReadAccess:!1,encryption:v.S3_MANAGED}),r=(s.simpleAdditionalMappings||[]).map((e=>{const o=y.fromBucketAttributes(this,e.bucketName+"ImportedBucket",{bucketName:e.bucketName});return{bucket:o,sourceConfig:{s3OriginSource:{s3BucketSource:o,originAccessIdentity:a},behaviors:[{pathPattern:e.pathPattern,isDefaultBehavior:!1,compress:!0,defaultTtl:t.seconds(1),minTtl:t.seconds(1),maxTtl:t.seconds(1),forwardedValues:{queryString:!1}}]}}})),n={s3OriginSource:{s3BucketSource:i,originAccessIdentity:a},behaviors:[{isDefaultBehavior:!0,compress:!0,defaultTtl:t.seconds(1),minTtl:t.seconds(1),maxTtl:t.seconds(1),forwardedValues:{queryString:!1}}]},c=(s.apiMappings||[]).map((e=>({customOriginSource:{domainName:e.apiDomainName,originProtocolPolicy:B.HTTPS_ONLY},behaviors:[{compress:!0,forwardedValues:{queryString:!0,cookies:{forward:"whitelist",whitelistedNames:["idToken"]},headers:["Accept","Referer","Authorization","Content-Type"]},pathPattern:e.pathPattern,defaultTtl:t.seconds(0),maxTtl:t.seconds(0),minTtl:t.seconds(0),allowedMethods:W.ALL,cachedMethods:H.GET_HEAD}]}))),m={httpVersion:G.HTTP2,defaultRootObject:"index.html",originConfigs:[n,...c,...r.map((e=>e.sourceConfig))],errorConfigurations:[{errorCode:404,errorCachingMinTtl:300,responseCode:200,responsePagePath:"/index.html"},{errorCode:403,errorCachingMinTtl:300,responseCode:200,responsePagePath:"/index.html"}],priceClass:M.PRICE_CLASS_ALL,viewerProtocolPolicy:F.REDIRECT_TO_HTTPS,viewerCertificate:{aliases:s.cloudFrontDomainNames,props:{acmCertificateArn:s.cloudFrontHttpsCertificateArn,sslSupportMethod:"sni-only"}}},l=new U(this,o+"CloudfrontDistro",m);if(s?.route53Handling===X.Update&&s?.cloudFrontDomainNames?.length)for(let e=0;e<s.cloudFrontDomainNames.length;e++)new x(this,o+"DomainName-"+s.cloudFrontDomainNames[e],{recordType:V.A,recordName:s.cloudFrontDomainNames[e],target:{aliasTarget:new j(l)},zone:z.fromLookup(this,o,{domainName:Z.extractApexDomain(s.cloudFrontDomainNames[e])})});new J(this,o+"SiteDeploy",{sources:s.pathsToAssets.map((e=>Q.asset(R.resolve(e)))),destinationBucket:i,distribution:l,distributionPaths:["/*"]})}static extractApexDomain(e){const t=g.trimToEmpty(e).split(".");return t.length<2&&E.throwFormattedErr("Not a valid domain name : %s",e),t[t.length-2]+"."+t[t.length-1]}}export{Y as EpsilonApiStack,$ as EpsilonApiStackFeature,K as EpsilonStackUtil,Z as EpsilonWebsiteStack,X as EpsilonWebsiteStackPropsRoute53Handling,q as RatchetEpsilonDeploymentInfo};
2
2
  //# sourceMappingURL=index.mjs.map
package/lib/types.d.ts ADDED
@@ -0,0 +1,95 @@
1
+ import { BuildInformation } from '@bitblit/ratchet-common';
2
+ import { StackProps, Stack } from 'aws-cdk-lib';
3
+ import { PolicyStatement } from 'aws-cdk-lib/aws-iam';
4
+ import { SubnetAttributes } from 'aws-cdk-lib/aws-ec2';
5
+ import { Construct } from 'constructs';
6
+ import { Topic } from 'aws-cdk-lib/aws-sns';
7
+ import { Queue } from 'aws-cdk-lib/aws-sqs';
8
+ import { IBucket } from 'aws-cdk-lib/aws-s3';
9
+ import { SourceConfiguration } from 'aws-cdk-lib/aws-cloudfront';
10
+
11
+ declare class RatchetEpsilonDeploymentInfo {
12
+ private constructor();
13
+ static buildInformation(): BuildInformation;
14
+ }
15
+
16
+ declare enum EpsilonApiStackFeature {
17
+ WebLambda = "WebLambda",
18
+ BackgroundLambda = "BackgroundLambda",
19
+ AwsBatchHandler = "AwsBatchHandler"
20
+ }
21
+
22
+ interface EpsilonApiStackProps extends StackProps {
23
+ batchInstancesEc2KeyPairName?: string;
24
+ additionalPolicyStatements: PolicyStatement[];
25
+ disabledFeatures?: EpsilonApiStackFeature[];
26
+ dockerFileFolder: string;
27
+ dockerFileName: string;
28
+ lambdaSecurityGroupIds: string[];
29
+ vpcPrivateSubnets: SubnetAttributes[];
30
+ vpcPublicSubnets: SubnetAttributes[];
31
+ availabilityZones: string[];
32
+ vpcId: string;
33
+ extraEnvironmentalVars?: Record<string, string>;
34
+ webLambdaPingMinutes?: number;
35
+ webMemorySizeMb?: number;
36
+ backgroundMemorySizeMb?: number;
37
+ webTimeoutSeconds?: number;
38
+ backgroundTimeoutSeconds?: number;
39
+ }
40
+
41
+ declare class EpsilonApiStack extends Stack {
42
+ private webHandler;
43
+ private backgroundHandler;
44
+ apiDomain: string;
45
+ constructor(scope: Construct, id: string, props?: EpsilonApiStackProps);
46
+ }
47
+
48
+ interface EpsilonLambdaToCloudfrontPathMapping {
49
+ apiDomainName: string;
50
+ pathPattern: string;
51
+ }
52
+
53
+ declare class EpsilonStackUtil {
54
+ private constructor();
55
+ static toEnvironmentVariables(input: Record<string, any>[]): {
56
+ [key: string]: string;
57
+ };
58
+ static createDefaultPolicyStatementList(props: EpsilonApiStackProps, backgroundLambdaSqs: Queue, backgroundLambdaSns: Topic, interApiSns: Topic): PolicyStatement[];
59
+ static readonly ALLOW_ECS: PolicyStatement;
60
+ static readonly ALLOW_ECR: PolicyStatement;
61
+ static readonly ALLOW_RESTRICTED_LOGS: PolicyStatement;
62
+ static readonly ALLOW_FARGATE_SECRET_READING: PolicyStatement[];
63
+ static readonly ECS_POLICY_STATEMENTS: PolicyStatement[];
64
+ }
65
+
66
+ interface SimpleAdditionalS3WebsiteMapping {
67
+ bucketName: string;
68
+ pathPattern: string;
69
+ }
70
+
71
+ interface EpsilonWebsiteStackProps extends StackProps {
72
+ targetBucketName: string;
73
+ cloudFrontHttpsCertificateArn: string;
74
+ cloudFrontDomainNames: string[];
75
+ apiMappings: EpsilonLambdaToCloudfrontPathMapping[];
76
+ pathsToAssets: string[];
77
+ route53Handling: EpsilonWebsiteStackPropsRoute53Handling;
78
+ simpleAdditionalMappings?: SimpleAdditionalS3WebsiteMapping[];
79
+ }
80
+ declare const EpsilonWebsiteStackPropsRoute53Handling: {
81
+ Update: string;
82
+ DoNotUpdate: string;
83
+ };
84
+ type EpsilonWebsiteStackPropsRoute53Handling = (typeof EpsilonWebsiteStackPropsRoute53Handling)[keyof typeof EpsilonWebsiteStackPropsRoute53Handling];
85
+
86
+ declare class EpsilonWebsiteStack extends Stack {
87
+ constructor(scope: Construct, id: string, props?: EpsilonWebsiteStackProps);
88
+ static extractApexDomain(domainName: string): string;
89
+ }
90
+ interface BucketAndSourceConfiguration {
91
+ bucket: IBucket;
92
+ sourceConfig: SourceConfiguration;
93
+ }
94
+
95
+ export { type BucketAndSourceConfiguration, EpsilonApiStack, EpsilonApiStackFeature, type EpsilonApiStackProps, type EpsilonLambdaToCloudfrontPathMapping, EpsilonStackUtil, EpsilonWebsiteStack, type EpsilonWebsiteStackProps, EpsilonWebsiteStackPropsRoute53Handling, RatchetEpsilonDeploymentInfo, type SimpleAdditionalS3WebsiteMapping };
package/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@bitblit/ratchet-epsilon-deployment",
3
- "version": "4.0.354-alpha",
3
+ "version": "4.0.355-alpha",
4
4
  "description": "Epsilon CDK extensions to simplify deployment",
5
5
  "sideEffects": false,
6
6
  "type": "module",
7
7
  "module": "./lib/index.mjs",
8
- "types": "./lib/index.d.ts",
8
+ "types": "./lib/types.d.ts",
9
9
  "files": [
10
10
  "lib/**",
11
11
  "bin/**"
12
12
  ],
13
13
  "exports": {
14
14
  ".": {
15
- "types": "./lib/index.d.ts",
15
+ "types": "./lib/types.d.ts",
16
16
  "import": "./lib/index.mjs"
17
17
  }
18
18
  },
@@ -51,14 +51,14 @@
51
51
  },
52
52
  "license": "Apache-2.0",
53
53
  "dependencies": {
54
- "@bitblit/ratchet-aws": "4.0.354-alpha",
55
- "@bitblit/ratchet-common": "4.0.354-alpha",
56
- "@bitblit/ratchet-epsilon-common": "4.0.354-alpha",
54
+ "@bitblit/ratchet-aws": "4.0.355-alpha",
55
+ "@bitblit/ratchet-common": "4.0.355-alpha",
56
+ "@bitblit/ratchet-epsilon-common": "4.0.355-alpha",
57
57
  "aws-cdk-lib": "2.141.0",
58
58
  "constructs": "10.3.0"
59
59
  },
60
60
  "peerDependencies": {
61
- "@bitblit/ratchet-common": "4.0.354-alpha",
61
+ "@bitblit/ratchet-common": "4.0.355-alpha",
62
62
  "aws-cdk-lib": "^2.141.0",
63
63
  "constructs": "^10.3.0"
64
64
  }
@@ -1,5 +0,0 @@
1
- import { BuildInformation } from '@bitblit/ratchet-common';
2
- export declare class RatchetEpsilonDeploymentInfo {
3
- private constructor();
4
- static buildInformation(): BuildInformation;
5
- }
@@ -1,5 +0,0 @@
1
- export declare enum EpsilonApiStackFeature {
2
- WebLambda = "WebLambda",
3
- BackgroundLambda = "BackgroundLambda",
4
- AwsBatchHandler = "AwsBatchHandler"
5
- }
@@ -1,22 +0,0 @@
1
- import { StackProps } from 'aws-cdk-lib';
2
- import { PolicyStatement } from 'aws-cdk-lib/aws-iam';
3
- import { EpsilonApiStackFeature } from './epsilon-api-stack-feature.js';
4
- import { SubnetAttributes } from "aws-cdk-lib/aws-ec2";
5
- export interface EpsilonApiStackProps extends StackProps {
6
- batchInstancesEc2KeyPairName?: string;
7
- additionalPolicyStatements: PolicyStatement[];
8
- disabledFeatures?: EpsilonApiStackFeature[];
9
- dockerFileFolder: string;
10
- dockerFileName: string;
11
- lambdaSecurityGroupIds: string[];
12
- vpcPrivateSubnets: SubnetAttributes[];
13
- vpcPublicSubnets: SubnetAttributes[];
14
- availabilityZones: string[];
15
- vpcId: string;
16
- extraEnvironmentalVars?: Record<string, string>;
17
- webLambdaPingMinutes?: number;
18
- webMemorySizeMb?: number;
19
- backgroundMemorySizeMb?: number;
20
- webTimeoutSeconds?: number;
21
- backgroundTimeoutSeconds?: number;
22
- }
@@ -1,9 +0,0 @@
1
- import { Stack } from 'aws-cdk-lib';
2
- import { Construct } from 'constructs';
3
- import { EpsilonApiStackProps } from './epsilon-api-stack-props.js';
4
- export declare class EpsilonApiStack extends Stack {
5
- private webHandler;
6
- private backgroundHandler;
7
- apiDomain: string;
8
- constructor(scope: Construct, id: string, props?: EpsilonApiStackProps);
9
- }
@@ -1,4 +0,0 @@
1
- export interface EpsilonLambdaToCloudfrontPathMapping {
2
- apiDomainName: string;
3
- pathPattern: string;
4
- }
@@ -1,16 +0,0 @@
1
- import { PolicyStatement } from 'aws-cdk-lib/aws-iam';
2
- import { Topic } from 'aws-cdk-lib/aws-sns';
3
- import { Queue } from 'aws-cdk-lib/aws-sqs';
4
- import { EpsilonApiStackProps } from './epsilon-api-stack-props.js';
5
- export declare class EpsilonStackUtil {
6
- private constructor();
7
- static toEnvironmentVariables(input: Record<string, any>[]): {
8
- [key: string]: string;
9
- };
10
- static createDefaultPolicyStatementList(props: EpsilonApiStackProps, backgroundLambdaSqs: Queue, backgroundLambdaSns: Topic, interApiSns: Topic): PolicyStatement[];
11
- static readonly ALLOW_ECS: PolicyStatement;
12
- static readonly ALLOW_ECR: PolicyStatement;
13
- static readonly ALLOW_RESTRICTED_LOGS: PolicyStatement;
14
- static readonly ALLOW_FARGATE_SECRET_READING: PolicyStatement[];
15
- static readonly ECS_POLICY_STATEMENTS: PolicyStatement[];
16
- }
@@ -1,17 +0,0 @@
1
- import { StackProps } from 'aws-cdk-lib';
2
- import { SimpleAdditionalS3WebsiteMapping } from './simple-additional-s3-website-mapping.js';
3
- import { EpsilonLambdaToCloudfrontPathMapping } from './epsilon-lambda-to-cloudfront-path-mapping.js';
4
- export interface EpsilonWebsiteStackProps extends StackProps {
5
- targetBucketName: string;
6
- cloudFrontHttpsCertificateArn: string;
7
- cloudFrontDomainNames: string[];
8
- apiMappings: EpsilonLambdaToCloudfrontPathMapping[];
9
- pathsToAssets: string[];
10
- route53Handling: EpsilonWebsiteStackPropsRoute53Handling;
11
- simpleAdditionalMappings?: SimpleAdditionalS3WebsiteMapping[];
12
- }
13
- export declare const EpsilonWebsiteStackPropsRoute53Handling: {
14
- Update: string;
15
- DoNotUpdate: string;
16
- };
17
- export type EpsilonWebsiteStackPropsRoute53Handling = (typeof EpsilonWebsiteStackPropsRoute53Handling)[keyof typeof EpsilonWebsiteStackPropsRoute53Handling];
@@ -1,13 +0,0 @@
1
- import { IBucket } from 'aws-cdk-lib/aws-s3';
2
- import { Stack } from 'aws-cdk-lib';
3
- import { Construct } from 'constructs';
4
- import { SourceConfiguration } from 'aws-cdk-lib/aws-cloudfront';
5
- import { EpsilonWebsiteStackProps } from './epsilon-website-stack-props.js';
6
- export declare class EpsilonWebsiteStack extends Stack {
7
- constructor(scope: Construct, id: string, props?: EpsilonWebsiteStackProps);
8
- static extractApexDomain(domainName: string): string;
9
- }
10
- export interface BucketAndSourceConfiguration {
11
- bucket: IBucket;
12
- sourceConfig: SourceConfiguration;
13
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,4 +0,0 @@
1
- export interface SimpleAdditionalS3WebsiteMapping {
2
- bucketName: string;
3
- pathPattern: string;
4
- }
package/lib/index.d.ts DELETED
@@ -1,9 +0,0 @@
1
- export * from './build/ratchet-epsilon-deployment-info.js';
2
- export * from './deployment/cdk/epsilon-api-stack-feature.js';
3
- export * from './deployment/cdk/epsilon-api-stack-props.js';
4
- export * from './deployment/cdk/epsilon-api-stack.js';
5
- export * from './deployment/cdk/epsilon-lambda-to-cloudfront-path-mapping.js';
6
- export * from './deployment/cdk/epsilon-stack-util.js';
7
- export * from './deployment/cdk/epsilon-website-stack-props.js';
8
- export * from './deployment/cdk/epsilon-website-stack.js';
9
- export * from './deployment/cdk/simple-additional-s3-website-mapping.js';
package/lib/index.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/build/ratchet-epsilon-deployment-info.ts","../src/deployment/cdk/epsilon-api-stack-feature.ts","../src/deployment/cdk/epsilon-stack-util.ts","../src/deployment/cdk/epsilon-api-stack.ts","../src/deployment/cdk/epsilon-website-stack-props.ts","../src/deployment/cdk/epsilon-website-stack.ts"],"sourcesContent":[null,null,null,null,null,null],"names":["RatchetEpsilonDeploymentInfo","constructor","buildInformation","version","hash","branch","tag","timeBuiltISO","notes","EpsilonApiStackFeature","EpsilonStackUtil","toEnvironmentVariables","input","rval","forEach","inval","Object","keys","k","StringRatchet","safeString","createDefaultPolicyStatementList","props","backgroundLambdaSqs","backgroundLambdaSns","interApiSns","additionalPolicyStatements","concat","PolicyStatement","effect","Effect","ALLOW","actions","resources","queueArn","topicArn","static","ALLOW_ECS","ALLOW_ECR","ALLOW_RESTRICTED_LOGS","ALLOW_FARGATE_SECRET_READING","EpsilonApiStack","Stack","webHandler","backgroundHandler","apiDomain","scope","id","super","disabledFeatures","sharedVpc","Vpc","fromLookup","this","vpcId","sharedVpcPrivateSubnetSelection","subnets","vpcPrivateSubnets","map","subnet","index","Subnet","fromSubnetAttributes","vpcPublicSubnets","fargateVpcSecurityGroups","lambdaSecurityGroupIds","sgId","SecurityGroup","fromSecurityGroupId","dockerImageAsset","DockerImageAsset","directory","dockerFileFolder","file","dockerFileName","dockerImageCode","DockerImageCode","fromImageAsset","notificationTopic","Topic","workQueue","Queue","fifo","retentionPeriod","Duration","hours","visibilityTimeout","minutes","contentBasedDeduplication","interApiGenericEventTopic","epsilonEnv","EPSILON_AWS_REGION","of","region","EPSILON_AWS_AVAILABILITY_ZONES","JSON","stringify","availabilityZones","EPSILON_BACKGROUND_SQS_QUEUE_URL","queueUrl","EPSILON_BACKGROUND_SNS_TOPIC_ARN","EPSILON_INTER_API_EVENT_TOPIC_ARN","EPSILON_LIB_BUILD_HASH","EPSILON_LIB_BUILD_TIME","EPSILON_LIB_BUILD_BRANCH_OR_TAG","EPSILON_LIB_BUILD_VERSION","env","assign","extraEnvironmentalVars","includes","AwsBatchHandler","executionRole","Role","assumedBy","ServicePrincipal","managedPolicies","ManagedPolicy","fromAwsManagedPolicyName","inlinePolicies","root","PolicyDocument","statements","ECS_POLICY_STATEMENTS","jobRole","compEnvProps","vpc","computeEnvironmentName","enabled","maxvCpus","replaceComputeEnvironment","securityGroups","serviceRole","fromRoleArn","account","spot","terminateOnUpdate","updateTimeout","updateToLatestImageVersion","vpcSubnets","compEnv","FargateComputeEnvironment","batchJobQueue","JobQueue","computeEnvironments","order","computeEnvironment","jobQueueName","priority","schedulingPolicy","undefined","batchEnvVars","EPSILON_RUNNING_IN_AWS_BATCH","containerDef","cpu","image","ContainerImage","fromRegistry","imageUri","memory","Size","mebibytes","assignPublicIp","command","environment","readonlyRootFilesystem","volumes","fargateContainerDefinitionDef","EcsFargateContainerDefinition","jobDef","EcsJobDefinition","jobDefinitionName","retryAttempts","retryStrategies","schedulingPriority","timeout","container","jobDefinitionArn","jobQueueArn","lambdaRole","roleName","WebLambda","webImageFunctionProps","memorySize","webMemorySizeMb","ephemeralStorageSize","seconds","webTimeoutSeconds","code","role","DockerImageFunction","webLambdaPingMinutes","Rule","schedule","Schedule","rate","Math","ceil","addTarget","LambdaFunction","fnUrl","addFunctionUrl","authType","FunctionUrlAuthType","NONE","cors","allowedOrigins","allowedHeaders","allowedMethods","HttpMethod","ALL","allowCredentials","Lazy","uncachedString","produce","context","resolve","url","BackgroundLambda","backgroundMemorySizeMb","backgroundTimeoutSeconds","addSubscription","LambdaSubscription","EpsilonWebsiteStackPropsRoute53Handling","Update","DoNotUpdate","EpsilonWebsiteStack","originAccessId","OriginAccessIdentity","websiteBucket","Bucket","bucketName","targetBucketName","versioned","publicReadAccess","encryption","BucketEncryption","S3_MANAGED","extraBucketAndSource","simpleAdditionalMappings","eb","nextBucket","fromBucketAttributes","bucket","sourceConfig","s3OriginSource","s3BucketSource","originAccessIdentity","behaviors","pathPattern","isDefaultBehavior","compress","defaultTtl","minTtl","maxTtl","forwardedValues","queryString","assetSource","apiSources","apiMappings","s","customOriginSource","domainName","apiDomainName","originProtocolPolicy","OriginProtocolPolicy","HTTPS_ONLY","cookies","forward","whitelistedNames","headers","CloudFrontAllowedMethods","cachedMethods","CloudFrontAllowedCachedMethods","GET_HEAD","distributionProps","httpVersion","HttpVersion","HTTP2","defaultRootObject","originConfigs","errorConfigurations","errorCode","errorCachingMinTtl","responseCode","responsePagePath","priceClass","PriceClass","PRICE_CLASS_ALL","viewerProtocolPolicy","ViewerProtocolPolicy","REDIRECT_TO_HTTPS","viewerCertificate","aliases","cloudFrontDomainNames","acmCertificateArn","cloudFrontHttpsCertificateArn","sslSupportMethod","cloudfrontDistro","CloudFrontWebDistribution","route53Handling","length","i","RecordSet","recordType","RecordType","A","recordName","target","aliasTarget","CloudFrontTarget","zone","HostedZone","extractApexDomain","BucketDeployment","sources","pathsToAssets","inPath","Source","asset","path","destinationBucket","distribution","distributionPaths","pieces","trimToEmpty","split","ErrorRatchet","throwFormattedErr"],"mappings":"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"}