Skip to content

Commit 6ada7a3

Browse files
authored
Merge pull request #19 from aws-samples/cc-to-s3
fix: Migration from CodeCommit to S3
2 parents ec2ae6f + 403a377 commit 6ada7a3

14 files changed

+381
-217
lines changed

scripts/build-application.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
# build and push application services into ECR
44

5-
service_repos=("user" "product" "order" "rproxy")
5+
export DOCKER_DEFAULT_PLATFORM=linux/amd64
66

7+
service_repos=("user" "product" "order" "rproxy")
78

89
deploy_service () {
910

scripts/cleanup.sh

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,29 @@
11
#!/bin/bash -e
22

3+
confirm() {
4+
echo ""
5+
echo "=============================================="
6+
echo " ** WARNING! This ACTION IS IRREVERSIBLE! **"
7+
echo "=============================================="
8+
echo ""
9+
echo "You are about to delete all SaaS ECS reference Architecture resources."
10+
echo "Do you want to continue?"
11+
read -rp "[y/N] " response
12+
case "$response" in
13+
[yY][eE][sS]|[yY]) return 0 ;;
14+
*) return 1 ;;
15+
esac
16+
}
17+
18+
if ! confirm; then
19+
echo "Cleanup cancelled"
20+
exit 1
21+
fi
22+
23+
export REGION=$(aws ec2 describe-availability-zones --output text --query 'AvailabilityZones[0].[RegionName]')
24+
325
echo "$(date) emptying out buckets..."
4-
for i in $(aws s3 ls | awk '{print $3}' | grep -E "^tenant-update-stack-*|^controlplane-stack-*|^coreappplane-*"); do
26+
for i in $(aws s3 ls | awk '{print $3}' | grep -E "^tenant-update-stack-*|^controlplane-stack-*|^core-appplane-*|^saas-reference-architecture-*"); do
527
echo "$(date) emptying out s3 bucket with name s3://${i}..."
628
aws s3 rm --recursive "s3://${i}"
729

@@ -16,7 +38,7 @@ cd ../server
1638
npm install
1739

1840
export CDK_PARAM_SYSTEM_ADMIN_EMAIL="NA"
19-
export CDK_PARAM_CODE_COMMIT_REPOSITORY_NAME="saas-reference-architecture-ecs"
41+
export CDK_PARAM_S3_BUCKET_NAME="saas-reference-architecture-ecs-$REGION"
2042
export CDK_PARAM_COMMIT_ID="NA"
2143
export CDK_PARAM_REG_API_GATEWAY_URL="NA"
2244
export CDK_PARAM_EVENT_BUS_ARN=arn:aws:service:::resource
@@ -29,6 +51,30 @@ export CDK_PARAM_OFFBOARDING_DETAIL_TYPE="NA"
2951
export CDK_PARAM_DEPROVISIONING_DETAIL_TYPE="NA"
3052
export CDK_PARAM_TIER='basic'
3153

54+
TEMP_FILE=$(mktemp)
55+
# Deleting object version..."
56+
echo "Deleting Provision sourcecode Object Versions..."
57+
versions=$(aws s3api list-object-versions --bucket $CDK_PARAM_S3_BUCKET_NAME --output json \
58+
| jq -r '.Versions | length')
59+
60+
if [ "$versions" -gt 0 ]; then
61+
aws s3api list-object-versions --bucket $CDK_PARAM_S3_BUCKET_NAME --output json \
62+
| jq '{"Objects": [.Versions[] | {Key: .Key, VersionId: .VersionId}]}' > $TEMP_FILE
63+
aws s3api delete-objects --bucket $CDK_PARAM_S3_BUCKET_NAME --delete file://$TEMP_FILE
64+
fi
65+
66+
# Deleting object markers
67+
echo "Deleting Provision sourcecode Object Markers..."
68+
delete_markers=$(aws s3api list-object-versions --bucket $CDK_PARAM_S3_BUCKET_NAME --output json \
69+
| jq -r '.DeleteMarkers | length')
70+
71+
if [ "$delete_markers" -gt 0 ]; then
72+
aws s3api list-object-versions --bucket $CDK_PARAM_S3_BUCKET_NAME --output json \
73+
| jq '{"Objects": [.DeleteMarkers[] | {Key: .Key, VersionId: .VersionId}]}' > $TEMP_FILE
74+
aws s3api delete-objects --bucket $CDK_PARAM_S3_BUCKET_NAME --delete file://$TEMP_FILE
75+
fi
76+
77+
3278
echo "$(date) cleaning up tenants..."
3379
next_token=""
3480
STACK_STATUS_FILTER="CREATE_COMPLETE ROLLBACK_COMPLETE UPDATE_COMPLETE UPDATE_ROLLBACK_COMPLETE IMPORT_COMPLETE IMPORT_ROLLBACK_COMPLETE"
@@ -65,11 +111,6 @@ done
65111

