예제 #1
0
 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")
예제 #2
0
 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")
예제 #3
0
 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"]
예제 #4
0
 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.")
예제 #5
0
    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
예제 #6
0
def _fetch_vpc_id(context: "FoundationContext") -> str:
    return cast(str, ssm.get_parameter(name=cast(str, context.resources_ssm_parameter_name))["VpcId"])