Skip to content

Commit 8711948

Browse files
authored
Merge pull request #317 from SPARCS-UP-Mindanao/feat/added-ssm-parameters
feat: added ssm parameters
2 parents 0ac069a + 9da062b commit 8711948

5 files changed

Lines changed: 243 additions & 4 deletions

File tree

backend/resources/dynamodb.yml

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,10 @@ Resources:
6262
LocalSecondaryIndexes:
6363
- IndexName: QuestionLSI
6464
KeySchema:
65-
- AttributeName: hashKey
66-
KeyType: HASH
67-
- AttributeName: question
68-
KeyType: RANGE
65+
- AttributeName: hashKey
66+
KeyType: HASH
67+
- AttributeName: question
68+
KeyType: RANGE
6969
Projection:
7070
ProjectionType: ALL
7171

@@ -140,3 +140,38 @@ Resources:
140140
KeyType: RANGE
141141
Projection:
142142
ProjectionType: ALL
143+
144+
EntitiesParameter:
145+
Type: AWS::SSM::Parameter
146+
Properties:
147+
Name: /${self:custom.stage}-sparcs-events-entities
148+
Type: String
149+
Value: ${self:custom.entities}
150+
151+
RegistrationsParameter:
152+
Type: AWS::SSM::Parameter
153+
Properties:
154+
Name: /${self:custom.stage}-sparcs-events-registrations
155+
Type: String
156+
Value: ${self:custom.registrations}
157+
158+
PreRegistrationsParameter:
159+
Type: AWS::SSM::Parameter
160+
Properties:
161+
Name: /${self:custom.stage}-sparcs-events-preregistrations
162+
Type: String
163+
Value: ${self:custom.preregistrations}
164+
165+
EvaluationsParameter:
166+
Type: AWS::SSM::Parameter
167+
Properties:
168+
Name: /${self:custom.stage}-sparcs-events-evaluations
169+
Type: String
170+
Value: ${self:custom.evaluations}
171+
172+
EventsParameter:
173+
Type: AWS::SSM::Parameter
174+
Properties:
175+
Name: /${self:custom.stage}-sparcs-events-events
176+
Type: String
177+
Value: ${self:custom.events}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
Resources:
2+
FrontendSSMReadOnlyRole:
3+
Type: AWS::IAM::Role
4+
Properties:
5+
RoleName: frontend-ssm-role-${sls:stage}
6+
AssumeRolePolicyDocument:
7+
Version: "2012-10-17"
8+
Statement:
9+
- Effect: Allow
10+
Principal:
11+
Service:
12+
- lambda.amazonaws.com
13+
Action:
14+
- sts:AssumeRole
15+
Policies:
16+
- PolicyName: SSMReadOnlyAccess
17+
PolicyDocument:
18+
Version: "2012-10-17"
19+
Statement:
20+
- Effect: Allow
21+
Action:
22+
- ssm:GetParameter
23+
- ssm:GetParameters
24+
- ssm:GetParametersByPath
25+
Resource:
26+
- !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/techtix/auth-api-url-${sls:stage}"
27+
- !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/techtix/events-api-url-${sls:stage}"
28+
- !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/techtix/payment-api-url-${sls:stage}"
29+
30+
- !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/techtix/cognito-user-pool-id-${sls:stage}"
31+
- !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/techtix/cognito-user-pool-client-id-${sls:stage}"
32+
- !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/techtix/cognito-domain-url-${sls:stage}"
33+
- !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/techtix/cognito-signin-redirect-${sls:stage}"
34+
- !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/techtix/cognito-signin-redirect-local"
35+
36+
- !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${sls:stage}-sparcs-events*"
37+
38+
- !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/sparcs-events-email-queue-url-${sls:stage}"
39+
- !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/sparcs-events-certificate-queue-url-${sls:stage}"
40+
41+
Outputs:
42+
FrontendRoleArn:
43+
Value: !GetAtt FrontendSSMReadOnlyRole.Arn