66112
npx cdk destroy --all --force
67113

68-
if aws codecommit get-repository --repository-name $CDK_PARAM_CODE_COMMIT_REPOSITORY_NAME; then
69-
DELETE_REPO=$(aws codecommit delete-repository --repository-name $CDK_PARAM_CODE_COMMIT_REPOSITORY_NAME)
70-
echo "$DELETE_REPO"
71-
fi
72-
73114
echo "$(date) cleaning up user pools..."
74115
next_token=""
75116
while true; do
@@ -104,7 +145,7 @@ done
104145

105146

106147
echo "$(date) removing buckets..."
107-
for i in $(aws s3 ls | awk '{print $3}' | grep -E "^tenant-update-stack-*|^controlplane-stack-*|^coreappplane-*"); do
148+
for i in $(aws s3 ls | awk '{print $3}' | grep -E "^tenant-update-stack-*|^controlplane-stack-*|^core-appplane-*|^saas-reference-architecture-*"); do
108149
echo "$(date) removing s3 bucket with name s3://${i}..."
109150
aws s3 rm --recursive "s3://${i}"
110151
aws s3 rb --force "s3://${i}" #delete in stack

scripts/deprovision-tenant.sh

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ sudo npm install -g aws-cdk
88
sudo yum install -y jq
99
sudo yum install -y python3-pip
1010
sudo python3 -m pip install --upgrade setuptools
11-
sudo python3 -m pip install git-remote-codecommit
1211

1312
# Enable nocasematch option
1413
shopt -s nocasematch
@@ -19,6 +18,8 @@ export CDK_PARAM_TENANT_ID=$tenantId
1918
export TIER=$tier
2019
export CDK_PARAM_TIER=$TIER
2120

21+
export REGION=$(aws ec2 describe-availability-zones --output text --query 'AvailabilityZones[0].[RegionName]')
22+
export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
2223

2324
# Define variables
2425
STACK_NAME="tenant-template-stack-basic"
@@ -82,21 +83,22 @@ if [[ $TIER == "PREMIUM" || $TIER == "ADVANCED" ]]; then
8283
--table-name $TENANT_STACK_MAPPING_TABLE \
8384
--key "{\"tenantId\": {\"S\": \"$CDK_PARAM_TENANT_ID\"}}" \
8485
--query 'Item.stackName.S')
85-
86+
STACK_NAME=$(sed -e 's/^"//' -e 's/"$//' <<<$STACK_NAME)
8687
echo "Stack name from $TENANT_STACK_MAPPING_TABLE is $STACK_NAME"
87-
# Clone the ecs reference solution repository
88-
export CDK_PARAM_CODE_COMMIT_REPOSITORY_NAME="saas-reference-architecture-ecs"
89-
git clone codecommit://$CDK_PARAM_CODE_COMMIT_REPOSITORY_NAME
90-
cd $CDK_PARAM_CODE_COMMIT_REPOSITORY_NAME/server
88+
# Copy to S3 Bucket
89+
export CDK_PARAM_S3_BUCKET_NAME="saas-reference-architecture-ecs-$REGION"
90+
export CDK_SOURCE_NAME="source.zip"
91+
CDK_PARAM_COMMIT_ID=$(aws cloudformation describe-stacks --stack-name $STACK_NAME --query "Stacks[0].Outputs[?OutputKey=='S3SourceVersion'].OutputValue" --output text)
92+
93+
aws s3api get-object --bucket "$CDK_PARAM_S3_BUCKET_NAME" --key "$CDK_SOURCE_NAME" --version-id "$CDK_PARAM_COMMIT_ID" "$CDK_SOURCE_NAME" 2>&1
94+
unzip $CDK_SOURCE_NAME
95+
cd ./server
9196

