diff --git a/ecspresso/reviewapps/dk-2267/cleanup.sh b/ecspresso/reviewapps/dk-2267/cleanup.sh new file mode 100644 index 000000000..a1821a342 --- /dev/null +++ b/ecspresso/reviewapps/dk-2267/cleanup.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +cd $(dirname $0) +find . -name "ecspresso.yml" | xargs -I{} -P10 ecspresso --config={} delete --force --terminate +sleep 10 # wait for ECS Services to be deleted +aws servicediscovery delete-service --id srv-oqkipfbr4ziqkm3m +aws servicediscovery delete-service --id srv-jmaafqsyirfxzub3 +aws elbv2 delete-rule --rule-arn arn:aws:elasticloadbalancing:us-west-2:607167088920:listener-rule/app/dreamkast-dev/122c5b4a47b64f9d/bc86e7b2e4bca8f5/7c307bcf778884b0 +aws elbv2 delete-target-group --target-group-arn arn:aws:elasticloadbalancing:us-west-2:607167088920:targetgroup/dreamkast-dev-dk-2267-dreamkast/2cf1b9eaf03aa206 diff --git a/ecspresso/reviewapps/dk-2267/const.libsonnet b/ecspresso/reviewapps/dk-2267/const.libsonnet new file mode 100644 index 000000000..48e832ae6 --- /dev/null +++ b/ecspresso/reviewapps/dk-2267/const.libsonnet @@ -0,0 +1,50 @@ +{ + "PR_NAME": "dk-2267", + "externalEndpoints": { + "dkApi": "https://api.dev.cloudnativedays.jp", + "dkWeaver": "https://dkw.dev.cloudnativedays.jp" + }, + "imageTags": { + "dreamkast_ecs": "77762b4dcf499f59716f096d62a1587e58603491", + "mysql": "8.0.33", + "redis": "6.0" + }, + "internalEndpoints": { + "rdb": "mysql-dk-2267.development.local", + "redis": "redis://redis-dk-2267.development.local" + }, + "privateSubnetIDs": [ + "subnet-05d0a81dafd9409f9", + "subnet-042770b2f29661e8e", + "subnet-0d95068828df7cc3e" + ], + "publicSubnetIDs": [ + "subnet-00709135a42bf907e", + "subnet-0d07831c8fc073511", + "subnet-033491d41490494b6" + ], + "region": "us-west-2", + "s3": { + "dreamkast": { + "name": "dreamkast-dev-bucket", + "region": "us-west-2" + } + }, + "secretManager": { + "dk": "dreamkast/reviewapp-env-yGJKrj", + "railsApp": "dreamkast/rails-app-secret-SqidNC" + }, + "sentry": { + "dsn": "TODO" + }, + "serviceDiscovery": { + "mysql": "srv-oqkipfbr4ziqkm3m", + "redis": "srv-jmaafqsyirfxzub3" + }, + "sqs": { + "fifo": "dreamkast-stg-fifo-queue" + }, + "targetGroupArn": { + "dk": "arn:aws:elasticloadbalancing:us-west-2:607167088920:targetgroup/dreamkast-dev-dk-2267-dreamkast/2cf1b9eaf03aa206" + } +} diff --git a/ecspresso/reviewapps/dk-2267/dreamkast-fifo-worker/ecspresso.yml b/ecspresso/reviewapps/dk-2267/dreamkast-fifo-worker/ecspresso.yml new file mode 100644 index 000000000..318f377a3 --- /dev/null +++ b/ecspresso/reviewapps/dk-2267/dreamkast-fifo-worker/ecspresso.yml @@ -0,0 +1,6 @@ +region: us-west-2 +cluster: dreamkast-dev +service: dk-2267-dreamkast-fifo-worker +service_definition: service-def.jsonnet +task_definition: task-def.jsonnet +timeout: 5m diff --git a/ecspresso/reviewapps/dk-2267/dreamkast-fifo-worker/service-def.jsonnet b/ecspresso/reviewapps/dk-2267/dreamkast-fifo-worker/service-def.jsonnet new file mode 100644 index 000000000..80d87370b --- /dev/null +++ b/ecspresso/reviewapps/dk-2267/dreamkast-fifo-worker/service-def.jsonnet @@ -0,0 +1,8 @@ +local dreamkast_fifo_worker = import '../../../base/dreamkast-fifo-worker.libsonnet'; +local const = import '../const.libsonnet'; + +dreamkast_fifo_worker.serviceDef( + region=const.region, + subnetIDs=const.privateSubnetIDs, + securityGroupID='sg-0140d2aeaaa5d6d07', // dreamkast-dev-ecs-dreamkast-fifo-worker +) diff --git a/ecspresso/reviewapps/dk-2267/dreamkast-fifo-worker/task-def.jsonnet b/ecspresso/reviewapps/dk-2267/dreamkast-fifo-worker/task-def.jsonnet new file mode 100644 index 000000000..5b6b01021 --- /dev/null +++ b/ecspresso/reviewapps/dk-2267/dreamkast-fifo-worker/task-def.jsonnet @@ -0,0 +1,26 @@ +local dreamkast_fifo_worker = import '../../../base/dreamkast-fifo-worker.libsonnet'; +local const = import '../const.libsonnet'; + +dreamkast_fifo_worker.taskDef( + family='dreamkast-dev-%s-fifo-worker' % [const.PR_NAME], + taskRoleName='dreamkast-dev-ecs-dreamkast-fifo-worker', + imageTag=const.imageTags.dreamkast_ecs, + + region=const.region, + rdbInternalEndpoint=const.internalEndpoints.rdb, + redisInternalEndpoint=const.internalEndpoints.redis, + + s3BucketName=const.s3.dreamkast.name, + s3BucketRegion=const.s3.dreamkast.region, + + sqsFifoQueueName=const.sqs.fifo, + + sentryDsn=const.sentry.dsn, + + railsAppSecretManagerName=const.secretManager.railsApp, + rdsSecretManagerName=const.secretManager.rds, + dreamkastSecretManagerName=const.secretManager.dk, + + enableLogging=true, + reviewapp=true, +) diff --git a/ecspresso/reviewapps/dk-2267/dreamkast/ecspresso.yml b/ecspresso/reviewapps/dk-2267/dreamkast/ecspresso.yml new file mode 100644 index 000000000..9c5db2db1 --- /dev/null +++ b/ecspresso/reviewapps/dk-2267/dreamkast/ecspresso.yml @@ -0,0 +1,6 @@ +region: us-west-2 +cluster: dreamkast-dev +service: dk-2267-dreamkast +service_definition: service-def.jsonnet +task_definition: task-def.jsonnet +timeout: 5m diff --git a/ecspresso/reviewapps/dk-2267/dreamkast/service-def.jsonnet b/ecspresso/reviewapps/dk-2267/dreamkast/service-def.jsonnet new file mode 100644 index 000000000..80d921a58 --- /dev/null +++ b/ecspresso/reviewapps/dk-2267/dreamkast/service-def.jsonnet @@ -0,0 +1,9 @@ +local dreamkast_dk = import '../../../base/dreamkast.libsonnet'; +local const = import '../const.libsonnet'; + +dreamkast_dk.serviceDef( + region=const.region, + subnetIDs=const.privateSubnetIDs, + securityGroupID='sg-00e734fea020b954d', // dreamkast-dev-ecs-dreamkast + targetGroupArn=const.targetGroupArn.dk, +) diff --git a/ecspresso/reviewapps/dk-2267/dreamkast/task-def.jsonnet b/ecspresso/reviewapps/dk-2267/dreamkast/task-def.jsonnet new file mode 100644 index 000000000..dfe66b346 --- /dev/null +++ b/ecspresso/reviewapps/dk-2267/dreamkast/task-def.jsonnet @@ -0,0 +1,28 @@ +local dreamkast = import '../../../base/dreamkast.libsonnet'; +local const = import '../const.libsonnet'; + +dreamkast.taskDef( + family='dreamkast-dev-%s-dk' % [const.PR_NAME], + taskRoleName='dreamkast-dev-ecs-dreamkast', + imageTag=const.imageTags.dreamkast_ecs, + + region=const.region, + dkApiEndpoint=const.externalEndpoints.dkApi, + dkWeaverEndpoint=const.externalEndpoints.dkWeaver, + rdbInternalEndpoint=const.internalEndpoints.rdb, + redisInternalEndpoint=const.internalEndpoints.redis, + + s3BucketName=const.s3.dreamkast.name, + s3BucketRegion=const.s3.dreamkast.region, + + sqsFifoQueueName=const.sqs.fifo, + + sentryDsn=const.sentry.dsn, + + railsAppSecretManagerName=const.secretManager.railsApp, + rdsSecretManagerName=const.secretManager.rds, + dreamkastSecretManagerName=const.secretManager.dk, + + onableLogging=true, + reviewapp=true, +) diff --git a/ecspresso/reviewapps/dk-2267/initialize.sh b/ecspresso/reviewapps/dk-2267/initialize.sh new file mode 100755 index 000000000..995f9ab34 --- /dev/null +++ b/ecspresso/reviewapps/dk-2267/initialize.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash + +cd $(dirname $0) + +# required the following commands: +# * aws +# * jq +# * jsonnet + +# variables +PR_NAME=${PR_NAME:?"PR_NAME must be specified"} +PR_NUMBER=${PR_NUMBER:?"PR_NUMBER must be specified"} +IMAGE_TAG=${IMAGE_TAG:?"IMAGE_TAG must be specified"} +LISTENER_RULE_PRIORITY_BASE=30000 +LISTENER_RULE_PRIORITY=$(( LISTENER_RULE_PRIORITY_BASE + PR_NUMBER )) + +VPC_ID="vpc-0f0d012967c635f34" +LISTENER_ARN="arn:aws:elasticloadbalancing:us-west-2:607167088920:listener/app/dreamkast-dev/122c5b4a47b64f9d/bc86e7b2e4bca8f5" +SERVICE_DISCOVERY_NAMESPACE="ns-53ijjrlltqf5r2gm" + + +if [ ! -f "cleanup.sh" ]; then +# create TargetGroup +TARGET_GROUP_ARN=$(aws elbv2 create-target-group \ + --name "dreamkast-dev-${PR_NAME}-dreamkast" \ + --target-type ip \ + --protocol HTTP \ + --port 3000 \ + --vpc-id ${VPC_ID} \ + --ip-address-type ipv4 \ + | jq -r ".TargetGroups[0].TargetGroupArn") + +# create ALB ListenerRule +LISTENER_RULE_ARN=$(aws elbv2 create-rule --listener-arn ${LISTENER_ARN} \ + --priority ${LISTENER_RULE_PRIORITY} \ + --conditions Field=host-header,Values="dreamkast-${PR_NAME}.dev.cloudnativedays.jp" \ + --actions Type=forward,TargetGroupArn=${TARGET_GROUP_ARN} \ + | jq -r ".Rules[] | select(.Priority == \"${LISTENER_RULE_PRIORITY}\") | .RuleArn") + +# create ServiceDiscovery Services +SERVICE_ID_MYSQL=$(aws servicediscovery create-service \ + --name "mysql-${PR_NAME}" \ + --dns-config "NamespaceId="${SERVICE_DISCOVERY_NAMESPACE}",DnsRecords=[{Type="A",TTL="10"}]" \ + --health-check-custom-config FailureThreshold=1 \ + | jq -r ".Service.Id") + +SERVICE_ID_REDIS=$(aws servicediscovery create-service \ + --name "redis-${PR_NAME}" \ + --dns-config "NamespaceId="${SERVICE_DISCOVERY_NAMESPACE}",DnsRecords=[{Type="A",TTL="10"}]" \ + --health-check-custom-config FailureThreshold=1 \ + | jq -r ".Service.Id") + +# replace variables in each ecspresso.yml +find . -name ecspresso.yml | xargs -I{} sed -i -e 's/__PR_NAME__/'${PR_NAME}'/g' {} + +# replace variables in const.libsonnet +cat << _EOL_ | jsonnet - > ./const.libsonnet.tmp +local const = import './const.libsonnet'; + +const + { + PR_NAME: "${PR_NAME}", + targetGroupArn: { + dk: "${TARGET_GROUP_ARN}", + }, + serviceDiscovery: { + mysql: "${SERVICE_ID_MYSQL}", + redis: "${SERVICE_ID_REDIS}", + }, + imageTags: const.imageTags + { + dreamkast_ecs: "${IMAGE_TAG}", + }, +} +_EOL_ +mv const.libsonnet.tmp const.libsonnet + +# create cleanup.sh +cat << _EOF_ > ./cleanup.sh +#!/usr/bin/env bash + +cd \$(dirname \$0) +find . -name "ecspresso.yml" | xargs -I{} -P10 ecspresso --config={} delete --force --terminate +sleep 10 # wait for ECS Services to be deleted +aws servicediscovery delete-service --id ${SERVICE_ID_MYSQL} +aws servicediscovery delete-service --id ${SERVICE_ID_REDIS} +aws elbv2 delete-rule --rule-arn ${LISTENER_RULE_ARN} +aws elbv2 delete-target-group --target-group-arn ${TARGET_GROUP_ARN} +_EOF_ + +else +# update imageTags +jsonnet const.libsonnet \ + | jq ".imageTags.dreamkast_ecs|=\"${IMAGE_TAG}\"" \ + > const.libsonnet.tmp +mv const.libsonnet.tmp const.libsonnet + +fi diff --git a/ecspresso/reviewapps/dk-2267/mysql/ecspresso.yml b/ecspresso/reviewapps/dk-2267/mysql/ecspresso.yml new file mode 100644 index 000000000..2ebe410c6 --- /dev/null +++ b/ecspresso/reviewapps/dk-2267/mysql/ecspresso.yml @@ -0,0 +1,6 @@ +region: us-west-2 +cluster: dreamkast-dev +service: dk-2267-mysql +service_definition: service-def.jsonnet +task_definition: task-def.jsonnet +timeout: 5m diff --git a/ecspresso/reviewapps/dk-2267/mysql/service-def.jsonnet b/ecspresso/reviewapps/dk-2267/mysql/service-def.jsonnet new file mode 100644 index 000000000..cdc371858 --- /dev/null +++ b/ecspresso/reviewapps/dk-2267/mysql/service-def.jsonnet @@ -0,0 +1,9 @@ +local redis = import '../../../base/mysql.libsonnet'; +local const = import '../const.libsonnet'; + +redis.serviceDef( + region=const.region, + subnetIDs=const.privateSubnetIDs, + securityGroupID='sg-0e0029eb49f4d0455', // dreamkast-dev-ecs-mysql + serviceDiscoveryID=const.serviceDiscovery.mysql, +) diff --git a/ecspresso/reviewapps/dk-2267/mysql/task-def.jsonnet b/ecspresso/reviewapps/dk-2267/mysql/task-def.jsonnet new file mode 100644 index 000000000..f48b1e476 --- /dev/null +++ b/ecspresso/reviewapps/dk-2267/mysql/task-def.jsonnet @@ -0,0 +1,12 @@ +local mysql = import '../../../base/mysql.libsonnet'; +local const = import '../const.libsonnet'; + +mysql.taskDef( + family='dreamkast-stg-%s-mysql' % [const.PR_NAME], + taskRoleName='dreamkast-dev-ecs-mysql', + imageTag=const.imageTags.mysql, + + region=const.region, + + enableLogging=false, +) diff --git a/ecspresso/reviewapps/dk-2267/redis/ecspresso.yml b/ecspresso/reviewapps/dk-2267/redis/ecspresso.yml new file mode 100644 index 000000000..b4117c4c3 --- /dev/null +++ b/ecspresso/reviewapps/dk-2267/redis/ecspresso.yml @@ -0,0 +1,6 @@ +region: us-west-2 +cluster: dreamkast-dev +service: dk-2267-redis +service_definition: service-def.jsonnet +task_definition: task-def.jsonnet +timeout: 5m diff --git a/ecspresso/reviewapps/dk-2267/redis/service-def.jsonnet b/ecspresso/reviewapps/dk-2267/redis/service-def.jsonnet new file mode 100644 index 000000000..f1019125f --- /dev/null +++ b/ecspresso/reviewapps/dk-2267/redis/service-def.jsonnet @@ -0,0 +1,9 @@ +local redis = import '../../../base/redis.libsonnet'; +local const = import '../const.libsonnet'; + +redis.serviceDef( + region=const.region, + subnetIDs=const.privateSubnetIDs, + securityGroupID='sg-0ab649652e2dd6c9c', // dreamkast-dev-ecs-redis + serviceDiscoveryID=const.serviceDiscovery.redis, +) diff --git a/ecspresso/reviewapps/dk-2267/redis/task-def.jsonnet b/ecspresso/reviewapps/dk-2267/redis/task-def.jsonnet new file mode 100644 index 000000000..54752f9fb --- /dev/null +++ b/ecspresso/reviewapps/dk-2267/redis/task-def.jsonnet @@ -0,0 +1,12 @@ +local redis = import '../../../base/redis.libsonnet'; +local const = import '../const.libsonnet'; + +redis.taskDef( + family='dreamkast-stg-%s-redis' % [const.PR_NAME], + taskRoleName='dreamkast-dev-ecs-redis', + imageTag=const.imageTags.redis, + + region=const.region, + + enableLogging=false, +)