UNPKG

@cumulus/deployment

Version:
462 lines (432 loc) 13.6 kB
AWSTemplateFormatVersion: '2010-09-09' Description: 'stack: {{stackName}} | deployed by Kes' Parameters: CmrPassword: Type: String Description: 'Password used to publish CMR records. This is encrypted by Custom::Cumulus' Default: "" NoEcho: true ElasticSearchDomain: Type: String Description: 'ElasticSearch Url' NoEcho: true Default: 'noValue' LaunchpadPassphrase: Type: String Description: 'Passphrase of the Launchpad PIK certificate. This is encrypted by Custom::Cumulus' Default: "" NoEcho: true SecurityGroupId: Type: String Description: 'Security Group ID' Default: 'noValue' log2elasticsearchLambdaFunctionArn: Type: String Description: 'logToElasticsearch Lambda function ARN' {{#each apis}} {{#ifEquals name "backend" }} EcsCluster: Type: String AsyncOperationTaskDefinition: Type: String BulkDeleteLambdaFunctionArn: Type: String Description: 'BulkDelete Lambda function ARN' CreateReconciliationReportLambdaFunctionArn: Type: String Description: 'CreateReconciliationReport Lambda function ARN' EmsIngestReportLambdaFunctionArn: Type: String Description: 'EmsIngestReport Lambda function ARN' EmsDistributionReportLambdaFunctionArn: Type: String Description: 'EmsDistributionReport Lambda function ARN' EmsProductMetadataReportLambdaFunctionArn: Type: String Description: 'EmsProductMetadataReport Lambda function ARN' messageConsumerLambdaFunctionArn: Type: String Description: 'messageConsumer Lambda function ARN' ScheduleSFLambdaFunctionArn: Type: String Description: 'ScheduleSF Lambda function ARN' KinesisInboundEventLoggerLambdaFunctionArn: Type: String Description: 'KinesisInboundEventLogger Lambda function ARN' IndexFromDatabaseLambdaFunctionArn: Type: String Description: 'IndexFromDatabaseLambda Lambda function ARN' BulkOperationLambdaFunctionArn: Type: String Description: 'BulkOperation Lambda function ARN' distributionRestApi: Type: String Description: Distribution REST API ID Default: 'noValue' {{/ifEquals}} {{/each}} {{# each parent.dynamos}} {{@key}}DynamoDB: Type: String Description: '{{@key}} Table name' {{/each}} Resources: ################################################# # APIGateway config BEGIN ################################################# {{#each apis}} {{name}}RestApi: Type: AWS::ApiGateway::RestApi Properties: Name: {{../stackName}}-{{name}} {{#ifPrivateApi ../parent.apiConfigs name}} EndpointConfiguration: Types: - 'PRIVATE' # Needed for deploy, but in an NGAP account, this will get overwritten Policy: Version: '2012-10-17' Statement: - Effect: "Allow" Principal: "*" Action: "*" Resource: "*" Condition: StringEquals: aws:SourceVpc: {{../../parent.vpc.vpcId}} {{/ifPrivateApi}} {{/each}} {{#each apis}} {{name}}ApiGatewayStage: Type: AWS::ApiGateway::Stage Properties: RestApiId: Ref: {{name}}RestApi StageName: {{../parent.apiStage}} {{#ifLogApiGatewayToCloudWatch ../parent.apiConfigs name}} AccessLogSetting: DestinationArn: Fn::GetAtt: - ApiGatewayCloudWatchLogGroup{{name}} - Arn Format: '{ "requestId":"$context.requestId", "ip": "$context.identity.sourceIp", "caller":"$context.identity.caller", "user":"$context.identity.user", "requestTime":"$context.requestTime", "httpMethod":"$context.httpMethod", "resourcePath":"$context.resourcePath", "status":"$context.status", "protocol":"$context.protocol", "responseLength":"$context.responseLength" }' MethodSettings: - DataTraceEnabled: true HttpMethod: "*" LoggingLevel: INFO ResourcePath: "/*" MetricsEnabled: false {{/ifLogApiGatewayToCloudWatch}} DeploymentId: Ref: ApiGatewayDeployment1{{../parent.apiStage}}{{name}} {{/each}} {{# if apiMethods}} {{# each apiDependencies}} {{# if ../apiDeploy }} ApiGatewayDeployment1{{../parent.apiStage}}{{name}}: DependsOn: {{#each methods}} - {{name}} {{/each}} Type: AWS::ApiGateway::Deployment Properties: RestApiId: Ref: {{name}}RestApi {{/if}} {{/each}} {{#each apiMethods}} {{name}}: Type: AWS::ApiGateway::Method Properties: ResourceId: Ref: {{resource}} RestApiId: Ref: {{api}}RestApi HttpMethod: {{method}} AuthorizationType: NONE Integration: Type: AWS_PROXY IntegrationHttpMethod: POST Uri: Fn::Join: - '' - - 'arn:aws:apigateway:' - Ref: AWS::Region - :lambda:path/2015-03-31/functions/ - Fn::GetAtt: - {{lambda}}LambdaFunction - Arn - /invocations {{/each}} {{#each apiMethodsOptions}} {{name}}: Type: AWS::ApiGateway::Method Properties: AuthorizationType: NONE HttpMethod: OPTIONS Integration: IntegrationResponses: - ResponseParameters: method.response.header.Access-Control-Allow-Headers: '''Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token''' method.response.header.Access-Control-Allow-Methods: '''OPTIONS,PUT,POST,GET,DELETE''' method.response.header.Access-Control-Allow-Origin: '''*''' ResponseTemplates: application/json: '' StatusCode: '200' RequestTemplates: application/json: '{statusCode:200}' Type: MOCK MethodResponses: - ResponseModels: {} ResponseParameters: method.response.header.Access-Control-Allow-Headers: true method.response.header.Access-Control-Allow-Methods: true method.response.header.Access-Control-Allow-Origin: true StatusCode: '200' RequestParameters: method.request.header.Authorization: true ResourceId: Ref: {{resource}} RestApiId: Ref: {{api}}RestApi {{/each}} {{#each apiResources}} {{name}}: Type: AWS::ApiGateway::Resource Properties: ParentId: {{# if firstParent}} Fn::GetAtt: - {{api}}RestApi - RootResourceId {{else}} {{#each parents}} {{this}} {{/each}} {{/if}} PathPart: '{{pathPart}}' RestApiId: Ref: {{api}}RestApi {{/each}} {{#each apis}} {{#ifLogApiGatewayToCloudWatch ../parent.apiConfigs name }} # Add cloudwatch filters to enabled api gateways # create log group ApiGatewayCloudWatchLogGroup{{name}}: Type: AWS::Logs::LogGroup Properties: LogGroupName: Fn::Join: - "" - - "API-Gateway-Execution-Logs_" - Ref: {{name}}RestApi - "/{{../parent.apiStage}}" RetentionInDays: 30 {{#if ../parent.logToSharedDestination }} # create API Subscription Filter ApiGatewayLogSubscription{{name}}: Type: AWS::Logs::SubscriptionFilter DependsOn: - ApiGatewayCloudWatchLogGroup{{name}} Properties: DestinationArn: "{{../parent.logToSharedDestination}}" FilterPattern: "" LogGroupName: Ref: ApiGatewayCloudWatchLogGroup{{name}} {{/if}} {{/ifLogApiGatewayToCloudWatch}} {{/each}} {{/if}} ################################################# # APIGateway config END ################################################# ################################################# # Lambda config BEGIN ################################################# {{#each lambdas}} {{@key}}LambdaFunction: Type: AWS::Lambda::Function Properties: Code: S3Bucket: {{this.bucket}} S3Key: {{this.remote}} FunctionName: {{../stackName}}-{{@key}} Environment: Variables: stackName: {{../stackName}} public_buckets: {{{collectBuckets ../parent.buckets "public"}}} protected_buckets: {{{collectBuckets ../parent.buckets "protected"}}} {{#if this.useElasticSearch }} {{#if ../parent.es.name}} ES_HOST: Ref: ElasticSearchDomain {{/if}} {{/if}} {{# ifEquals this.urs_redirect "token"}} {{# if ../parent.api_backend_url}} TOKEN_REDIRECT_ENDPOINT: {{../parent.api_backend_url}}token {{else}} TOKEN_REDIRECT_ENDPOINT: Fn::Join: - "" - - "https://" - Ref: backendRestApi - ".execute-api." - {"Fn::Sub": "${AWS::Region}"} - ".amazonaws.com" - {{{getApiPortSuffix ../parent.apiConfigs "backend"}}} - "{{../parent.apiStage}}/token" {{/if}} {{/ifEquals}} {{# ifEquals this.urs_redirect "distribution"}} {{# if ../parent.api_distribution_url}} DISTRIBUTION_REDIRECT_ENDPOINT: {{../parent.api_distribution_url}}redirect {{/if}} {{#if ../parent.deployDistributionApi}} DISTRIBUTION_REDIRECT_ENDPOINT: Fn::Join: - "" - - "https://" - Ref: distributionRestApi - ".execute-api." - {"Fn::Sub": "${AWS::Region}"} - ".amazonaws.com" - {{{getApiPortSuffix ../parent.apiConfigs "distribution"}}} - "{{../parent.apiStage}}/redirect" {{/if}} {{/ifEquals}} {{# if this.useDistributionApi}} {{# if ../parent.api_distribution_url}} DISTRIBUTION_ENDPOINT: {{../parent.api_distribution_url}} {{/if}} {{#if ../deployDistributionApi}} DISTRIBUTION_ENDPOINT: Fn::Join: - "" - - "https://" - Ref: distributionRestApi - ".execute-api." - {"Fn::Sub": "${AWS::Region}"} - ".amazonaws.com" - {{{getApiPortSuffix ../parent.apiConfigs "distribution"}}} - "{{../parent.apiStage}}" {{/if}} {{/if}} {{#each this.envs}} {{# if this.function}} {{#if this.array}} {{@key}}: {{this.function}}: {{#each this.array}} - {{this}} {{/each}} {{/if}} {{#if this.value}} {{@key}}: {{this.function}}: {{this.value}} {{/if}} {{else}} {{@key}}: {{{this}}} {{/if}} {{/each}} Handler: {{this.handler}} MemorySize: {{this.memory}} {{# if this.apiRole }} Role: {{../parent.iams.lambdaApiGatewayRoleArn}} {{else if this.distributionRole}} Role: {{../parent.iams.distributionRoleArn}} {{else}} {{#ifEquals @key "executeMigrations"}} Role: {{../parent.iams.migrationRoleArn}} {{/ifEquals}} {{#ifNotEquals @key "executeMigrations"}} Role: {{../parent.iams.lambdaProcessingRoleArn}} {{/ifNotEquals}} {{/if}} Runtime: {{# if this.runtime}}{{this.runtime}}{{else}}nodejs8.10{{/if}} Timeout: {{this.timeout}} Tags: - Key: Project Value: {{../stackName}} {{# if this.launchInVpc }} {{# if ../parent.vpc }} VpcConfig: SecurityGroupIds: - Ref: SecurityGroupId SubnetIds: {{#each ../parent.vpc.subnets}} - {{this}} {{/each}} {{/if}} {{/if}} {{# if this.apiGateway }} {{@key}}LambdaPermissionApiGateway: Type: AWS::Lambda::Permission Properties: Action: lambda:InvokeFunction FunctionName: Fn::GetAtt: - {{@key}}LambdaFunction - Arn Principal: apigateway.amazonaws.com {{/if}} {{# if this.logToElasticSearch }} {{@key}}LogSubscription: Type: AWS::Logs::SubscriptionFilter DependsOn: - {{@key}}LogGroup Properties: DestinationArn: Ref: log2elasticsearchLambdaFunctionArn LogGroupName: '/aws/lambda/{{../stackName}}-{{@key}}' FilterPattern: "" {{@key}}LogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: '/aws/lambda/{{../stackName}}-{{@key}}' RetentionInDays: 30 {{/if}} {{#if this.logToSharedDestination }} # Configure Lambda log subscription to shareLogDestination for API lambdas {{@key}}LogSubscriptionToSharedDestination: Type: AWS::Logs::SubscriptionFilter DependsOn: - {{@key}}LogGroup Properties: DestinationArn: "{{this.logToSharedDestination}}" LogGroupName: '/aws/lambda/{{../stackName}}-{{@key}}' FilterPattern: "" {{@key}}LogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: '/aws/lambda/{{../stackName}}-{{@key}}' RetentionInDays: 30 {{/if}} {{# if this.addLogGroup }} {{@key}}LogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: '/aws/lambda/{{../stackName}}-{{@key}}' RetentionInDays: 30 {{/if}} {{/each}} ################################################# # Lambda config END ################################################# Outputs: {{#each apis}} {{name}}RestApiResource: Value: Ref: {{name}}RestApi {{name}}RestApiResourceUrl: Value: Fn::Join: - "" - - "https://" - Ref: {{name}}RestApi - ".execute-api." - {"Fn::Sub": "${AWS::Region}"} - ".amazonaws.com" - {{{getApiPortSuffix ../parent.apiConfigs name}}} - "{{../parent.apiStage}}/" {{/each}}