Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
Resource: [cf.join('',
['arn:aws:s3:::',
cf.select(1,
cf.split('s3://', cf.ref('DatabaseDump'))
)]
)]
}]
}
}],
RoleName: cf.join('-', [cf.stackName, 'ec2', 'database-dump-access', 'role'])
}
},
TaskingManagerEC2InstanceProfile: {
Type: "AWS::IAM::InstanceProfile",
Properties: {
Roles: cf.if('DatabaseDumpFileGiven', [cf.ref('TaskingManagerDatabaseDumpAccessRole')], [cf.ref('TaskingManagerEC2Role')]),
InstanceProfileName: cf.join('-', [cf.stackName, 'ec2', 'instance', 'profile'])
}
},
TaskingManagerLoadBalancer: {
Type: 'AWS::ElasticLoadBalancingV2::LoadBalancer',
Properties: {
Name: cf.stackName,
SecurityGroups: [cf.importValue(cf.join('-', ['hotosm-network-production', cf.ref('NetworkEnvironment'), 'elbs-security-group', cf.region]))],
Subnets: cf.split(',', cf.ref('ELBSubnets')),
Type: 'application'
}
},
TaskingManagerTargetGroup: {
Type: 'AWS::ElasticLoadBalancingV2::TargetGroup',
Properties: {
HealthCheckIntervalSeconds: 60,
Resource: [cf.join('',
['arn:aws:s3:::',
cf.select(1,
cf.split('s3://', cf.ref('DatabaseDump'))
)]
)]
}]
}
}],
RoleName: cf.join('-', [cf.stackName, 'ec2', 'database-dump-access', 'role'])
}
},
TaskingManagerEC2InstanceProfile: {
Type: "AWS::IAM::InstanceProfile",
Properties: {
Roles: cf.if('DatabaseDumpFileGiven', [cf.ref('TaskingManagerEC2Role'), cf.ref('TaskingManagerDatabaseDumpAccessRole')], [cf.ref('TaskingManagerEC2Role')]),
InstanceProfileName: cf.join('-', [cf.stackName, 'ec2', 'instance', 'profile'])
}
},
TaskingManagerLoadBalancer: {
Type: 'AWS::ElasticLoadBalancingV2::LoadBalancer',
Properties: {
Name: cf.stackName,
SecurityGroups: [cf.importValue(cf.join('-', ['hotosm-network-production', cf.ref('Environment'), 'elbs-security-group', cf.region]))],
Subnets: cf.split(',', cf.ref('ELBSubnets')),
Type: 'application'
}
},
TaskingManagerTargetGroup: {
Type: 'AWS::ElasticLoadBalancingV2::TargetGroup',
Properties: {
HealthCheckIntervalSeconds: 60,
StatusCode: 'HTTP_301'
}
}],
LoadBalancerArn: cf.ref('TaskingManagerLoadBalancer'),
Port: 80,
Protocol: 'HTTP'
}
},
TaskingManagerRDS: {
Type: 'AWS::RDS::DBInstance',
Properties: {
Engine: 'postgres',
DBName: cf.if('UseASnapshot', cf.noValue, cf.ref('PostgresDB')),
EngineVersion: '9.5.15',
MasterUsername: cf.if('UseASnapshot', cf.noValue, cf.ref('PostgresUser')),
MasterUserPassword: cf.if('UseASnapshot', cf.noValue, cf.ref('PostgresPassword')),
AllocatedStorage: cf.ref('DatabaseSize'),
StorageType: 'gp2',
DBInstanceClass: 'db.m3.large', //rethink here
DBSnapshotIdentifier: cf.if('UseASnapshot', cf.ref('DBSnapshot'), cf.noValue),
VPCSecurityGroups: [cf.importValue(cf.join('-', ['hotosm-network-production', cf.ref('Environment'), 'ec2s-security-group', cf.region]))],
}
}
};
module.exports = { Parameters, Resources, Conditions }
cf.sub('export TM_SMTP_USER="${TaskingManagerSMTPUser}"'),
cf.sub('export TM_DEFAULT_CHANGESET_COMMENT="${TaskingManagerDefaultChangesetComment}"'),
cf.sub('export TM_MATOMO_ID="${MatomoSiteID}"'),
cf.sub('export TM_MATOMO_ENDPOINT="${MatomoEndpoint}"'),
cf.sub('export TM_MAPBOX_TOKEN="${MapboxToken}"'),
cf.sub('export TM_ORG_NAME="${OrgName}"'),
cf.sub('export TM_ORG_CODE="${OrgCode}"'),
cf.sub('export TM_ORG_URL="${OrgUrl}"'),
cf.sub('export TM_ORG_PRIVACY_POLICY="${OrgPrivacyPolicy}"'),
cf.sub('export TM_ORG_TWITTER="${OrgTwitter}"'),
cf.sub('export TM_ORG_FB="${OrgFacebook}"'),
cf.sub('export TM_ORG_INSTAGRAM="${OrgInstagram}"'),
cf.sub('export TM_ORG_YOUTUBE="${OrgYoutube}"'),
cf.sub('export TM_ORG_GITHUB="${OrgGitHub}"'),
'psql "host=$POSTGRES_ENDPOINT dbname=$POSTGRES_DB user=$POSTGRES_USER password=$POSTGRES_PASSWORD" -c "CREATE EXTENSION IF NOT EXISTS postgis"',
cf.if('DatabaseDumpFileGiven', cf.sub('aws s3 cp ${DatabaseDump} dump.sql; sudo -u postgres psql "postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_ENDPOINT/$POSTGRES_DB" < dump.sql'), ''),
'./venv/bin/python3.6 manage.py db upgrade',
'cd frontend/',
'npm install',
'npm run build',
'cd ../',
'echo "------------------------------------------------------------"',
'gunicorn -b 0.0.0.0:8000 --worker-class gevent --workers 3 --threads 3 --timeout 179 manage:application &',
cf.sub('sudo cfn-init -v --stack ${AWS::StackName} --resource TaskingManagerLaunchConfiguration --region ${AWS::Region} --configsets default'),
cf.sub('cfn-signal --exit-code $? --region ${AWS::Region} --resource TaskingManagerASG --stack ${AWS::StackName}')
]),
KeyName: 'mbtiles'
}
},
TaskingManagerEC2Role: {
Type: 'AWS::IAM::Role',
Properties: {
StatusCode: 'HTTP_301'
}
}],
LoadBalancerArn: cf.ref('TaskingManagerLoadBalancer'),
Port: 80,
Protocol: 'HTTP'
}
},
TaskingManagerRDS: {
Type: 'AWS::RDS::DBInstance',
Properties: {
Engine: 'postgres',
DBName: cf.if('UseASnapshot', cf.noValue, cf.ref('PostgresDB')),
EngineVersion: '11.5',
MasterUsername: cf.if('UseASnapshot', cf.noValue, cf.ref('PostgresUser')),
MasterUserPassword: cf.if('UseASnapshot', cf.noValue, cf.ref('PostgresPassword')),
AllocatedStorage: cf.ref('DatabaseSize'),
BackupRetentionPeriod: 10,
StorageType: 'gp2',
DBParameterGroupName: 'tm3-logging-postgres11',
EnableCloudwatchLogsExports: ['postgresql'],
DBInstanceClass: cf.if('IsTaskingManagerProduction', 'db.t3.2xlarge', 'db.t2.small'),
DBSnapshotIdentifier: cf.if('UseASnapshot', cf.ref('DBSnapshot'), cf.noValue),
VPCSecurityGroups: [cf.importValue(cf.join('-', ['hotosm-network-production', cf.ref('NetworkEnvironment'), 'ec2s-security-group', cf.region]))],
}
}
};
module.exports = { Parameters, Resources, Conditions }
},
TaskingManagerRDS: {
Type: 'AWS::RDS::DBInstance',
Properties: {
Engine: 'postgres',
DBName: cf.if('UseASnapshot', cf.noValue, cf.ref('PostgresDB')),
EngineVersion: '11.5',
MasterUsername: cf.if('UseASnapshot', cf.noValue, cf.ref('PostgresUser')),
MasterUserPassword: cf.if('UseASnapshot', cf.noValue, cf.ref('PostgresPassword')),
AllocatedStorage: cf.ref('DatabaseSize'),
BackupRetentionPeriod: 10,
StorageType: 'gp2',
DBParameterGroupName: 'tm3-logging-postgres11',
EnableCloudwatchLogsExports: ['postgresql'],
DBInstanceClass: cf.if('IsTaskingManagerProduction', 'db.t3.2xlarge', 'db.t2.small'),
DBSnapshotIdentifier: cf.if('UseASnapshot', cf.ref('DBSnapshot'), cf.noValue),
VPCSecurityGroups: [cf.importValue(cf.join('-', ['hotosm-network-production', cf.ref('NetworkEnvironment'), 'ec2s-security-group', cf.region]))],
}
}
};
module.exports = { Parameters, Resources, Conditions }
UseASnapshot: cf.notEquals(cf.ref('DBSnapshot'), ''),
DatabaseDumpFileGiven: cf.notEquals(cf.ref('DatabaseDump'), ''),
IsTaskingManagerProduction: cf.equals(cf.ref('AutoscalingPolicy'), 'Production (max 12)'),
IsTaskingManagerDemo: cf.equals(cf.ref('AutoscalingPolicy'), 'Demo (max 3)')
};
const Resources = {
TaskingManagerASG: {
DependsOn: 'TaskingManagerLaunchConfiguration',
Type: 'AWS::AutoScaling::AutoScalingGroup',
Properties: {
AutoScalingGroupName: cf.stackName,
Cooldown: 600,
MinSize: cf.if('IsTaskingManagerProduction', 3, 1),
DesiredCapacity: cf.if('IsTaskingManagerProduction', 3, 1),
MaxSize: cf.if('IsTaskingManagerProduction', 12, cf.if('IsTaskingManagerDemo', 3, 1)),
HealthCheckGracePeriod: 600,
LaunchConfigurationName: cf.ref('TaskingManagerLaunchConfiguration'),
TargetGroupARNs: [ cf.ref('TaskingManagerTargetGroup') ],
HealthCheckType: 'EC2',
AvailabilityZones: ['us-east-1a', 'us-east-1b', 'us-east-1c', 'us-east-1d', 'us-east-1f']
},
UpdatePolicy: {
AutoScalingRollingUpdate: {
PauseTime: 'PT60M',
WaitOnResourceSignals: true
}
}
},
TaskingManagerScaleUp: {
Type: "AWS::AutoScaling::ScalingPolicy",
Properties: {
cf.sub('export NEW_RELIC_LICENSE=${NewRelicLicense}'),
cf.join('', ['export POSTGRES_ENDPOINT=', cf.if('UsePostgresEndpoint', cf.ref('PostgresEndpoint'), cf.getAtt('TaskingManagerRDS', 'Endpoint.Address'))]),
cf.sub('export POSTGRES_DB=${PostgresDB}'),
cf.sub('export POSTGRES_PASSWORD="${PostgresPassword}"'),
cf.sub('export POSTGRES_USER="${PostgresUser}"'),
cf.sub('export TM_APP_BASE_URL="${TaskingManagerAppBaseUrl}"'),
cf.sub('export TM_CONSUMER_KEY="${TaskingManagerConsumerKey}"'),
cf.sub('export TM_CONSUMER_SECRET="${TaskingManagerConsumerSecret}"'),
cf.sub('export TM_EMAIL_FROM_ADDRESS="${TaskingManagerEmailFromAddress}"'),
cf.sub('export TM_LOG_DIR="${TaskingManagerLogDirectory}"'),
cf.sub('export TM_SECRET="${TaskingManagerSecret}"'),
cf.sub('export TM_SMTP_HOST="${TaskingManagerSMTPHost}"'),
cf.sub('export TM_SMTP_PASSWORD="${TaskingManagerSMTPPassword}"'),
cf.sub('export TM_SMTP_PORT="${TaskingManagerSMTPPort}"'),
cf.sub('export TM_SMTP_USER="${TaskingManagerSMTPUser}"'),
cf.if('DatabaseDumpFileGiven', cf.sub('aws s3 cp ${DatabaseDump} dump.sql; psql "postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_ENDPOINT/$POSTGRES_DB" -f dump.sql'), ''),
'./venv/bin/python3.6 manage.py db upgrade',
'cd client/',
'npm install',
'gulp build',
'cd ../',
'echo "------------------------------------------------------------"',
'gunicorn -b 0.0.0.0:8000 --worker-class gevent --workers 3 --threads 3 --timeout 179 manage:application &',
cf.sub('cfn-signal --exit-code $? --region ${AWS::Region} --resource TaskingManagerASG --stack ${AWS::StackName}')
]),
KeyName: 'mbtiles'
}
},
TaskingManagerEC2Role: {
Type: 'AWS::IAM::Role',
Properties: {
AssumeRolePolicyDocument: {