92-
export ECR_REGION=$(aws ec2 describe-availability-zones --output text --query 'AvailabilityZones[0].[RegionName]')
93-
export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
94-
sed "s/<REGION>/$ECR_REGION/g; s/<ACCOUNT_ID>/$ACCOUNT_ID/g" ./service-info.txt > ./lib/service-info.json
97+
sed "s/<REGION>/$REGION/g; s/<ACCOUNT_ID>/$ACCOUNT_ID/g" ./service-info.txt > ./lib/service-info.json
9598

9699
npm install
97100

98101
export CDK_PARAM_SYSTEM_ADMIN_EMAIL="NA"
99-
export CDK_PARAM_COMMIT_ID="NA"
100102
export CDK_PARAM_REG_API_GATEWAY_URL="NA"
101103
export CDK_PARAM_EVENT_BUS_ARN=arn:aws:service:::resource
102104
export CDK_PARAM_CONTROL_PLANE_SOURCE="NA"
@@ -114,7 +116,6 @@ else
114116
# Read tenant details from the cloudformation stack output parameters
115117
SAAS_APP_USERPOOL_ID=$(aws cloudformation describe-stacks --stack-name $STACK_NAME --query "Stacks[0].Outputs[?OutputKey=='$USER_POOL_OUTPUT_PARAM_NAME'].OutputValue" --output text)
116118

117-
118119
NESTED_NAME=$(aws cloudformation describe-stack-resources --stack-name $STACK_NAME | jq -rc '.StackResources | .[] | select(.ResourceType=="AWS::CloudFormation::Stack") | .PhysicalResourceId | split("/")[1]')
119120

120121
PRODUCT_TABLE_NAME=$(aws cloudformation describe-stacks --stack-name $NESTED_NAME --query "Stacks[0].Outputs[?OutputKey=='$PRODUCT_TABLE_OUTPUT_PARAM_NAME'].OutputValue" --output text)
@@ -140,7 +141,6 @@ else
140141

141142
fi
142143

143-
144144
# Create JSON response of output parameters
145145
export tenantStatus="Deleted"
146146

scripts/install.sh

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,56 @@ if [[ -z "$CDK_PARAM_SYSTEM_ADMIN_EMAIL" ]]; then
77
exit 1
88
fi
99

10-
# Create CodeCommit repo
1110
REGION=$(aws ec2 describe-availability-zones --output text --query 'AvailabilityZones[0].[RegionName]') # Region setting
12-
export CDK_PARAM_CODE_COMMIT_REPOSITORY_NAME="saas-reference-architecture-ecs"
13-
if ! aws codecommit get-repository --repository-name $CDK_PARAM_CODE_COMMIT_REPOSITORY_NAME; then
14-
CREATE_REPO=$(aws codecommit create-repository --repository-name $CDK_PARAM_CODE_COMMIT_REPOSITORY_NAME --repository-description "ECS saas reference architecture repository")
15-
echo "$CREATE_REPO"
16-
fi
11+
export CDK_PARAM_S3_BUCKET_NAME="saas-reference-architecture-ecs-$REGION"
12+
13+
# Create S3 Bucket for provision source.
14+
15+
if aws s3api head-bucket --bucket $CDK_PARAM_S3_BUCKET_NAME 2>/dev/null; then
16+
echo "Bucket $CDK_PARAM_S3_BUCKET_NAME already exists."
17+
else
18+
echo "Bucket $CDK_PARAM_S3_BUCKET_NAME does not exist. Creating a new bucket in $REGION region"
19+
20+
if [ "$REGION" == "us-east-1" ]; then
21+
aws s3api create-bucket --bucket $CDK_PARAM_S3_BUCKET_NAME
22+
else
23+
aws s3api create-bucket \
24+
--bucket $CDK_PARAM_S3_BUCKET_NAME \
25+
--region "$REGION" \
26+
--create-bucket-configuration LocationConstraint="$REGION"
27+
fi
28+
29+
aws s3api put-bucket-versioning \
30+
--bucket $CDK_PARAM_S3_BUCKET_NAME \
31+
--versioning-configuration Status=Enabled
1732

