Skip to content

Commit b472019

Browse files
author
vikasrohit
authored
Merge pull request #195 from topcoder-platform/feature/multi-service-deployment-squashed
Github issue#194, Separate task deployment for API and event bus consumers
2 parents 7b2ee49 + 356594f commit b472019

File tree

5 files changed

+81
-30
lines changed

5 files changed

+81
-30
lines changed

deploy.sh

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ AWS_ECS_CONTAINER_NAME="tc-project-service"
1111
AWS_REPOSITORY=$(eval "echo \$${ENV}_AWS_REPOSITORY")
1212
AWS_ECS_CLUSTER=$(eval "echo \$${ENV}_AWS_ECS_CLUSTER")
1313
AWS_ECS_SERVICE=$(eval "echo \$${ENV}_AWS_ECS_SERVICE")
14+
AWS_ECS_SERVICE_CONSUMERS=$(eval "echo \$${ENV}_AWS_ECS_SERVICE_CONSUMERS")
1415
AUTH_DOMAIN=$(eval "echo \$${ENV}_AUTH_DOMAIN")
1516
AUTH_SECRET=$(eval "echo \$${ENV}_AUTH_SECRET")
1617
VALID_ISSUERS=$(eval "echo \$${ENV}_VALID_ISSUERS")
@@ -29,9 +30,9 @@ configure_aws_cli() {
2930
# deploys the app to the ecs cluster
3031
deploy_cluster() {
3132

32-
make_task_def
33-
register_definition
34-
if [[ $(aws ecs update-service --cluster $AWS_ECS_CLUSTER --service $AWS_ECS_SERVICE --task-definition $revision | \
33+
make_task_def $1 $2 $3 $4
34+
register_definition $1
35+
if [[ $(aws ecs update-service --cluster $AWS_ECS_CLUSTER --service $1 --task-definition $revision | \
3536
$JQ '.service.taskDefinition') != $revision ]]; then
3637
echo "Error updating service."
3738
return 1
@@ -46,6 +47,7 @@ make_task_def(){
4647
"family": "%s",
4748
"requiresCompatibilities": ["EC2", "FARGATE"],
4849
"networkMode": "awsvpc",
50+
"taskRoleArn": "arn:aws:iam::%s:role/tc-project-service-ecs-task-role",
4951
"executionRoleArn": "arn:aws:iam::%s:role/ecsTaskExecutionRole",
5052
"cpu": "1024",
5153
"memory": "2048",
@@ -56,6 +58,7 @@ make_task_def(){
5658
"essential": true,
5759
"memory": 1536,
5860
"cpu": 768,
61+
"entryPoint": ["%s", "%s", "%s"],
5962
"environment": [
6063
{
6164
"name": "NODE_ENV",
@@ -85,14 +88,6 @@ make_task_def(){
8588
"name": "AWS_REGION",
8689
"value": "%s"
8790
},
88-
{
89-
"name": "AWS_ACCESS_KEY_ID",
90-
"value": "%s"
91-
},
92-
{
93-
"name": "AWS_SECRET_ACCESS_KEY",
94-
"value": "%s"
95-
},
9691
{
9792
"name": "AUTH_DOMAIN",
9893
"value": "%s"
@@ -253,12 +248,12 @@ make_task_def(){
253248
KAFKA_URL=$(eval "echo \$${ENV}_KAFKA_URL")
254249

255250

256-
task_def=$(printf "$task_template" $family $ACCOUNT_ID $AWS_ECS_CONTAINER_NAME $ACCOUNT_ID $AWS_REGION $AWS_REPOSITORY $CIRCLE_SHA1 $NODE_ENV $ENABLE_FILE_UPLOAD $LOG_LEVEL $CAPTURE_LOGS $LOGENTRIES_TOKEN $API_VERSION $AWS_REGION $AWS_ACCESS_KEY_ID $AWS_SECRET_ACCESS_KEY $AUTH_DOMAIN $AUTH_SECRET $VALID_ISSUERS $DB_MASTER_URL $MEMBER_SERVICE_ENDPOINT $IDENTITY_SERVICE_ENDPOINT $BUS_API_URL $MESSAGE_SERVICE_URL $SYSTEM_USER_CLIENT_ID $SYSTEM_USER_CLIENT_SECRET $PROJECTS_ES_URL $PROJECTS_ES_INDEX_NAME $RABBITMQ_URL $DIRECT_PROJECT_SERVICE_ENDPOINT $FILE_SERVICE_ENDPOINT $CONNECT_PROJECTS_URL $SEGMENT_ANALYTICS_KEY "$AUTH0_URL" "$AUTH0_AUDIENCE" $AUTH0_CLIENT_ID "$AUTH0_CLIENT_SECRET" $TOKEN_CACHE_TIME "$KAFKA_CLIENT_CERT" "$KAFKA_CLIENT_CERT_KEY" $KAFKA_GROUP_ID $KAFKA_URL $PORT $PORT $AWS_ECS_CLUSTER $AWS_REGION $NODE_ENV)
251+
task_def=$(printf "$task_template" $1 $ACCOUNT_ID $ACCOUNT_ID $AWS_ECS_CONTAINER_NAME $ACCOUNT_ID $AWS_REGION $AWS_REPOSITORY $CIRCLE_SHA1 $2 $3 $4 $NODE_ENV $ENABLE_FILE_UPLOAD $LOG_LEVEL $CAPTURE_LOGS $LOGENTRIES_TOKEN $API_VERSION $AWS_REGION $AUTH_DOMAIN $AUTH_SECRET $VALID_ISSUERS $DB_MASTER_URL $MEMBER_SERVICE_ENDPOINT $IDENTITY_SERVICE_ENDPOINT $BUS_API_URL $MESSAGE_SERVICE_URL $SYSTEM_USER_CLIENT_ID $SYSTEM_USER_CLIENT_SECRET $PROJECTS_ES_URL $PROJECTS_ES_INDEX_NAME $RABBITMQ_URL $DIRECT_PROJECT_SERVICE_ENDPOINT $FILE_SERVICE_ENDPOINT $CONNECT_PROJECTS_URL $SEGMENT_ANALYTICS_KEY "$AUTH0_URL" "$AUTH0_AUDIENCE" $AUTH0_CLIENT_ID "$AUTH0_CLIENT_SECRET" $TOKEN_CACHE_TIME "$KAFKA_CLIENT_CERT" "$KAFKA_CLIENT_CERT_KEY" $KAFKA_GROUP_ID $KAFKA_URL $PORT $PORT $AWS_ECS_CLUSTER $AWS_REGION $NODE_ENV)
257252
}
258253

259254
push_ecr_image(){
260255
eval $(aws ecr get-login --region $AWS_REGION --no-include-email)
261-
docker push $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$AWS_REPOSITORY:$CIRCLE_SHA1
256+
docker push $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$1:$CIRCLE_SHA1
262257
}
263258

264259
register_definition() {
@@ -273,13 +268,13 @@ register_definition() {
273268
check_service_status() {
274269
counter=0
275270
sleep 60
276-
servicestatus=`aws ecs describe-services --service $AWS_ECS_SERVICE --cluster $AWS_ECS_CLUSTER | $JQ '.services[].events[0].message'`
271+
servicestatus=`aws ecs describe-services --service $1 --cluster $AWS_ECS_CLUSTER | $JQ '.services[].events[0].message'`
277272
while [[ $servicestatus != *"steady state"* ]]
278273
do
279274
echo "Current event message : $servicestatus"
280275
echo "Waiting for 30 seconds to check the service status...."
281276
sleep 30
282-
servicestatus=`aws ecs describe-services --service $AWS_ECS_SERVICE --cluster $AWS_ECS_CLUSTER | $JQ '.services[].events[0].message'`
277+
servicestatus=`aws ecs describe-services --service $1 --cluster $AWS_ECS_CLUSTER | $JQ '.services[].events[0].message'`
283278
counter=`expr $counter + 1`
284279
if [[ $counter -gt $COUNTER_LIMIT ]] ; then
285280
echo "Service does not reach steady state within 10 minutes. Please check"
@@ -290,6 +285,10 @@ check_service_status() {
290285
}
291286

292287
configure_aws_cli
293-
push_ecr_image
294-
deploy_cluster
295-
check_service_status
288+
push_ecr_image $AWS_REPOSITORY
289+
deploy_cluster $AWS_ECS_SERVICE "npm" "run" "start"
290+
291+
deploy_cluster $AWS_ECS_SERVICE_CONSUMERS "npm" "run" "startKafkaConsumers"
292+
293+
check_service_status $AWS_ECS_SERVICE
294+
check_service_status $AWS_ECS_SERVICE_CONSUMERS

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"migrate:es": "./node_modules/.bin/babel-node migrations/seedElasticsearchIndex.js",
1616
"prestart": "npm run -s build",
1717
"start": "node dist",
18+
"startKafkaConsumers": "npm run -s build && node dist/index-kafka.js",
1819
"start:dev": "NODE_ENV=development PORT=8001 nodemon -w src --exec \"babel-node src --presets es2015\" | ./node_modules/.bin/bunyan",
1920
"test": "NODE_ENV=test npm run lint && NODE_ENV=test npm run sync:es && NODE_ENV=test npm run sync:db && NODE_ENV=test ./node_modules/.bin/istanbul cover ./node_modules/mocha/bin/_mocha -- --timeout 10000 --compilers js:babel-core/register $(find src -path '*spec.js*')",
2021
"test:watch": "NODE_ENV=test ./node_modules/.bin/mocha -w --compilers js:babel-core/register $(find src -path '*spec.js*')",
@@ -48,7 +49,7 @@
4849
"express-request-id": "^1.1.0",
4950
"express-sanitizer": "^1.0.2",
5051
"express-validation": "^0.6.0",
51-
"http-aws-es": "^1.1.3",
52+
"http-aws-es": "^4.0.0",
5253
"joi": "^8.0.5",
5354
"jsonwebtoken": "^8.3.0",
5455
"lodash": "^4.16.4",

src/index-kafka.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import _ from 'lodash';
2+
import config from 'config';
3+
import startKafkaConsumer from './services/kafkaConsumer';
4+
import { kafkaHandlers } from './events';
5+
import models from './models';
6+
7+
const coreLib = require('tc-core-library-js');
8+
9+
10+
// =======================
11+
// Loger =========
12+
// =======================
13+
let appName = 'tc-projects-consumer';
14+
switch (process.env.NODE_ENV.toLowerCase()) {
15+
case 'development':
16+
appName += '-dev';
17+
break;
18+
case 'qa':
19+
appName += '-qa';
20+
break;
21+
case 'production':
22+
default:
23+
appName += '-prod';
24+
break;
25+
}
26+
27+
const logger = coreLib.logger({
28+
name: appName,
29+
level: _.get(config, 'logLevel', 'debug').toLowerCase(),
30+
captureLogs: config.get('captureLogs'),
31+
logentriesToken: _.get(config, 'logentriesToken', null),
32+
});
33+
34+
// =======================
35+
// Database =========
36+
// =======================
37+
logger.info('Registering models ... ', !!models);
38+
39+
/**
40+
* Handle server shutdown gracefully
41+
* @returns {undefined}
42+
*/
43+
function gracefulShutdown() {
44+
// TODO
45+
}
46+
process.on('SIGTERM', gracefulShutdown);
47+
process.on('SIGINT', gracefulShutdown);
48+
49+
const app = { logger, models };
50+
51+
module.exports = startKafkaConsumer(kafkaHandlers, app, logger);

src/services/index.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import config from 'config';
44
import RabbitMQService from './rabbitmq';
5-
import startKafkaConsumer from './kafkaConsumer';
6-
import { kafkaHandlers } from '../events';
5+
// import startKafkaConsumer from './kafkaConsumer';
6+
// import { kafkaHandlers } from '../events';
77

88
/**
99
* Responsible for establishing connections to all external services
@@ -33,10 +33,10 @@ module.exports = (fapp, logger) => {
3333
.then(() => {
3434
logger.info('RabbitMQ service initialized');
3535
})
36-
.then(() => startKafkaConsumer(kafkaHandlers, app, logger))
37-
.then(() => {
38-
logger.info('Kafka consumer service initialized');
39-
})
36+
// .then(() => startKafkaConsumer(kafkaHandlers, app, logger))
37+
// .then(() => {
38+
// logger.info('Kafka consumer service initialized');
39+
// })
4040
.catch((err) => {
4141
logger.error('Error initializing services', err);
4242
// gracefulShutdown()

src/util.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import config from 'config';
1616
import urlencode from 'urlencode';
1717
import elasticsearch from 'elasticsearch';
1818
import Promise from 'bluebird';
19-
import AWS from 'aws-sdk';
19+
// import AWS from 'aws-sdk';
2020

2121
import { ADMIN_ROLES, TOKEN_SCOPES } from './constants';
2222

@@ -317,10 +317,10 @@ _.assignIn(util, {
317317
apiVersion: config.get('elasticsearchConfig.apiVersion'),
318318
hosts: esHost,
319319
connectionClass: require('http-aws-es'), // eslint-disable-line global-require
320-
amazonES: {
321-
region: 'us-east-1',
322-
credentials: new AWS.EnvironmentCredentials('AWS'),
323-
},
320+
// amazonES: {
321+
// region: 'us-east-1',
322+
// credentials: new AWS.EnvironmentCredentials('AWS'),
323+
// },
324324
});
325325
} else {
326326
esClient = new elasticsearch.Client(_.cloneDeep(config.elasticsearchConfig));

0 commit comments

Comments
 (0)