Separate infrastructure to separate yaml and base schema.
This commit is contained in:
@@ -17,7 +17,8 @@ stages:
|
||||
domain: es.imex.online
|
||||
es_user: Imex2
|
||||
es_password: Patrick
|
||||
db_name: esdpprod
|
||||
infra_service: esdp-infra
|
||||
infra_stage: shared
|
||||
beta:
|
||||
# Enables observability in the prod stage
|
||||
observability: false
|
||||
@@ -28,7 +29,8 @@ stages:
|
||||
domain: beta.es.imex.online
|
||||
es_user: Imex2
|
||||
es_password: Patrick
|
||||
db_name: esdpbeta
|
||||
infra_service: esdp-infra
|
||||
infra_stage: shared
|
||||
alpha:
|
||||
# Enables observability in the prod stage
|
||||
observability: false
|
||||
@@ -38,7 +40,8 @@ stages:
|
||||
domain: alpha.es.imex.online
|
||||
es_user: Imex2
|
||||
es_password: Patrick
|
||||
db_name: esdpalpha
|
||||
infra_service: esdp-infra
|
||||
infra_stage: shared
|
||||
dev:
|
||||
# Enables observability in the prod stage
|
||||
observability: false
|
||||
@@ -48,7 +51,17 @@ stages:
|
||||
domain: dev.es.imex.online
|
||||
es_user: Imex2
|
||||
es_password: Patrick
|
||||
db_name: esdpdev
|
||||
infra_service: esdp-infra
|
||||
infra_stage: shared
|
||||
|
||||
custom:
|
||||
infra_stack: ${param:infra_service}-${param:infra_stage}
|
||||
|
||||
db:
|
||||
host: ${cf:${self:custom.infra_stack}.DbProxyEndpoint}
|
||||
port: ${cf:${self:custom.infra_stack}.DbPort}
|
||||
name: ${cf:${self:custom.infra_stack}.DbName}
|
||||
secretArn: ${cf:${self:custom.infra_stack}.DbSecretArn}
|
||||
|
||||
# params:
|
||||
# dev:
|
||||
@@ -68,6 +81,31 @@ provider:
|
||||
httpApi: # This creates a cheaper, faster "HTTP API" Gateway
|
||||
cors: true # Automatically configures CORS
|
||||
|
||||
# Ensure all Lambdas can reach the shared RDS Proxy in the infra VPC
|
||||
vpc:
|
||||
securityGroupIds:
|
||||
- ${cf:${self:custom.infra_stack}.LambdaSecurityGroupId}
|
||||
subnetIds:
|
||||
- ${cf:${self:custom.infra_stack}.PrivateSubnetAId}
|
||||
- ${cf:${self:custom.infra_stack}.PrivateSubnetBId}
|
||||
|
||||
# Default DB connection settings for all Lambdas (used by src/lib/db.ts)
|
||||
environment:
|
||||
DB_HOST: ${self:custom.db.host}
|
||||
DB_PORT: ${self:custom.db.port}
|
||||
DB_NAME: ${self:custom.db.name}
|
||||
DB_SECRET_ARN: ${self:custom.db.secretArn}
|
||||
|
||||
# Allow Lambdas to fetch the DB credentials from Secrets Manager
|
||||
iam:
|
||||
role:
|
||||
statements:
|
||||
- Effect: Allow
|
||||
Action:
|
||||
- secretsmanager:GetSecretValue
|
||||
Resource:
|
||||
- ${self:custom.db.secretArn}
|
||||
|
||||
build:
|
||||
esbuild:
|
||||
bundle: true
|
||||
@@ -117,390 +155,26 @@ functions:
|
||||
handler: src/handlers/dbMigrate.handler
|
||||
timeout: 30
|
||||
memorySize: 512
|
||||
vpc:
|
||||
securityGroupIds:
|
||||
- Ref: LambdaSecurityGroup
|
||||
subnetIds:
|
||||
- Ref: PrivateSubnetA
|
||||
- Ref: PrivateSubnetB
|
||||
environment:
|
||||
DB_HOST:
|
||||
Fn::GetAtt:
|
||||
- DbProxy
|
||||
- Endpoint
|
||||
DB_PORT: 5432
|
||||
DB_NAME: ${param:db_name}
|
||||
DB_SECRET_ARN:
|
||||
Ref: DbSecret
|
||||
iamRoleStatements:
|
||||
- Effect: Allow
|
||||
Action:
|
||||
- secretsmanager:GetSecretValue
|
||||
Resource:
|
||||
- Ref: DbSecret
|
||||
- ${cf:${self:custom.infra_stack}.DbSecretArn}
|
||||
|
||||
dbPing:
|
||||
handler: src/handlers/dbPing.handler
|
||||
timeout: 15
|
||||
memorySize: 256
|
||||
vpc:
|
||||
securityGroupIds:
|
||||
- Ref: LambdaSecurityGroup
|
||||
subnetIds:
|
||||
- Ref: PrivateSubnetA
|
||||
- Ref: PrivateSubnetB
|
||||
environment:
|
||||
DB_HOST:
|
||||
Fn::GetAtt:
|
||||
- DbProxy
|
||||
- Endpoint
|
||||
DB_PORT: 5432
|
||||
DB_NAME: ${param:db_name}
|
||||
DB_SECRET_ARN:
|
||||
Ref: DbSecret
|
||||
iamRoleStatements:
|
||||
- Effect: Allow
|
||||
Action:
|
||||
- secretsmanager:GetSecretValue
|
||||
Resource:
|
||||
- Ref: DbSecret
|
||||
- ${cf:${self:custom.infra_stack}.DbSecretArn}
|
||||
|
||||
resources:
|
||||
Resources:
|
||||
EsdpVpc:
|
||||
Type: AWS::EC2::VPC
|
||||
Properties:
|
||||
CidrBlock: 10.0.0.0/16
|
||||
EnableDnsSupport: true
|
||||
EnableDnsHostnames: true
|
||||
Tags:
|
||||
- Key: Name
|
||||
Value: ${self:service}-${sls:stage}-vpc
|
||||
|
||||
InternetGateway:
|
||||
Type: AWS::EC2::InternetGateway
|
||||
Properties:
|
||||
Tags:
|
||||
- Key: Name
|
||||
Value: ${self:service}-${sls:stage}-igw
|
||||
|
||||
VpcGatewayAttachment:
|
||||
Type: AWS::EC2::VPCGatewayAttachment
|
||||
Properties:
|
||||
VpcId:
|
||||
Ref: EsdpVpc
|
||||
InternetGatewayId:
|
||||
Ref: InternetGateway
|
||||
|
||||
PublicSubnetA:
|
||||
Type: AWS::EC2::Subnet
|
||||
Properties:
|
||||
VpcId:
|
||||
Ref: EsdpVpc
|
||||
AvailabilityZone:
|
||||
Fn::Select:
|
||||
- 0
|
||||
- Fn::GetAZs: ''
|
||||
CidrBlock: 10.0.0.0/24
|
||||
MapPublicIpOnLaunch: true
|
||||
Tags:
|
||||
- Key: Name
|
||||
Value: ${self:service}-${sls:stage}-public-a
|
||||
|
||||
PublicSubnetB:
|
||||
Type: AWS::EC2::Subnet
|
||||
Properties:
|
||||
VpcId:
|
||||
Ref: EsdpVpc
|
||||
AvailabilityZone:
|
||||
Fn::Select:
|
||||
- 1
|
||||
- Fn::GetAZs: ''
|
||||
CidrBlock: 10.0.1.0/24
|
||||
MapPublicIpOnLaunch: true
|
||||
Tags:
|
||||
- Key: Name
|
||||
Value: ${self:service}-${sls:stage}-public-b
|
||||
|
||||
PrivateSubnetA:
|
||||
Type: AWS::EC2::Subnet
|
||||
Properties:
|
||||
VpcId:
|
||||
Ref: EsdpVpc
|
||||
AvailabilityZone:
|
||||
Fn::Select:
|
||||
- 0
|
||||
- Fn::GetAZs: ''
|
||||
CidrBlock: 10.0.10.0/24
|
||||
MapPublicIpOnLaunch: false
|
||||
Tags:
|
||||
- Key: Name
|
||||
Value: ${self:service}-${sls:stage}-private-a
|
||||
|
||||
PrivateSubnetB:
|
||||
Type: AWS::EC2::Subnet
|
||||
Properties:
|
||||
VpcId:
|
||||
Ref: EsdpVpc
|
||||
AvailabilityZone:
|
||||
Fn::Select:
|
||||
- 1
|
||||
- Fn::GetAZs: ''
|
||||
CidrBlock: 10.0.11.0/24
|
||||
MapPublicIpOnLaunch: false
|
||||
Tags:
|
||||
- Key: Name
|
||||
Value: ${self:service}-${sls:stage}-private-b
|
||||
|
||||
PublicRouteTable:
|
||||
Type: AWS::EC2::RouteTable
|
||||
Properties:
|
||||
VpcId:
|
||||
Ref: EsdpVpc
|
||||
Tags:
|
||||
- Key: Name
|
||||
Value: ${self:service}-${sls:stage}-public-rt
|
||||
|
||||
PublicRoute:
|
||||
Type: AWS::EC2::Route
|
||||
DependsOn: VpcGatewayAttachment
|
||||
Properties:
|
||||
RouteTableId:
|
||||
Ref: PublicRouteTable
|
||||
DestinationCidrBlock: 0.0.0.0/0
|
||||
GatewayId:
|
||||
Ref: InternetGateway
|
||||
|
||||
PublicSubnetARouteTableAssociation:
|
||||
Type: AWS::EC2::SubnetRouteTableAssociation
|
||||
Properties:
|
||||
SubnetId:
|
||||
Ref: PublicSubnetA
|
||||
RouteTableId:
|
||||
Ref: PublicRouteTable
|
||||
|
||||
PublicSubnetBRouteTableAssociation:
|
||||
Type: AWS::EC2::SubnetRouteTableAssociation
|
||||
Properties:
|
||||
SubnetId:
|
||||
Ref: PublicSubnetB
|
||||
RouteTableId:
|
||||
Ref: PublicRouteTable
|
||||
|
||||
NatEip:
|
||||
Type: AWS::EC2::EIP
|
||||
Properties:
|
||||
Domain: vpc
|
||||
|
||||
NatGateway:
|
||||
Type: AWS::EC2::NatGateway
|
||||
Properties:
|
||||
AllocationId:
|
||||
Fn::GetAtt:
|
||||
- NatEip
|
||||
- AllocationId
|
||||
SubnetId:
|
||||
Ref: PublicSubnetA
|
||||
Tags:
|
||||
- Key: Name
|
||||
Value: ${self:service}-${sls:stage}-nat
|
||||
|
||||
PrivateRouteTable:
|
||||
Type: AWS::EC2::RouteTable
|
||||
Properties:
|
||||
VpcId:
|
||||
Ref: EsdpVpc
|
||||
Tags:
|
||||
- Key: Name
|
||||
Value: ${self:service}-${sls:stage}-private-rt
|
||||
|
||||
PrivateRoute:
|
||||
Type: AWS::EC2::Route
|
||||
Properties:
|
||||
RouteTableId:
|
||||
Ref: PrivateRouteTable
|
||||
DestinationCidrBlock: 0.0.0.0/0
|
||||
NatGatewayId:
|
||||
Ref: NatGateway
|
||||
|
||||
PrivateSubnetARouteTableAssociation:
|
||||
Type: AWS::EC2::SubnetRouteTableAssociation
|
||||
Properties:
|
||||
SubnetId:
|
||||
Ref: PrivateSubnetA
|
||||
RouteTableId:
|
||||
Ref: PrivateRouteTable
|
||||
|
||||
PrivateSubnetBRouteTableAssociation:
|
||||
Type: AWS::EC2::SubnetRouteTableAssociation
|
||||
Properties:
|
||||
SubnetId:
|
||||
Ref: PrivateSubnetB
|
||||
RouteTableId:
|
||||
Ref: PrivateRouteTable
|
||||
|
||||
LambdaSecurityGroup:
|
||||
Type: AWS::EC2::SecurityGroup
|
||||
Properties:
|
||||
GroupDescription: ${self:service}-${sls:stage} Lambda security group
|
||||
VpcId:
|
||||
Ref: EsdpVpc
|
||||
SecurityGroupEgress:
|
||||
- IpProtocol: -1
|
||||
CidrIp: 0.0.0.0/0
|
||||
Tags:
|
||||
- Key: Name
|
||||
Value: ${self:service}-${sls:stage}-lambda-sg
|
||||
|
||||
ProxySecurityGroup:
|
||||
Type: AWS::EC2::SecurityGroup
|
||||
Properties:
|
||||
GroupDescription: ${self:service}-${sls:stage} RDS proxy security group
|
||||
VpcId:
|
||||
Ref: EsdpVpc
|
||||
SecurityGroupIngress:
|
||||
- IpProtocol: tcp
|
||||
FromPort: 5432
|
||||
ToPort: 5432
|
||||
SourceSecurityGroupId:
|
||||
Ref: LambdaSecurityGroup
|
||||
- IpProtocol: tcp
|
||||
FromPort: 5432
|
||||
ToPort: 5432
|
||||
CidrIp: 70.36.57.88/32
|
||||
SecurityGroupEgress:
|
||||
- IpProtocol: -1
|
||||
CidrIp: 0.0.0.0/0
|
||||
Tags:
|
||||
- Key: Name
|
||||
Value: ${self:service}-${sls:stage}-proxy-sg
|
||||
|
||||
RdsSecurityGroup:
|
||||
Type: AWS::EC2::SecurityGroup
|
||||
Properties:
|
||||
GroupDescription: ${self:service}-${sls:stage} RDS security group
|
||||
VpcId:
|
||||
Ref: EsdpVpc
|
||||
SecurityGroupIngress:
|
||||
- IpProtocol: tcp
|
||||
FromPort: 5432
|
||||
ToPort: 5432
|
||||
SourceSecurityGroupId:
|
||||
Ref: ProxySecurityGroup
|
||||
- IpProtocol: tcp
|
||||
FromPort: 5432
|
||||
ToPort: 5432
|
||||
CidrIp: 70.36.57.88/32
|
||||
Tags:
|
||||
- Key: Name
|
||||
Value: ${self:service}-${sls:stage}-rds-sg
|
||||
|
||||
DbSubnetGroup:
|
||||
Type: AWS::RDS::DBSubnetGroup
|
||||
Properties:
|
||||
DBSubnetGroupDescription: ${self:service}-${sls:stage} DB subnet group
|
||||
SubnetIds:
|
||||
- Ref: PrivateSubnetA
|
||||
- Ref: PrivateSubnetB
|
||||
- Ref: PublicSubnetA
|
||||
- Ref: PublicSubnetB
|
||||
|
||||
DbSecret:
|
||||
Type: AWS::SecretsManager::Secret
|
||||
Properties:
|
||||
Description: ${self:service}-${sls:stage} RDS master credentials
|
||||
GenerateSecretString:
|
||||
SecretStringTemplate: '{"username":"esdp_admin"}'
|
||||
GenerateStringKey: password
|
||||
PasswordLength: 32
|
||||
ExcludeCharacters: '"@/\\'
|
||||
|
||||
DbProxyRole:
|
||||
Type: AWS::IAM::Role
|
||||
Properties:
|
||||
AssumeRolePolicyDocument:
|
||||
Version: '2012-10-17'
|
||||
Statement:
|
||||
- Effect: Allow
|
||||
Principal:
|
||||
Service:
|
||||
- rds.amazonaws.com
|
||||
Action:
|
||||
- sts:AssumeRole
|
||||
Policies:
|
||||
- PolicyName: ${self:service}-${sls:stage}-db-proxy-secrets
|
||||
PolicyDocument:
|
||||
Version: '2012-10-17'
|
||||
Statement:
|
||||
- Effect: Allow
|
||||
Action:
|
||||
- secretsmanager:GetSecretValue
|
||||
Resource:
|
||||
- Ref: DbSecret
|
||||
|
||||
DbProxy:
|
||||
Type: AWS::RDS::DBProxy
|
||||
Properties:
|
||||
DBProxyName: ${self:service}-${sls:stage}-proxy
|
||||
EngineFamily: POSTGRESQL
|
||||
IdleClientTimeout: 1800
|
||||
RequireTLS: true
|
||||
RoleArn:
|
||||
Fn::GetAtt:
|
||||
- DbProxyRole
|
||||
- Arn
|
||||
VpcSubnetIds:
|
||||
- Ref: PrivateSubnetA
|
||||
- Ref: PrivateSubnetB
|
||||
VpcSecurityGroupIds:
|
||||
- Ref: ProxySecurityGroup
|
||||
Auth:
|
||||
- AuthScheme: SECRETS
|
||||
SecretArn:
|
||||
Ref: DbSecret
|
||||
IAMAuth: DISABLED
|
||||
|
||||
DbProxyTargetGroup:
|
||||
Type: AWS::RDS::DBProxyTargetGroup
|
||||
Properties:
|
||||
DBProxyName:
|
||||
Ref: DbProxy
|
||||
TargetGroupName: default
|
||||
DBInstanceIdentifiers:
|
||||
- Ref: PostgresDb
|
||||
ConnectionPoolConfigurationInfo:
|
||||
MaxConnectionsPercent: 75
|
||||
MaxIdleConnectionsPercent: 50
|
||||
ConnectionBorrowTimeout: 120
|
||||
|
||||
PostgresDb:
|
||||
Type: AWS::RDS::DBInstance
|
||||
DeletionPolicy: Snapshot
|
||||
UpdateReplacePolicy: Snapshot
|
||||
Properties:
|
||||
DBInstanceIdentifier: ${self:service}-${sls:stage}-postgres
|
||||
Engine: postgres
|
||||
# EngineVersion intentionally omitted so AWS uses the current default/latest for RDS Postgres.
|
||||
AutoMinorVersionUpgrade: true
|
||||
DBInstanceClass: db.t4g.micro
|
||||
AllocatedStorage: 20
|
||||
StorageType: gp3
|
||||
StorageEncrypted: true
|
||||
PubliclyAccessible: true
|
||||
MultiAZ: false
|
||||
DBName: ${param:db_name}
|
||||
BackupRetentionPeriod: 7
|
||||
CopyTagsToSnapshot: true
|
||||
DeletionProtection: true
|
||||
VPCSecurityGroups:
|
||||
- Ref: RdsSecurityGroup
|
||||
DBSubnetGroupName:
|
||||
Ref: DbSubnetGroup
|
||||
MasterUsername:
|
||||
Fn::Sub: '{{resolve:secretsmanager:${DbSecret}::username}}'
|
||||
MasterUserPassword:
|
||||
Fn::Sub: '{{resolve:secretsmanager:${DbSecret}::password}}'
|
||||
|
||||
UploadBucket:
|
||||
Type: AWS::S3::Bucket
|
||||
Properties:
|
||||
@@ -514,24 +188,3 @@ resources:
|
||||
- POST
|
||||
AllowedHeaders:
|
||||
- '*'
|
||||
|
||||
Outputs:
|
||||
DbEndpointAddress:
|
||||
Value:
|
||||
Fn::GetAtt:
|
||||
- PostgresDb
|
||||
- Endpoint.Address
|
||||
DbEndpointPort:
|
||||
Value:
|
||||
Fn::GetAtt:
|
||||
- PostgresDb
|
||||
- Endpoint.Port
|
||||
DbSecretArn:
|
||||
Value:
|
||||
Ref: DbSecret
|
||||
|
||||
DbProxyEndpoint:
|
||||
Value:
|
||||
Fn::GetAtt:
|
||||
- DbProxy
|
||||
- Endpoint
|
||||
|
||||
Reference in New Issue
Block a user