18-
REPO_URL="codecommit::${REGION}://$CDK_PARAM_CODE_COMMIT_REPOSITORY_NAME" ## CodeCommit URL setting
19-
if ! git remote add cc "$REPO_URL"; then
20-
echo "Setting url to remote cc"
21-
git remote set-url cc "$REPO_URL"
33+
aws s3api put-public-access-block \
34+
--bucket $CDK_PARAM_S3_BUCKET_NAME \
35+
--public-access-block-configuration \
36+
BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true
37+
38+
if [ $? -eq 0 ]; then
39+
echo "Bucket $CDK_PARAM_S3_BUCKET_NAME created with versioning enabled."
40+
else
41+
echo "Error creating bucket $CDK_PARAM_S3_BUCKET_NAME with versioning enabled."
42+
exit 1
43+
fi
2244
fi
23-
git push cc "$(git branch --show-current)":main -f --no-verify
24-
export CDK_PARAM_COMMIT_ID=$(git log --format="%H" -n 1)
45+
46+
echo "Bucket exists2: $CDK_PARAM_S3_BUCKET_NAME"
47+
48+
cd ../
49+
zip -r source.zip . -x ".git/*" -x "**/node_modules/*" -x "**/cdk.out/*" -x "**/.aws-sam/*"
50+
export CDK_PARAM_COMMIT_ID=$(aws s3api put-object --bucket "${CDK_PARAM_S3_BUCKET_NAME}" --key "source.zip" --body "./source.zip" --output text)
51+
52+
rm source.zip
53+
echo "Source code uploaded to S3"
2554

2655
# Create ECS service linked role.
2756
aws iam create-service-linked-role --aws-service-name ecs.amazonaws.com 2>/dev/null || echo "ECS Service linked role exists"
2857

2958
# Preprovision basic infrastructure
30-
cd ../server
59+
cd ./server
3160

3261
export ECR_REGION=$(aws ec2 describe-availability-zones --output text --query 'AvailabilityZones[0].[RegionName]')
3362
export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
@@ -45,7 +74,6 @@ export CDK_PARAM_TIER='basic'
4574
npx cdk bootstrap
4675
npx cdk deploy --all --require-approval never #--concurrency 10 --asset-parallelism true
4776

48-
4977
# Get SaaS application url
5078
ADMIN_SITE_URL=$(aws cloudformation describe-stacks --stack-name controlplane-stack --query "Stacks[0].Outputs[?OutputKey=='adminSiteUrl'].OutputValue" --output text)
5179
APP_SITE_URL=$(aws cloudformation describe-stacks --stack-name core-appplane-stack --query "Stacks[0].Outputs[?OutputKey=='appSiteUrl'].OutputValue" --output text)

scripts/provision-tenant.sh

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,27 @@ sudo yum install -y python3-pip
88
sudo yum install -y npm
99
sudo npm install -g aws-cdk
1010
sudo python3 -m pip install --upgrade setuptools
11-
sudo python3 -m pip install git-remote-codecommit
1211

1312
# Enable nocasematch option
1413
shopt -s nocasematch
1514

16-
# Clone the ecs reference solution repository
17-
export CDK_PARAM_CODE_COMMIT_REPOSITORY_NAME="saas-reference-architecture-ecs"
18-
git clone codecommit://$CDK_PARAM_CODE_COMMIT_REPOSITORY_NAME --quiet
19-
cd $CDK_PARAM_CODE_COMMIT_REPOSITORY_NAME/server
20-
21-
export ECR_REGION=$(aws ec2 describe-availability-zones --output text --query 'AvailabilityZones[0].[RegionName]')
15+
export REGION=$(aws ec2 describe-availability-zones --output text --query 'AvailabilityZones[0].[RegionName]' 2>&1)
2216
export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
23-
sed "s/<REGION>/$ECR_REGION/g; s/<ACCOUNT_ID>/$ACCOUNT_ID/g" ./service-info.txt > ./lib/service-info.json
2417

25-
npm install
18+
# Download from the ecs reference solution Bucket
19+
export CDK_PARAM_S3_BUCKET_NAME="saas-reference-architecture-ecs-$REGION"
20+
export CDK_SOURCE_NAME="source.zip"
21+
22+
VERSIONS=$(aws s3api list-object-versions --bucket "$CDK_PARAM_S3_BUCKET_NAME" --prefix "$CDK_SOURCE_NAME" --query 'Versions[?IsLatest==`true`].{VersionId:VersionId}' --output text 2>&1)
23+
CDK_PARAM_COMMIT_ID=$(echo "$VERSIONS" | awk 'NR==1{print $1}')
2624

