def load_context_from_ssm(env_name: str, type: Type[V]) -> V: if type is Context: context_parameter_name: str = f"/orbit/{env_name}/context" if ssm.does_parameter_exist(context_parameter_name): main = ssm.get_parameter(name=context_parameter_name) else: msg = f"SSM parameter {context_parameter_name} not found for env {env_name}" _logger.error(msg) raise Exception(msg) teams_parameters = ssm.list_parameters( prefix=f"/orbit/{env_name}/teams/") _logger.debug("teams_parameters: %s", teams_parameters) teams = [ ssm.get_parameter_if_exists(name=p) for p in teams_parameters if p.endswith("/context") ] main["Teams"] = [t for t in teams if t] return cast( V, Context.Schema().load(data=main, many=False, partial=False, unknown="RAISE")) elif type is FoundationContext: context_parameter_name = f"/orbit-foundation/{env_name}/context" main = ssm.get_parameter(name=context_parameter_name) return cast( V, FoundationContext.Schema().load(data=main, many=False, partial=False, unknown="RAISE")) else: raise ValueError("Unknown 'context' Type")
def load_manifest_from_ssm(env_name: str, type: Type[T]) -> Optional[T]: if type is Manifest: context_parameter_name = f"/orbit/{env_name}/manifest" main = ssm.get_parameter_if_exists(name=context_parameter_name) if main is None: return None teams_parameters = ssm.list_parameters( prefix=f"/orbit/{env_name}/teams/") _logger.debug("teams_parameters (/orbit/%s/teams/): %s", env_name, teams_parameters) teams = [ ssm.get_parameter(name=p) for p in teams_parameters if p.endswith("/manifest") ] main["Teams"] = teams return cast( T, Manifest.Schema().load(data=main, many=False, partial=False, unknown=EXCLUDE)) elif type is FoundationManifest: context_parameter_name = f"/orbit-f/{env_name}/manifest" main = ssm.get_parameter_if_exists(name=context_parameter_name) if main is None: return None return cast( T, FoundationManifest.Schema().load(data=main, many=False, partial=False, unknown=EXCLUDE)) else: raise ValueError("Unknown 'manifest' Type")
def fetch_team_data(self) -> None: _logger.debug("Fetching Team %s data...", self.name) values = ssm.get_parameter(name=self.team_ssm_parameter_name) self.efs_id = values["EfsId"] self.efs_ap_id = values["EfsApId"] self.eks_pod_role_arn = values["EksPodRoleArn"] self.scratch_bucket = values["ScratchBucket"] self.team_kms_key_arn = values["TeamKmsKeyArn"] self.team_security_group_id = values["TeamSecurityGroupId"]
def fetch_env_data(self) -> None: _logger.debug("Fetching Env data...") values = ssm.get_parameter(name=self.env_ssm_parameter_name) self.eks_cluster_role_arn = values["EksClusterRoleArn"] self.eks_fargate_profile_role_arn = values["EksFargateProfileRoleArn"] self.eks_env_nodegroup_role_arn = values["EksEnvNodegroupRoleArn"] self.user_pool_id = values["UserPoolId"] self.user_pool_client_id = values["UserPoolClientId"] self.identity_pool_id = values["IdentityPoolId"] self.cluster_pod_sg_id = values["ClusterPodSecurityGroupId"] self.fetch_cognito_external_idp_data() _logger.debug("Env data fetched successfully.")
def constructor_ssm_parameter(loader, node) -> Any: # type: ignore """ Extracts the environment variable from the node's value :param yaml.Loader loader: the yaml loader :param node: the current node in the yaml :return: the parsed string that contains the value of the environment variable """ value = loader.construct_scalar(node) match = pattern.findall(value) # to find all env variables in line if match: full_value = value for g in match: _logger.debug(f"match: {g}") (ssm_param_name, jsonpath) = g.split("::") if "${" in ssm_param_name: ssm_param_name = ssm_param_name.replace("$", "").format( os.environ) _logger.debug( f"found injected parameter {(ssm_param_name, jsonpath)}") if ssm_param_name not in SSM_CONTEXT: ssm = boto3_client("ssm") try: SSM_CONTEXT[ssm_param_name] = json.loads( ssm.get_parameter( Name=ssm_param_name)["Parameter"]["Value"]) ssm_parameters.add(ssm_param_name) except Exception as e: _logger.error( f"Error resolving injected parameter {g}: {e}") json_expr = jsonpath_ng.parse(jsonpath) json_data = SSM_CONTEXT[ssm_param_name] json_match = json_expr.find(json_data) if len(json_match) > 1: raise Exception(f"Injected parameter {g} is ambiguous") elif len(json_match) == 0: raise Exception( f"Injected parameter {jsonpath} not found in SSM {ssm_param_name}" ) param_value: str = json_match[0].value _logger.debug( f"injected SSM parameter {g} resolved to {param_value}") return param_value return full_value return value
def _fetch_vpc_id(context: "FoundationContext") -> str: return cast(str, ssm.get_parameter(name=cast(str, context.resources_ssm_parameter_name))["VpcId"])