backend/resources/s3.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,23 @@ Resources:
77
Status: Enabled
88
CorsConfiguration:
99
CorsRules:
10+
- AllowedHeaders: ["*"]
1011
- AllowedHeaders: ["*"]
1112
AllowedMethods: [GET, PUT, HEAD]
1213
AllowedOrigins: ["*"]
14+
AllowedOrigins: ["*"]
1315
Id: ${self:custom.bucket}-name
1416
MaxAge: "3600"
17+
MaxAge: "3600"
1518
PublicAccessBlockConfiguration:
1619
BlockPublicAcls: false
1720
IgnorePublicAcls: false
1821
BlockPublicPolicy: false
1922
RestrictPublicBuckets: false
23+
24+
BucketNameParameter:
25+
Type: AWS::SSM::Parameter
26+
Properties:
27+
Name: /${self:custom.stage}-sparcs-events-file-bucket
28+
Type: String
29+
Value: ${self:custom.bucket}

backend/scripts/generate-env.py

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
import argparse
2+
import json
3+
import os
4+
from enum import Enum
5+
6+
import boto3
7+
from botocore.exceptions import ClientError
8+
9+
10+
class Environments(str, Enum):
11+
DEV = 'dev'
12+
PROD = 'prod'
13+
LOCAL = 'local'
14+
TEST = 'test'
15+
16+
17+
class ConfigAssembler:
18+
"""
19+
Assembles the TechTix (Backend) config file
20+
"""
21+
22+
def __init__(self, aws_region='ap-southeast-1', environment=Environments.DEV.value):
23+
self.__input_environment = environment
24+
self.__project_name = 'sparcs-events'
25+
26+
# Determine the deployment stage, defaulting to 'dev' for None or 'local' environments
27+
if not self.__input_environment or self.__input_environment == Environments.LOCAL.value:
28+
self.__stage = Environments.DEV.value
29+
else:
30+
self.__stage = self.__input_environment
31+
32+
self.__region = 'ap-southeast-1' if aws_region is None else aws_region
33+
self.__ssm_client = boto3.client('ssm', region_name=self.__region)
34+
self.__secrets_client = boto3.client('secretsmanager', region_name=self.__region)
35+
self.__base_dir = os.getcwd()
36+
37+
def __get_parameter(self, key, decrypt=False) -> str:
38+
"""
39+
Retrieves parameter values from SSM
40+
41+
:param key: key of parameter value to be retrieved
42+
:param decrypt: flag if value is decrypted
43+
:return: parameter value string
44+
"""
45+
kwargs = {'Name': key, 'WithDecryption': decrypt}
46+
value = ''
47+
try:
48+
resp = self.__ssm_client.get_parameter(**kwargs)
49+
except ClientError as e:
50+
print(f'Error: {e.response["Error"]["Code"]} - {key}')
51+
else:
52+
value = resp['Parameter']['Value']
53+
return value
54+
55+
def __get_secret(self, secret_arn) -> str:
56+
"""
57+
Retrieves secret value from AWS Secrets Manager
58+
59+
:param secret_arn: ARN of the secret to retrieve
60+
:return: secret value string
61+
"""
62+
try:
63+
resp = self.__secrets_client.get_secret_value(SecretId=secret_arn)
64+
return resp['SecretString']
65+
except ClientError as e:
66+
print(f'Error retrieving secret: {e.response["Error"]["Code"]} - {secret_arn}')
67+
return ''
68+
69+
@staticmethod
70+
def escape_env_value(value: str) -> str:
71+
return value.replace('$', '$$')
72+
73+
@staticmethod
74+
def write_config(file_handle, key, value) -> None:
75+
"""
76+
Writes specified config key-value in the config file
77+
78+
:param file_handle: File pointer
79+
:param key: key of config
80+
:param value: value of config
81+
:return: None
82+
"""
83+
entry = f'{key}={ConfigAssembler.escape_env_value(str(value))}\n'
84+
file_handle.write(entry)
85+
86+
def construct_config_file(self) -> None:
87+
"""
88+
Constructs the config file for Helix
89+
90+
:return: None
91+
"""
92+
93+
region = 'ap-southeast-1'
94+
stage = self.__stage
95+
entities_table = self.__get_parameter(f"/{stage}-sparcs-events-entities")
96+
registrations_table = self.__get_parameter(f"/{stage}-sparcs-events-registrations")
97+
preregistrations_table = self.__get_parameter(f"/{stage}-sparcs-events-preregistrations")
98+
evaluations_table = self.__get_parameter(f"/{stage}-sparcs-events-evaluations")
99+
events_table = self.__get_parameter(f"/{stage}-sparcs-events")
100+
email_queue = self.__get_parameter(f"/sparcs-events-email-queue-url-{stage}")
101+
certificate_queue = self.__get_parameter(f"/sparcs-events-certificate-queue-url-{stage}")
102+
s3_bucket = self.__get_parameter(f"/{stage}-sparcs-events-file-bucket")
103+
104+
userpool_id = f"techtix/cognito-user-pool-id-{stage}"
105+
userpool_client_id = f"techtix/cognito-user-pool-client-id-{stage}"
106+
107+
if self.__input_environment == Environments.LOCAL.value or stage == Environments.LOCAL.value:
108+
frontend_url = 'http://localhost:3000'
109+
else:
110+
frontend_url = self.__get_parameter(f"techtix/frontend-url-{stage}")
111+
112+
# Determine if this is a local environment
113+
is_local = (
114+
self.__input_environment == Environments.LOCAL.value
115+
or self.__input_environment == Environments.TEST.value
116+
)
117+
118+
config_file = f'{self.__base_dir}/.env'
119+
120+
with open(config_file, 'w', encoding='utf-8') as file_handle:
121+
self.write_config(file_handle, 'REGION', region)
122+
self.write_config(file_handle, 'FRONTEND_URL', frontend_url)
123+
self.write_config(file_handle, 'ENTITIES_TABLE', entities_table)
124+
self.write_config(file_handle, 'REGISTRATIONS_TABLE', registrations_table)
125+
self.write_config(file_handle, 'PREREGISTRATIONS_TABLE', preregistrations_table)
126+
self.write_config(file_handle, 'EVALUATIONS_TABLE', evaluations_table)
127+
self.write_config(file_handle, 'EVENTS_TABLE', events_table)
128+
self.write_config(file_handle, 'EMAIL_QUEUE', email_queue)
129+
self.write_config(file_handle, 'CERTIFICATE_QUEUE', certificate_queue)
130+
self.write_config(file_handle, 'S3_BUCKET', s3_bucket)
131+
self.write_config(file_handle, 'USERPOOL_ID', userpool_id)
132+
self.write_config(file_handle, 'USERPOOL_CLIENT_ID', userpool_client_id)
133+
self.write_config(file_handle, 'STAGE', stage)
134+
135+
print(f'Configuration file created successfully at: {config_file}')
136+
137+
138+
if __name__ == '__main__':
139+
print(Environments)
140+
parser = argparse.ArgumentParser(description='TechTix (Backend) Configuration Assembler')
141+
parser.add_argument('-r', '--region', help='AWS Region (default: ap-southeast-1)')
142+
parser.add_argument('-s', '--stage', help='Environment Name (default: dev)')
143+
args = parser.parse_args()
144+
145+
print('Arguments:', args)
146+
region = args.region
147+
input_stage = args.stage
148+
149+
config_assembler = ConfigAssembler(region, input_stage)
150+
config_assembler.construct_config_file()

backend/serverless.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ resources:
7474
- ${file(resources/api_gateway.yml)}
7575
- ${file(resources/s3.yml)}
7676
- ${file(resources/sqs.yml)}
77+
- ${file(resources/frontend_role.yml)}
7778
- Resources:
7879
ApiGatewayCloudWatchRole:
7980
Type: AWS::IAM::Role

0 commit comments

Comments
 (0)