27-
export CDK_PARAM_COMMIT_ID=$(git log --format="%H" -n 1)
25+
aws s3api get-object --bucket "$CDK_PARAM_S3_BUCKET_NAME" --key "$CDK_SOURCE_NAME" --version-id "$CDK_PARAM_COMMIT_ID" "$CDK_SOURCE_NAME" 2>&1
26+
unzip $CDK_SOURCE_NAME
27+
cd ./server
28+
29+
sed "s/<REGION>/$REGION/g; s/<ACCOUNT_ID>/$ACCOUNT_ID/g" ./service-info.txt > ./lib/service-info.json
30+
31+
npm install
2832

2933
# Parse tenant details from the input message from step function
3034
export CDK_PARAM_TENANT_ID=$tenantId

server/bin/ecs-saas-ref-template.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { AwsSolutionsChecks } from 'cdk-nag';
1010

1111
const app = new cdk.App();
1212
cdk.Aspects.of(app).add(new AwsSolutionsChecks({ verbose: true }));
13+
// cdk.Aspects.of(app);
1314
// required input parameters
1415
if (!process.env.CDK_PARAM_SYSTEM_ADMIN_EMAIL) {
1516
throw new Error('Please provide system admin email');
@@ -34,7 +35,6 @@ const tier = getEnv('CDK_PARAM_TIER');
3435
if (!process.env.CDK_PARAM_SYSTEM_ADMIN_ROLE_NAME) {
3536
process.env.CDK_PARAM_SYSTEM_ADMIN_ROLE_NAME = 'SystemAdmin';
3637
}
37-
3838
// default values for optional input parameters
3939
const defaultStageName = 'prod';
4040
const defaultLambdaReserveConcurrency = '1';
@@ -135,7 +135,7 @@ const tenantTemplateStack = new TenantTemplateStack(app, `tenant-template-stack-
135135
commitId: commitId,
136136
tier: tier,
137137
advancedCluster: advancedCluster,
138-
appSiteUrl: coreAppPlaneStack.userInterface.appSiteUrl,
138+
appSiteUrl: coreAppPlaneStack.appSiteUrl,
139139
env: {
140140
account: process.env.CDK_DEFAULT_ACCOUNT,
141141
region: process.env.CDK_DEFAULT_REGION

server/lib/bootstrap-template/control-plane-stack.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import { StaticSiteDistro } from './static-site-distro';
44
import path = require('path');
55
import { StaticSite } from './static-site';
66
import { ControlPlaneNag } from '../cdknag/control-plane-nag';
7-
import * as sbt from '@cdklabs/sbt-aws';
87
import { addTemplateTag } from '../utilities/helper-functions';
8+
import * as sbt from '@cdklabs/sbt-aws';
99

1010
interface ControlPlaneStackProps extends cdk.StackProps {
1111
systemAdminRoleName: string
@@ -17,11 +17,12 @@ export class ControlPlaneStack extends cdk.Stack {
1717
public readonly eventManager: sbt.IEventManager;
1818
public readonly auth: sbt.CognitoAuth;
1919
public readonly adminSiteUrl: string;
20-
public readonly StaticSite: StaticSite;
20+
public readonly staticSite: StaticSite;
2121

2222
constructor (scope: Construct, id: string, props: ControlPlaneStackProps) {
2323
super(scope, id, props);
2424
addTemplateTag(this, 'ControlPlaneStack');
25+
2526
const accessLogsBucket = new cdk.aws_s3.Bucket(this, 'AccessLogsBucket', {
2627
enforceSSL: true,
2728
autoDeleteObjects: true,
@@ -58,9 +59,9 @@ export class ControlPlaneStack extends cdk.Stack {
5859
this.regApiGatewayUrl = controlPlane.controlPlaneAPIGatewayUrl;
5960
this.auth = cognitoAuth;
6061

61-
this.StaticSite = new StaticSite(this, 'AdminWebUi', {
62+
const staticSite = new StaticSite(this, 'AdminWebUi', {
6263
name: 'AdminSite',
63-
assetDirectory: path.join(__dirname, '../../../client/AdminWeb/'),
64+
assetDirectory: path.join(__dirname, '../../../client/AdminWeb'),
6465
production: true,
6566
clientId: this.auth.userClientId, //.clientId,
6667
issuer: this.auth.tokenEndpoint,

0 commit comments

Comments
 (0)