From ed9c4a6aa90658e827e13b5a4ef7877d9719dcf1 Mon Sep 17 00:00:00 2001 From: Tarek Abdunabi Date: Tue, 28 Sep 2021 14:50:42 -0400 Subject: [PATCH] Update to version v1.4.0 --- CHANGELOG.md | 17 +- README.md | 4 +- deployment/build-s3-dist.sh | 42 +- source/app.py | 28 +- source/architecture-option-2.png | Bin 286353 -> 285276 bytes .../lambdas/pipeline_orchestration/index.py | 32 +- .../pipeline_orchestration/lambda_helpers.py | 301 +++-- .../pipeline_orchestration/shared/helper.py | 39 +- .../tests/fixtures/orchestrator_fixtures.py | 295 +++-- .../tests/test_helper.py | 11 +- .../tests/test_pipeline_orchestration.py | 210 ++- .../solution_helper/lambda_function.py | 65 +- .../solution_helper/test_lambda_function.py | 107 +- source/lib/aws_mlops_stack.py | 81 +- .../blueprints/byom/byom_batch_pipeline.py | 60 +- .../byom_custom_algorithm_image_builder.py | 26 +- .../.coveragerc | 0 .../create_baseline_job/baselines_helper.py | 324 +++++ .../byom/lambdas/create_baseline_job/main.py | 57 + .../requirements-test.txt | 0 .../setup.py | 0 .../tests/__init__.py | 0 .../tests/fixtures/baseline_fixtures.py | 175 +++ .../tests/test_create_data_baseline.py | 195 +++ .../lambdas/create_data_baseline_job/main.py | 102 -- .../tests/fixtures/baseline_fixtures.py | 115 -- .../tests/test_create_data_baseline.py | 47 - .../lambdas/create_update_cf_stackset/main.py | 10 +- .../stackset_helpers.py | 12 +- .../tests/fixtures/stackset_fixtures.py | 6 +- .../tests/test_create_update_cf_stackset.py | 6 +- .../invoke_lambda_custom_resource/index.py | 2 +- source/lib/blueprints/byom/model_monitor.py | 309 +++-- .../byom/multi_account_codepipeline.py | 53 +- .../configure_multi_account.py | 33 +- .../pipeline_definitions/deploy_actions.py | 103 +- .../byom/pipeline_definitions/iam_policies.py | 117 +- .../sagemaker_endpoint.py | 3 +- .../sagemaker_endpoint_config.py | 4 +- .../sagemaker_model_monitor_construct.py | 322 +++++ .../sagemaker_monitor_role.py | 41 +- .../sagemaker_monitoring_schedule.py | 131 -- .../pipeline_definitions/sagemaker_role.py | 13 +- .../templates_parameters.py | 1169 +++++++++-------- .../byom/realtime_inference_pipeline.py | 87 +- .../byom/single_account_codepipeline.py | 25 +- source/requirements.txt | 68 +- 47 files changed, 3026 insertions(+), 1821 deletions(-) rename source/lib/blueprints/byom/lambdas/{create_data_baseline_job => create_baseline_job}/.coveragerc (100%) create mode 100644 source/lib/blueprints/byom/lambdas/create_baseline_job/baselines_helper.py create mode 100644 source/lib/blueprints/byom/lambdas/create_baseline_job/main.py rename source/lib/blueprints/byom/lambdas/{create_data_baseline_job => create_baseline_job}/requirements-test.txt (100%) rename source/lib/blueprints/byom/lambdas/{create_data_baseline_job => create_baseline_job}/setup.py (100%) rename source/lib/blueprints/byom/lambdas/{create_data_baseline_job => create_baseline_job}/tests/__init__.py (100%) create mode 100644 source/lib/blueprints/byom/lambdas/create_baseline_job/tests/fixtures/baseline_fixtures.py create mode 100644 source/lib/blueprints/byom/lambdas/create_baseline_job/tests/test_create_data_baseline.py delete mode 100644 source/lib/blueprints/byom/lambdas/create_data_baseline_job/main.py delete mode 100644 source/lib/blueprints/byom/lambdas/create_data_baseline_job/tests/fixtures/baseline_fixtures.py delete mode 100644 source/lib/blueprints/byom/lambdas/create_data_baseline_job/tests/test_create_data_baseline.py create mode 100644 source/lib/blueprints/byom/pipeline_definitions/sagemaker_model_monitor_construct.py delete mode 100644 source/lib/blueprints/byom/pipeline_definitions/sagemaker_monitoring_schedule.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ca31f0..2a4e4dd 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,12 +5,27 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.4.0] - 2021-09-28 + +### Added + +- A new pipeline to deploy [AWS SageMaker Model Quality Monitor](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality.html). The new pipeline monitors the performance of a deployed model by comparing the + predictions that the model makes with the actual ground truth labels that the model attempts to predict. + +### Updated + +- The Model Monitor pipeline's API call. Now, the Model Monitor pipeline is split into two pipelines, Data Quality Monitor pipeline, and Model Quality Monitor pipeline. +- The format of CloudFormation templates parameters' names from `PARAMETERNAME` to `ParameterName`. +- The APIs of the Realtime Inference pipeline to support passing an optional custom endpoint name. +- The data quality baseline's Lambda to use AWS SageMaker SDK to create the baseline, instead of using Boto3. +- AWS Cloud Development Kit (AWS CDK) and AWS Solutions Constructs to version 1.117.0. + ## [1.3.0] - 2021-06-24 ### Added - The option to use [Amazon SageMaker Model Registry](https://docs.aws.amazon.com/sagemaker/latest/dg/model-registry.html) to deploy versioned models. The model registry allows you to catalog models for production, manage model versions, associate metadata with models, manage the approval status of a model, deploy models to production, and automate model deployment with CI/CD. -- The option to use an [AWS Organizations delegated administrator account](https://docs.amazonaws.cn/en_us/AWSCloudFormation/latest/UserGuide/stacksets-orgs-delegated-admin.html) to orchestrate the deployment of Machine Learning (ML) workloads across the AWS Organizations accounts using AWS CloudFormation StackSets. +- The option to use an [AWS Organizations delegated administrator account](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-orgs-delegated-admin.html) to orchestrate the deployment of Machine Learning (ML) workloads across the AWS Organizations accounts using AWS CloudFormation StackSets. ### Updated diff --git a/README.md b/README.md index f3a7758..c0b006e 100755 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ pipeline for building and registering Docker images for custom algorithms that c deployment on an [Amazon SageMaker](https://aws.amazon.com/sagemaker/) endpoint. You can use batch and real-time data inferences to configure the pipeline for your business context. -You can also provision multiple Model Monitor pipelines to periodically monitor the quality of deployed +You can also provision multiple data quality and model quality Monitor pipelines to periodically monitor the quality of deployed Amazon SageMaker ML models. This solution increases your team’s agility and efficiency by allowing them to repeat successful processes at scale. @@ -119,7 +119,7 @@ chmod +x ./build-s3-dist.sh ./build-s3-dist.sh $DIST_OUTPUT_BUCKET $SOLUTION_NAME $VERSION ``` -- Upload the distributable assets to your Amazon S3 bucket in your account. Note: Ensure that you own the Amazon S3 bucket before uploading the assets. To upload the assets to the S3 bucket, you can use the AWS Console or the AWS CLI as shown below. +- Upload the distributable assets to your Amazon S3 bucket in your account. Note: ensure that you own the Amazon S3 bucket before uploading the assets. To upload the assets to the S3 bucket, you can use the AWS Console or the AWS CLI as shown below. ``` aws s3 cp ./global-s3-assets/ s3://my-bucket-name-/aws-mlops-framework// --recursive --acl bucket-owner-full-control --profile aws-cred-profile-name diff --git a/deployment/build-s3-dist.sh b/deployment/build-s3-dist.sh index 0ff64b2..756dfaf 100755 --- a/deployment/build-s3-dist.sh +++ b/deployment/build-s3-dist.sh @@ -28,7 +28,7 @@ set -e # Important: CDK global version number -cdk_version=1.96.0 +cdk_version=1.117.0 # Check to see if the required parameters have been provided: if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ]; then @@ -111,23 +111,27 @@ echo "npm install -g aws-cdk@$cdk_version" npm install -g aws-cdk@$cdk_version #Run 'cdk synth for BYOM blueprints -echo "cdk synth ModelMonitorStack > lib/blueprints/byom/byom_model_monitor.yaml" -cdk synth ModelMonitorStack > lib/blueprints/byom/byom_model_monitor.yaml -echo "cdk synth SingleAccountCodePipelineStack > lib/blueprints/byom/single_account_codepipeline.yaml" -cdk synth SingleAccountCodePipelineStack > lib/blueprints/byom/single_account_codepipeline.yaml -echo "cdk synth MultiAccountCodePipelineStack > lib/blueprints/byom/multi_account_codepipeline.yaml" -cdk synth MultiAccountCodePipelineStack > lib/blueprints/byom/multi_account_codepipeline.yaml -echo "cdk synth BYOMRealtimePipelineStack > lib/blueprints/byom/byom_realtime_inference_pipeline.yaml" -cdk synth BYOMRealtimePipelineStack > lib/blueprints/byom/byom_realtime_inference_pipeline.yaml -echo "cdk synth BYOMCustomAlgorithmImageBuilderStack > lib/blueprints/byom/byom_custom_algorithm_image_builder.yaml" -cdk synth BYOMCustomAlgorithmImageBuilderStack > lib/blueprints/byom/byom_custom_algorithm_image_builder.yaml -echo "cdk synth BYOMBatchStack > lib/blueprints/byom/byom_batch_pipeline.yaml" -cdk synth BYOMBatchStack > lib/blueprints/byom/byom_batch_pipeline.yaml +echo "cdk synth DataQualityModelMonitorStack > lib/blueprints/byom/byom_data_quality_monitor.yaml --path-metadata false --version-reporting false" +cdk synth DataQualityModelMonitorStack > lib/blueprints/byom/byom_data_quality_monitor.yaml --path-metadata false --version-reporting false +echo "cdk synth ModelQualityModelMonitorStack > lib/blueprints/byom/byom_model_quality_monitor.yaml --path-metadata false --version-reporting false" +cdk synth ModelQualityModelMonitorStack > lib/blueprints/byom/byom_model_quality_monitor.yaml --path-metadata false --version-reporting false +echo "cdk synth SingleAccountCodePipelineStack > lib/blueprints/byom/single_account_codepipeline.yaml --path-metadata false --version-reporting false" +cdk synth SingleAccountCodePipelineStack > lib/blueprints/byom/single_account_codepipeline.yaml --path-metadata false --version-reporting false +echo "cdk synth MultiAccountCodePipelineStack > lib/blueprints/byom/multi_account_codepipeline.yaml --path-metadata false --version-reporting false" +cdk synth MultiAccountCodePipelineStack > lib/blueprints/byom/multi_account_codepipeline.yaml --path-metadata false --version-reporting false +echo "cdk synth BYOMRealtimePipelineStack > lib/blueprints/byom/byom_realtime_inference_pipeline.yaml --path-metadata false --version-reporting false" +cdk synth BYOMRealtimePipelineStack > lib/blueprints/byom/byom_realtime_inference_pipeline.yaml --path-metadata false --version-reporting false +echo "cdk synth BYOMCustomAlgorithmImageBuilderStack > lib/blueprints/byom/byom_custom_algorithm_image_builder.yaml --path-metadata false --version-reporting false" +cdk synth BYOMCustomAlgorithmImageBuilderStack > lib/blueprints/byom/byom_custom_algorithm_image_builder.yaml --path-metadata false --version-reporting false +echo "cdk synth BYOMBatchStack > lib/blueprints/byom/byom_batch_pipeline.yaml --path-metadata false --version-reporting false" +cdk synth BYOMBatchStack > lib/blueprints/byom/byom_batch_pipeline.yaml --path-metadata false --version-reporting false # Replace %%VERSION%% in other templates replace="s/%%VERSION%%/$3/g" -echo "sed -i -e $replace lib/blueprints/byom/byom_model_monitor.yaml" -sed -i -e $replace lib/blueprints/byom/byom_model_monitor.yaml +echo "sed -i -e $replace lib/blueprints/byom/byom_data_quality_monitor.yaml" +sed -i -e $replace lib/blueprints/byom/byom_data_quality_monitor.yaml +echo "sed -i -e $replace lib/blueprints/byom/byom_model_quality_monitor.yaml" +sed -i -e $replace lib/blueprints/byom/byom_model_quality_monitor.yaml echo "sed -i -e $replace lib/blueprints/byom/byom_realtime_inference_pipeline.yaml" sed -i -e $replace lib/blueprints/byom/byom_realtime_inference_pipeline.yaml echo "sed -i -e $replace lib/blueprints/byom/single_account_codepipeline.yaml" @@ -140,10 +144,10 @@ echo "sed -i -e $replace lib/blueprints/byom/byom_batch_pipeline.yaml" sed -i -e $replace lib/blueprints/byom/byom_batch_pipeline.yaml # Run 'cdk synth' for main templates to generate raw solution outputs -echo "cdk synth aws-mlops-single-account-framework --output=$staging_dist_dir" -cdk synth aws-mlops-single-account-framework --output=$staging_dist_dir -echo "cdk synth aws-mlops-multi-account-framework --output=$staging_dist_dir" -cdk synth aws-mlops-multi-account-framework --output=$staging_dist_dir +echo "cdk synth aws-mlops-single-account-framework --path-metadata false --version-reporting false --output=$staging_dist_dir" +cdk synth aws-mlops-single-account-framework --path-metadata false --version-reporting false --output=$staging_dist_dir +echo "cdk synth aws-mlops-multi-account-framework --path-metadata false --version-reporting false --output=$staging_dist_dir" +cdk synth aws-mlops-multi-account-framework --path-metadata false --version-reporting false --output=$staging_dist_dir # Remove unnecessary output files echo "cd $staging_dist_dir" diff --git a/source/app.py b/source/app.py index bf3ef76..a229fc2 100644 --- a/source/app.py +++ b/source/app.py @@ -56,26 +56,38 @@ batch_stack = BYOMBatchStack( app, "BYOMBatchStack", - description=( - f"({solution_id}byom-bt) - BYOM Batch Transform pipeline" f"in AWS MLOps Framework. Version {version}" - ), + description=(f"({solution_id}byom-bt) - BYOM Batch Transform pipeline in AWS MLOps Framework. Version {version}"), ) core.Aspects.of(batch_stack).add(AwsSDKConfigAspect(app, "SDKUserAgentBatch", solution_id, version)) -model_monitor_stack = ModelMonitorStack( +data_quality_monitor_stack = ModelMonitorStack( + app, + "DataQualityModelMonitorStack", + monitoring_type="DataQuality", + description=(f"({solution_id}byom-dqmm) - DataQuality Model Monitor pipeline. Version {version}"), +) + +core.Aspects.of(data_quality_monitor_stack).add( + AwsSDKConfigAspect(app, "SDKUserAgentDataMonitor", solution_id, version) +) + +model_quality_monitor_stack = ModelMonitorStack( app, - "ModelMonitorStack", - description=(f"({solution_id}byom-mm) - Model Monitor pipeline. Version {version}"), + "ModelQualityModelMonitorStack", + monitoring_type="ModelQuality", + description=(f"({solution_id}byom-mqmm) - ModelQuality Model Monitor pipeline. Version {version}"), ) -core.Aspects.of(model_monitor_stack).add(AwsSDKConfigAspect(app, "SDKUserAgentMonitor", solution_id, version)) +core.Aspects.of(model_quality_monitor_stack).add( + AwsSDKConfigAspect(app, "SDKUserAgentModelMonitor", solution_id, version) +) realtime_stack = BYOMRealtimePipelineStack( app, "BYOMRealtimePipelineStack", - description=(f"({solution_id}byom-rip) - BYOM Realtime Inference Pipleline. Version {version}"), + description=(f"({solution_id}byom-rip) - BYOM Realtime Inference Pipeline. Version {version}"), ) core.Aspects.of(realtime_stack).add(AwsSDKConfigAspect(app, "SDKUserAgentRealtime", solution_id, version)) diff --git a/source/architecture-option-2.png b/source/architecture-option-2.png index 967396f57d24e528e87012aeaeb147dd40daf77d..f4013f92df37fa2e632dbeba3d343d7763792703 100644 GIT binary patch literal 285276 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

l9c&j~O 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%0D{?4R5kxIh+LJR6h%- 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 z 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�VTOxF(gUJ%J;x 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

W# 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 QY4E=zO6rHw6wh7#KPv$Y(EtDd diff --git a/source/lambdas/pipeline_orchestration/index.py b/source/lambdas/pipeline_orchestration/index.py index c757871..cdd4d62 100644 --- a/source/lambdas/pipeline_orchestration/index.py +++ b/source/lambdas/pipeline_orchestration/index.py @@ -14,6 +14,8 @@ from json import JSONEncoder import os import datetime +from botocore.client import BaseClient +from typing import Dict, Any, List, Union from shared.wrappers import BadRequest, api_exception_handler from shared.logger import get_logger from shared.helper import get_client @@ -45,7 +47,7 @@ def default(self, obj): @api_exception_handler -def handler(event, context): +def handler(event: Dict[str, Any], context: Dict[str, Any]) -> Dict[str, Any]: if "httpMethod" in event and event["httpMethod"] == "POST": # Lambda is being invoked from API Gateway if event["path"] == "/provisionpipeline": return provision_pipeline(json.loads(event["body"])) @@ -57,12 +59,16 @@ def handler(event, context): return provision_pipeline(event) else: raise BadRequest( - "Bad request format. Expected httpMethod or pipeline_type, recevied none. Check documentation " + "Bad request format. Expected httpMethod or pipeline_type, received none. Check documentation " + "for API & config formats." ) -def provision_pipeline(event, client=cloudformation_client, s3_client=s3_client): +def provision_pipeline( + event: Dict[str, Any], + client: BaseClient = cloudformation_client, + s3_client: BaseClient = s3_client, +) -> Dict[str, Any]: """ provision_pipeline takes the lambda event object and creates a cloudformation stack @@ -109,7 +115,7 @@ def provision_pipeline(event, client=cloudformation_client, s3_client=s3_client) codepipeline_params = get_codepipeline_params( is_multi_account, provisioned_pipeline_stack_name, template_zip_name, template_file_name ) - # format the params (the format is the same for multi-accouunt parameters) + # format the params (the format is the same for multi-account parameters) formatted_codepipeline_params = format_template_parameters(codepipeline_params, "True") # create the codepipeline stack_response = create_codepipeline_stack( @@ -143,7 +149,12 @@ def provision_pipeline(event, client=cloudformation_client, s3_client=s3_client) return response -def update_stack(codepipeline_stack_name, pipeline_template_url, template_parameters, client): +def update_stack( + codepipeline_stack_name: str, + pipeline_template_url: str, + template_parameters: List[Dict[str, str]], + client: BaseClient, +) -> Dict[str, str]: try: update_response = client.update_stack( StackName=codepipeline_stack_name, @@ -171,8 +182,11 @@ def update_stack(codepipeline_stack_name, pipeline_template_url, template_parame def create_codepipeline_stack( - codepipeline_stack_name, pipeline_template_url, template_parameters, client=cloudformation_client -): + codepipeline_stack_name: str, + pipeline_template_url: str, + template_parameters: List[Dict[str, str]], + client: BaseClient = cloudformation_client, +) -> Dict[str, str]: try: stack_response = client.create_stack( StackName=codepipeline_stack_name, @@ -204,7 +218,9 @@ def create_codepipeline_stack( raise e -def pipeline_status(event, cfn_client=cloudformation_client, cp_client=codepipeline_client): +def pipeline_status( + event: Dict[str, Any], cfn_client: BaseClient = cloudformation_client, cp_client: BaseClient = codepipeline_client +) -> Dict[str, Any]: """ pipeline_status takes the lambda event object and returns the status of codepipeline project that's running the pipeline diff --git a/source/lambdas/pipeline_orchestration/lambda_helpers.py b/source/lambdas/pipeline_orchestration/lambda_helpers.py index 5aaba8c..b57c516 100644 --- a/source/lambdas/pipeline_orchestration/lambda_helpers.py +++ b/source/lambdas/pipeline_orchestration/lambda_helpers.py @@ -16,28 +16,30 @@ import shutil import tempfile import uuid +from typing import Dict, List, Tuple, Union, Any +from botocore.client import BaseClient from shared.wrappers import BadRequest -from shared.helper import get_built_in_model_monitor_container_uri from shared.logger import get_logger logger = get_logger(__name__) -def template_url(pipeline_type): +def template_url(pipeline_type: str) -> str: """ template_url is a helper function that determines the cloudformation stack's file name based on inputs :pipeline_type: type of pipeline. Supported values: "byom_realtime_builtin"|"byom_realtime_custom"|"byom_batch_builtin"|"byom_batch_custom"| - "byom_model_monitor"|"byom_image_builder"|"single_account_codepipeline"| + "byom_data_quality_monitor"|"byom_model_quality_monitor"|"byom_image_builder"|"single_account_codepipeline"| "multi_account_codepipeline" - :return: returns a link to the appropriate coudformation template files which can be one of these values: + :return: returns a link to the appropriate cloudformation template files which can be one of these values: byom_realtime_inference_pipeline.yaml byom_batch_pipeline.yaml - byom_model_monitor.yaml + byom_data_quality_monitor.yaml + byom_model_quality_monitor.yaml byom_custom_algorithm_image_builder.yaml single_account_codepipeline.yaml multi_account_codepipeline.yaml @@ -51,7 +53,8 @@ def template_url(pipeline_type): "byom_realtime_custom": realtime_inference_template, "byom_batch_builtin": batch_inference_template, "byom_batch_custom": batch_inference_template, - "byom_model_monitor": "blueprints/byom/byom_model_monitor.yaml", + "byom_data_quality_monitor": "blueprints/byom/byom_data_quality_monitor.yaml", + "byom_model_quality_monitor": "blueprints/byom/byom_model_quality_monitor.yaml", "byom_image_builder": f"{url}/byom_custom_algorithm_image_builder.yaml", "single_account_codepipeline": f"{url}/single_account_codepipeline.yaml", "multi_account_codepipeline": f"{url}/multi_account_codepipeline.yaml", @@ -64,7 +67,7 @@ def template_url(pipeline_type): raise BadRequest(f"Bad request. Pipeline type: {pipeline_type} is not supported.") -def get_stage_param(event, api_key, stage): +def get_stage_param(event: Dict[str, Any], api_key: str, stage: str) -> str: api_key_value = event.get(api_key, "") if isinstance(api_key_value, dict) and stage in list(api_key_value.keys()): api_key_value = api_key_value[stage] @@ -72,7 +75,7 @@ def get_stage_param(event, api_key, stage): return api_key_value -def get_stack_name(event): +def get_stack_name(event: Dict[str, Any]) -> str: pipeline_type = event.get("pipeline_type") pipeline_stack_name = os.environ["PIPELINE_STACK_NAME"] model_name = event.get("model_name", "").lower().strip() @@ -92,8 +95,11 @@ def get_stack_name(event): # name of stack provisioned_pipeline_stack_name = f"{pipeline_stack_name}-{model_name}-{postfix[pipeline_type]}" - elif pipeline_type == "byom_model_monitor": - provisioned_pipeline_stack_name = f"{pipeline_stack_name}-{model_name}-BYOMModelMonitor" + elif pipeline_type == "byom_data_quality_monitor": + provisioned_pipeline_stack_name = f"{pipeline_stack_name}-{model_name}-BYOMDataQualityMonitor" + + elif pipeline_type == "byom_model_quality_monitor": + provisioned_pipeline_stack_name = f"{pipeline_stack_name}-{model_name}-BYOMModelQualityMonitor" elif pipeline_type == "byom_image_builder": image_tag = event.get("image_tag") @@ -102,15 +108,15 @@ def get_stack_name(event): return provisioned_pipeline_stack_name.lower() -def get_template_parameters(event, is_multi_account, stage=None): +def get_template_parameters(event: Dict[str, Any], is_multi_account: bool, stage: str = None) -> List[Tuple[str, str]]: pipeline_type = event.get("pipeline_type") region = os.environ["REGION"] kms_key_arn = get_stage_param(event, "kms_key_arn", stage) common_params = [ - ("ASSETSBUCKET", os.environ["ASSETS_BUCKET"]), - ("KMSKEYARN", kms_key_arn), - ("BLUEPRINTBUCKET", os.environ["BLUEPRINT_BUCKET"]), + ("AssetsBucket", os.environ["ASSETS_BUCKET"]), + ("KmsKeyArn", kms_key_arn), + ("BlueprintBucket", os.environ["BLUEPRINT_BUCKET"]), ] if pipeline_type in [ "byom_realtime_builtin", @@ -121,18 +127,20 @@ def get_template_parameters(event, is_multi_account, stage=None): common_params.extend(get_common_realtime_batch_params(event, region, stage)) - # add realtime specfic parameters + # add realtime specific parameters if pipeline_type in ["byom_realtime_builtin", "byom_realtime_custom"]: common_params.extend(get_realtime_specific_params(event, stage)) # else add batch params else: - common_params.extend(get_bacth_specific_params(event, stage)) + common_params.extend(get_batch_specific_params(event, stage)) return common_params - elif pipeline_type == "byom_model_monitor": - common_params.extend(get_model_monitor_params(event, region, stage)) - return common_params + elif pipeline_type == "byom_data_quality_monitor": + return [*common_params, *get_model_monitor_params(event, region, stage)] + + elif pipeline_type == "byom_model_quality_monitor": + return [*common_params, *get_model_monitor_params(event, region, stage, monitoring_type="ModelQuality")] elif pipeline_type == "byom_image_builder": return get_image_builder_params(event) @@ -141,40 +149,42 @@ def get_template_parameters(event, is_multi_account, stage=None): raise BadRequest("Bad request format. Please provide a supported pipeline") -def get_codepipeline_params(is_multi_account, stack_name, template_zip_name, template_file_name): +def get_codepipeline_params( + is_multi_account: str, stack_name: str, template_zip_name: str, template_file_name: str +) -> List[Tuple[str, str]]: single_account_params = [ - ("NOTIFICATIONEMAIL", os.environ["NOTIFICATION_EMAIL"]), - ("TEMPLATEZIPNAME", template_zip_name), - ("TEMPLATEFILENAME", template_file_name), - ("ASSETSBUCKET", os.environ["ASSETS_BUCKET"]), - ("STACKNAME", stack_name), + ("NotificationEmail", os.environ["NOTIFICATION_EMAIL"]), + ("TemplateZipFileName", template_zip_name), + ("TemplateFileName", template_file_name), + ("AssetsBucket", os.environ["ASSETS_BUCKET"]), + ("StackName", stack_name), ] if is_multi_account == "False": - single_account_params.extend([("TEMPLATEPARAMSNAME", "template_params.json")]) + single_account_params.extend([("TemplateParamsName", "template_params.json")]) return single_account_params else: single_account_params.extend( [ - ("DEVPARAMSNAME", "dev_template_params.json"), - ("STAGINGPARAMSNAME", "staging_template_params.json"), - ("PRODPARAMSNAME", "prod_template_params.json"), - ("DEVACCOUNTID", os.environ["DEV_ACCOUNT_ID"]), - ("DEVORGID", os.environ["DEV_ORG_ID"]), - ("STAGINGACCOUNTID", os.environ["STAGING_ACCOUNT_ID"]), - ("STAGINGORGID", os.environ["STAGING_ORG_ID"]), - ("PRODACCOUNTID", os.environ["PROD_ACCOUNT_ID"]), - ("PRODORGID", os.environ["PROD_ORG_ID"]), - ("BLUEPRINTBUCKET", os.environ["BLUEPRINT_BUCKET"]), - ("DELEGATEDADMINACCOUNT", os.environ["IS_DELEGATED_ADMIN"]), + ("DevParamsName", "dev_template_params.json"), + ("StagingParamsName", "staging_template_params.json"), + ("ProdParamsName", "prod_template_params.json"), + ("DevAccountId", os.environ["DEV_ACCOUNT_ID"]), + ("DevOrgId", os.environ["DEV_ORG_ID"]), + ("StagingAccountId", os.environ["STAGING_ACCOUNT_ID"]), + ("StagingOrgId", os.environ["STAGING_ORG_ID"]), + ("ProdAccountId", os.environ["PROD_ACCOUNT_ID"]), + ("ProdOrgId", os.environ["PROD_ORG_ID"]), + ("BlueprintBucket", os.environ["BLUEPRINT_BUCKET"]), + ("DelegatedAdminAccount", os.environ["IS_DELEGATED_ADMIN"]), ] ) return single_account_params -def get_common_realtime_batch_params(event, region, stage): +def get_common_realtime_batch_params(event: Dict[str, Any], region: str, stage: str) -> List[Tuple[str, str]]: inference_instance = get_stage_param(event, "inference_instance", stage) image_uri = ( get_image_uri(event.get("pipeline_type"), event, region) if os.environ["USE_MODEL_REGISTRY"] == "No" else "" @@ -187,84 +197,119 @@ def get_common_realtime_batch_params(event, region, stage): else "" ) return [ - ("MODELNAME", event.get("model_name")), - ("MODELARTIFACTLOCATION", event.get("model_artifact_location", "")), - ("INFERENCEINSTANCE", inference_instance), - ("CUSTOMALGORITHMSECRREPOARN", os.environ["ECR_REPO_ARN"]), - ("IMAGEURI", image_uri), - ("MODELPACKAGEGROUPNAME", model_package_group_name), - ("MODELPACKAGENAME", event.get("model_package_name", "")), + ("ModelName", event.get("model_name")), + ("ModelArtifactLocation", event.get("model_artifact_location", "")), + ("InferenceInstance", inference_instance), + ("CustomAlgorithmsECRRepoArn", os.environ["ECR_REPO_ARN"]), + ("ImageUri", image_uri), + ("ModelPackageGroupName", model_package_group_name), + ("ModelPackageName", event.get("model_package_name", "")), ] -def clean_param(param): +def clean_param(param: str) -> str: + # if the paramter's value ends with '/', remove it if param.endswith("/"): return param[:-1] else: return param -def get_realtime_specific_params(event, stage): +def get_realtime_specific_params(event: Dict[str, Any], stage: str) -> List[Tuple[str, str]]: data_capture_location = clean_param(get_stage_param(event, "data_capture_location", stage)) - return [("DATACAPTURELOCATION", data_capture_location)] + endpoint_name = get_stage_param(event, "endpoint_name", stage).lower().strip() + return [("DataCaptureLocation", data_capture_location), ("EndpointName", endpoint_name)] -def get_bacth_specific_params(event, stage): +def get_batch_specific_params(event: Dict[str, Any], stage: str) -> List[Tuple[str, str]]: batch_inference_data = get_stage_param(event, "batch_inference_data", stage) batch_job_output_location = clean_param(get_stage_param(event, "batch_job_output_location", stage)) return [ - ("BATCHINPUTBUCKET", batch_inference_data.split("/")[0]), - ("BATCHINFERENCEDATA", batch_inference_data), - ("BATCHOUTPUTLOCATION", batch_job_output_location), + ("BatchInputBucket", batch_inference_data.split("/")[0]), + ("BatchInferenceData", batch_inference_data), + ("BatchOutputLocation", batch_job_output_location), ] -def get_model_monitor_params(event, region, stage): +def get_built_in_model_monitor_image_uri(region, image_name="model-monitor"): + model_monitor_image_uri = sagemaker.image_uris.retrieve( + framework=image_name, + region=region, + ) + + return model_monitor_image_uri + + +def get_model_monitor_params( + event: Dict[str, Any], region: str, stage: str, monitoring_type: str = "DataQuality" +) -> List[Tuple[str, str]]: endpoint_name = get_stage_param(event, "endpoint_name", stage).lower().strip() - monitoring_type = event.get("monitoring_type", "dataquality") # generate jobs names - baseline_job_name = f"{endpoint_name}-baseline-job-{str(uuid.uuid4())[:4]}" - monitoring_schedule_name = f"{endpoint_name}-monitor-{str(uuid.uuid4())[:4]}" + # make sure baseline_job_name and monitoring_schedule_name are <= 63 characters long, especially + # if endpoint_name was dynamically generated by AWS CDK. + baseline_job_name = f"{endpoint_name}-{monitoring_type.lower()}-baseline-{str(uuid.uuid4())[:4]}" + monitoring_schedule_name = f"{endpoint_name}-{monitoring_type.lower()}-monitor-{str(uuid.uuid4())[:4]}" baseline_job_output_location = clean_param(get_stage_param(event, "baseline_job_output_location", stage)) - data_capture_location = clean_param(get_stage_param(event, "baseline_job_output_location", stage)) + data_capture_location = clean_param(get_stage_param(event, "data_capture_location", stage)) instance_type = get_stage_param(event, "instance_type", stage) instance_volume_size = get_stage_param(event, "instance_volume_size", stage) - max_runtime_seconds = get_stage_param(event, "max_runtime_seconds", stage) + baseline_max_runtime_seconds = get_stage_param(event, "baseline_max_runtime_seconds", stage) + monitor_max_runtime_seconds = get_stage_param(event, "monitor_max_runtime_seconds", stage) monitoring_output_location = clean_param(get_stage_param(event, "monitoring_output_location", stage)) schedule_expression = get_stage_param(event, "schedule_expression", stage) - - return [ - ("BASELINEJOBNAME", baseline_job_name), - ("BASELINEOUTPUTBUCKET", baseline_job_output_location.split("/")[0]), - ("BASELINEJOBOUTPUTLOCATION", baseline_job_output_location), - ("DATACAPTUREBUCKET", data_capture_location.split("/")[0]), - ("DATACAPTURELOCATION", data_capture_location), - ("ENDPOINTNAME", endpoint_name), - ("IMAGEURI", get_built_in_model_monitor_container_uri(region)), - ("INSTANCETYPE", instance_type), - ("INSTANCEVOLUMESIZE", instance_volume_size), - ("MAXRUNTIMESECONDS", max_runtime_seconds), - ("MONITORINGOUTPUTLOCATION", monitoring_output_location), - ("MONITORINGSCHEDULENAME", monitoring_schedule_name), - ("MONITORINGTYPE", monitoring_type), - ("SCHEDULEEXPRESSION", schedule_expression), - ("TRAININGDATA", event.get("training_data")), + monitor_ground_truth_input = get_stage_param(event, "monitor_ground_truth_input", stage) + + monitor_params = [ + ("BaselineJobName", baseline_job_name), + ("BaselineOutputBucket", baseline_job_output_location.split("/")[0]), + ("BaselineJobOutputLocation", f"{baseline_job_output_location}/{baseline_job_name}"), + ("DataCaptureBucket", data_capture_location.split("/")[0]), + ("DataCaptureLocation", data_capture_location), + ("EndpointName", endpoint_name), + ("ImageUri", get_built_in_model_monitor_image_uri(region)), + ("InstanceType", instance_type), + ("InstanceVolumeSize", instance_volume_size), + ("BaselineMaxRuntimeSeconds", baseline_max_runtime_seconds), + ("MonitorMaxRuntimeSeconds", monitor_max_runtime_seconds), + ("MonitoringOutputLocation", monitoring_output_location), + ("MonitoringScheduleName", monitoring_schedule_name), + ("ScheduleExpression", schedule_expression), + ("BaselineData", event.get("baseline_data")), ] + # add ModelQuality parameters + if monitoring_type == "ModelQuality": + monitor_params.extend( + [ + ("BaselineInferenceAttribute", event.get("baseline_inference_attribute", "").strip()), + ("BaselineProbabilityAttribute", event.get("baseline_probability_attribute", "").strip()), + ("BaselineGroundTruthAttribute", event.get("baseline_ground_truth_attribute", "").strip()), + ("ProblemType", event.get("problem_type", "").strip()), + ("MonitorInferenceAttribute", event.get("monitor_inference_attribute", "").strip()), + ("MonitorProbabilityAttribute", event.get("monitor_probability_attribute", "").strip()), + ("ProbabilityThresholdAttribute", event.get("probability_threshold_attribute", "").strip()), + ("MonitorGroundTruthInput", monitor_ground_truth_input), + ] + ) + + return monitor_params -def get_image_builder_params(event): + +def get_image_builder_params(event: Dict[str, Any]) -> List[Tuple[str, str]]: return [ - ("NOTIFICATIONEMAIL", os.environ["NOTIFICATION_EMAIL"]), - ("ASSETSBUCKET", os.environ["ASSETS_BUCKET"]), - ("CUSTOMCONTAINER", event.get("custom_algorithm_docker")), - ("ECRREPONAME", event.get("ecr_repo_name")), - ("IMAGETAG", event.get("image_tag")), + ("NotificationEmail", os.environ["NOTIFICATION_EMAIL"]), + ("AssetsBucket", os.environ["ASSETS_BUCKET"]), + ("CustomImage", event.get("custom_algorithm_docker")), + ("ECRRepoName", event.get("ecr_repo_name")), + ("ImageTag", event.get("image_tag")), ] -def format_template_parameters(key_value_list, is_multi_account): +def format_template_parameters( + key_value_list: List[str], is_multi_account: str +) -> Union[List[Dict[str, str]], Dict[str, Dict[str, str]]]: if is_multi_account == "True": # for the multi-account option, the StackSet action, used by multi-account codepipeline, # requires this parameters format @@ -275,36 +320,42 @@ def format_template_parameters(key_value_list, is_multi_account): return {"Parameters": {param[0]: param[1] for param in key_value_list}} -def write_params_to_json(params, file_path): +def write_params_to_json(params: Union[List[Dict[str, str]], Dict[str, Dict[str, str]]], file_path: str) -> None: with open(file_path, "w") as fp: json.dump(params, fp, indent=4) -def upload_file_to_s3(local_file_path, s3_bucket_name, s3_file_key, s3_client): +def upload_file_to_s3(local_file_path: str, s3_bucket_name: str, s3_file_key: str, s3_client: BaseClient) -> None: s3_client.upload_file(local_file_path, s3_bucket_name, s3_file_key) -def download_file_from_s3(s3_bucket_name, file_key, local_file_path, s3_client): +def download_file_from_s3(s3_bucket_name: str, file_key: str, local_file_path: str, s3_client: BaseClient) -> None: s3_client.download_file(s3_bucket_name, file_key, local_file_path) def create_template_zip_file( - event, blueprint_bucket, assets_bucket, template_url, template_zip_name, is_multi_account, s3_client -): + event: Dict[str, Any], + blueprint_bucket: str, + assets_bucket: str, + template_url: str, + template_zip_name: str, + is_multi_account: str, + s3_client: BaseClient, +) -> None: zip_output_filename = "template" - # create a tmpdir for the zip file to downlaod + # create a tmpdir for the zip file to download local_directory = tempfile.mkdtemp() local_file_path = os.path.join(local_directory, template_url.split("/")[-1]) - # downloawd the template from the blueprints bucket + # download the template from the blueprints bucket download_file_from_s3(blueprint_bucket, template_url, local_file_path, s3_client) # create tmpdir to zip clodformation and stages parameters zip_local_directory = tempfile.mkdtemp() zip_file_path = os.path.join(zip_local_directory, zip_output_filename) - # downloawd the template from the blueprints bucket + # download the template from the blueprints bucket download_file_from_s3(blueprint_bucket, template_url, f"{local_directory}/{template_url.split('/')[-1]}", s3_client) # write the params to json file(s) @@ -326,7 +377,7 @@ def create_template_zip_file( local_directory, ) - # uploda file + # upload file upload_file_to_s3( f"{zip_file_path}.zip", assets_bucket, @@ -335,7 +386,7 @@ def create_template_zip_file( ) -def get_image_uri(pipeline_type, event, region): +def get_image_uri(pipeline_type: str, event: Dict[str, Any], region: str) -> str: if pipeline_type in ["byom_realtime_custom", "byom_batch_custom"]: return event.get("custom_image_uri") elif pipeline_type in ["byom_realtime_builtin", "byom_batch_builtin"]: @@ -343,10 +394,24 @@ def get_image_uri(pipeline_type, event, region): framework=event.get("model_framework"), region=region, version=event.get("model_framework_version") ) else: - raise Exception("Unsupported pipeline by get_image_uri function") - - -def get_required_keys(pipeline_type, use_model_registry): + raise ValueError("Unsupported pipeline by get_image_uri function") + + +def get_required_keys(pipeline_type: str, use_model_registry: str, problem_type: str = None) -> List[str]: + # common required keys between model monitor types + common_monitor_keys = [ + "pipeline_type", + "model_name", + "endpoint_name", + "baseline_data", + "baseline_job_output_location", + "data_capture_location", + "monitoring_output_location", + "schedule_expression", + "monitor_max_runtime_seconds", + "instance_type", + "instance_volume_size", + ] # Realtime/batch pipelines if pipeline_type in [ "byom_realtime_builtin", @@ -374,19 +439,31 @@ def get_required_keys(pipeline_type, use_model_registry): return keys_map[pipeline_type] - # Model Monitor pipeline - elif pipeline_type == "byom_model_monitor": + # Data Quality Monitor pipeline + elif pipeline_type == "byom_data_quality_monitor": + return common_monitor_keys + # Model Quality Monitor pipeline + elif pipeline_type == "byom_model_quality_monitor": + common_model_keys = [ + "baseline_inference_attribute", + "baseline_ground_truth_attribute", + "problem_type", + "monitor_ground_truth_input", + ] + if problem_type in ["Regression", "MulticlassClassification"]: + common_model_keys.append("monitor_inference_attribute") + + elif problem_type == "BinaryClassification": + common_model_keys.extend( + ["monitor_probability_attribute", "probability_threshold_attribute", "baseline_probability_attribute"] + ) + + else: + raise BadRequest("Bad request format. Unsupported problem_type in byom_model_quality_monitor pipeline") + return [ - "pipeline_type", - "model_name", - "endpoint_name", - "training_data", - "baseline_job_output_location", - "data_capture_location", - "monitoring_output_location", - "schedule_expression", - "instance_type", - "instance_volume_size", + *common_monitor_keys, + *common_model_keys, ] # Image Builder pipeline elif pipeline_type == "byom_image_builder": @@ -403,17 +480,19 @@ def get_required_keys(pipeline_type, use_model_registry): ) -def validate(event): +def validate(event: Dict[str, Any]) -> Dict[str, Any]: """ validate is a helper function that checks if all required input parameters are present in the handler's event object :event: Lambda function's event object - :return: returns the event back if it passes the validation othewise it raises a bad request exception + :return: returns the event back if it passes the validation otherwise it raises a bad request exception :raises: BadRequest Exception """ # get the required keys to validate the event - required_keys = get_required_keys(event.get("pipeline_type", ""), os.environ["USE_MODEL_REGISTRY"]) + required_keys = get_required_keys( + event.get("pipeline_type", "").strip(), os.environ["USE_MODEL_REGISTRY"], event.get("problem_type", "").strip() + ) for key in required_keys: if key not in event: logger.error(f"Request event did not have parameter: {key}") diff --git a/source/lambdas/pipeline_orchestration/shared/helper.py b/source/lambdas/pipeline_orchestration/shared/helper.py index 04f70ce..4de616e 100644 --- a/source/lambdas/pipeline_orchestration/shared/helper.py +++ b/source/lambdas/pipeline_orchestration/shared/helper.py @@ -1,5 +1,5 @@ # ##################################################################################################################### -# Copyright 2020-2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # # # # Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance # # with the License. A copy of the License is located at # @@ -38,40 +38,3 @@ def get_client(service_name, config=CLIENT_CONFIG): def reset_client(): global _helpers_service_clients _helpers_service_clients = dict() - - -# Currently, retriving the sagemaker-model-monitor-analyzer image url is not supported by sagemaker.image_uris.retrieve -# For the latest images per region, see https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-pre-built-container.html -# These are SageMaker service account numbers for the built-in SageMaker containers. -def get_built_in_model_monitor_container_uri(region): - regions_to_accounts = { - "us-east-1": "156813124566", - "us-east-2": "777275614652", - "us-west-1": "890145073186", - "us-west-2": "159807026194", - "af-south-1": "875698925577", - "ap-east-1": "001633400207", - "ap-northeast-1": "574779866223", - "ap-northeast-2": "709848358524", - "ap-south-1": "126357580389", - "ap-southeast-1": "245545462676", - "ap-southeast-2": "563025443158", - "ca-central-1": "536280801234", - "cn-north-1": "453000072557", - "cn-northwest-1": "453252182341", - "eu-central-1": "048819808253", - "eu-north-1": "895015795356", - "eu-south-1": "933208885752", - "eu-west-1": "468650794304", - "eu-west-2": "749857270468", - "eu-west-3": "680080141114", - "me-south-1": "607024016150", - "sa-east-1": "539772159869", - "us-gov-west-1": "362178532790", - } - - container_uri = ( - f"{regions_to_accounts[region]}.dkr.ecr.{region}.amazonaws.com/sagemaker-model-monitor-analyzer:latest" - ) - - return container_uri diff --git a/source/lambdas/pipeline_orchestration/tests/fixtures/orchestrator_fixtures.py b/source/lambdas/pipeline_orchestration/tests/fixtures/orchestrator_fixtures.py index e10bf16..d70fb9e 100644 --- a/source/lambdas/pipeline_orchestration/tests/fixtures/orchestrator_fixtures.py +++ b/source/lambdas/pipeline_orchestration/tests/fixtures/orchestrator_fixtures.py @@ -51,40 +51,55 @@ def mock_env_variables(): @pytest.fixture def api_byom_event(): - def _api_byom_event(pipeline_type, is_multi=False): + def _api_byom_event(pipeline_type, is_multi=False, endpint_name_provided=False): + # create a map {: {is_multi (True/False): }} + maping = dict( + inference_instance={ + "True": { + "dev": os.environ["INSTANCETYPE"], + "staging": os.environ["INSTANCETYPE"], + "prod": os.environ["INSTANCETYPE"], + }, + "False": os.environ["INSTANCETYPE"], + }, + batch_job_output_location={ + "True": {"dev": "bucket/dev_output", "staging": "bucket/staging_output", "prod": "bucket/prod_output"}, + "False": os.environ["BATCHOUTPUT"], + }, + data_capture_location={ + "True": { + "dev": "bucket/dev_datacapture", + "staging": "bucket/staging_datacapture", + "prod": "bucket/prod_datacapture", + }, + "False": os.environ["DATACAPTURE"], + }, + endpoint_name={ + "True": { + "dev": "dev-endpoint", + "staging": "staging-endpoint", + "prod": "prod-endpoint", + }, + "False": "test-endpoint", + }, + ) event = { "pipeline_type": pipeline_type, "model_name": "testmodel", "model_artifact_location": os.environ["MODELARTIFACTLOCATION"], "model_package_name": os.environ["MODEL_PACKAGE_NAME"], } - if is_multi: - event["inference_instance"] = { - "dev": os.environ["INSTANCETYPE"], - "staging": os.environ["INSTANCETYPE"], - "prod": os.environ["INSTANCETYPE"], - } - else: - event["inference_instance"] = os.environ["INSTANCETYPE"] + event["inference_instance"] = maping["inference_instance"][str(is_multi)] + if pipeline_type in ["byom_batch_builtin", "byom_batch_custom"]: event["batch_inference_data"] = os.environ["INFERENCEDATA"] - if is_multi: - event["batch_job_output_location"] = { - "dev": "bucket/dev_output", - "staging": "bucket/staging_output", - "prod": "bucket/prod_output", - } - else: - event["batch_job_output_location"] = os.environ["BATCHOUTPUT"] + event["batch_job_output_location"] = maping["batch_job_output_location"][str(is_multi)] + if pipeline_type in ["byom_realtime_builtin", "byom_realtime_custom"]: - if is_multi: - event["data_capture_location"] = { - "dev": "bucket/dev_datacapture", - "staging": "bucket/staging_datacapture", - "prod": "bucket/prod_datacapture", - } - else: - event["data_capture_location"] = os.environ["DATACAPTURE"] + event["data_capture_location"] = maping["data_capture_location"][str(is_multi)] + # add optional endpoint_name + if endpint_name_provided: + event["endpoint_name"] = maping["endpoint_name"][str(is_multi)] if pipeline_type in ["byom_realtime_builtin", "byom_batch_builtin"]: event["model_framework"] = "xgboost" @@ -98,22 +113,39 @@ def _api_byom_event(pipeline_type, is_multi=False): @pytest.fixture -def api_monitor_event(): +def api_data_quality_event(): return { - "pipeline_type": "byom_model_monitor", + "pipeline_type": "byom_data_quality_monitor", "model_name": "testmodel", "endpoint_name": "test_endpoint", - "training_data": os.environ["TRAININGDATA"], + "baseline_data": os.environ["TRAININGDATA"], "baseline_job_output_location": os.environ["BASELINEOUTPUT"], "monitoring_output_location": "testbucket/model_monitor/monitor_output", "data_capture_location": "testbucket/xgboost/datacapture", "schedule_expression": os.environ["SCHEDULEEXP"], "instance_type": os.environ["INSTANCETYPE"], "instance_volume_size": "20", - "max_runtime_seconds": "3600", + "baseline_max_runtime_seconds": "3600", + "monitor_max_runtime_seconds": "1800", } +@pytest.fixture +def api_model_quality_event(api_data_quality_event): + model_quality_event = api_data_quality_event.copy() + model_quality_event.update( + { + "pipeline_type": "byom_model_quality_monitor", + "baseline_inference_attribute": "0", + "problem_type": "Regression", + "baseline_ground_truth_attribute": "label", + "monitor_inference_attribute": "0", + "monitor_ground_truth_input": "s3://test-bucket/groundtruth", + } + ) + return model_quality_event + + @pytest.fixture def api_image_builder_event(): return { @@ -126,80 +158,111 @@ def api_image_builder_event(): @pytest.fixture def expected_params_realtime_custom(): - return [ - ("ASSETSBUCKET", "testassetsbucket"), - ("KMSKEYARN", ""), - ("BLUEPRINTBUCKET", "testbucket"), - ("MODELNAME", "testmodel"), - ("MODELARTIFACTLOCATION", os.environ["MODELARTIFACTLOCATION"]), - ("INFERENCEINSTANCE", os.environ["INSTANCETYPE"]), - ("CUSTOMALGORITHMSECRREPOARN", "test-ecr-repo"), - ("IMAGEURI", "custom-image-uri"), - ("MODELPACKAGEGROUPNAME", ""), - ("MODELPACKAGENAME", os.environ["MODEL_PACKAGE_NAME"]), - ("DATACAPTURELOCATION", os.environ["DATACAPTURE"]), - ] + def _expected_params_realtime_custom(endpoint_name_provided=False): + endpoint_name = "test-endpoint" if endpoint_name_provided else "" + expected_params = [ + ("AssetsBucket", "testassetsbucket"), + ("KmsKeyArn", ""), + ("BlueprintBucket", "testbucket"), + ("ModelName", "testmodel"), + ("ModelArtifactLocation", os.environ["MODELARTIFACTLOCATION"]), + ("InferenceInstance", os.environ["INSTANCETYPE"]), + ("CustomAlgorithmsECRRepoArn", "test-ecr-repo"), + ("ImageUri", "custom-image-uri"), + ("ModelPackageGroupName", ""), + ("ModelPackageName", os.environ["MODEL_PACKAGE_NAME"]), + ("DataCaptureLocation", os.environ["DATACAPTURE"]), + ("EndpointName", endpoint_name), + ] + + return expected_params + + return _expected_params_realtime_custom @pytest.fixture -def expected_model_monitor_params(): +def expected_data_quality_monitor_params(): return [ - ("BASELINEJOBNAME", "test_endpoint-baseline-job-ec3a"), - ("BASELINEOUTPUTBUCKET", "testbucket"), - ("BASELINEJOBOUTPUTLOCATION", os.environ["BASELINEOUTPUT"]), - ("DATACAPTUREBUCKET", "testbucket"), - ("DATACAPTURELOCATION", os.environ["BASELINEOUTPUT"]), - ("ENDPOINTNAME", "test_endpoint"), - ("IMAGEURI", "156813124566.dkr.ecr.us-east-1.amazonaws.com/sagemaker-model-monitor-analyzer:latest"), - ("INSTANCETYPE", os.environ["INSTANCETYPE"]), - ("INSTANCEVOLUMESIZE", "20"), - ("MAXRUNTIMESECONDS", "3600"), - ("MONITORINGOUTPUTLOCATION", "testbucket/model_monitor/monitor_output"), - ("MONITORINGSCHEDULENAME", "test_endpoint-monitor-2a87"), - ("MONITORINGTYPE", "dataquality"), - ("SCHEDULEEXPRESSION", os.environ["SCHEDULEEXP"]), - ("TRAININGDATA", os.environ["TRAININGDATA"]), + ("BaselineJobName", "test_endpoint-baseline-job-ec3a"), + ("BaselineOutputBucket", "testbucket"), + ("BaselineJobOutputLocation", os.environ["BASELINEOUTPUT"]), + ("DataCaptureBucket", "testbucket"), + ("DataCaptureLocation", os.environ["BASELINEOUTPUT"]), + ("EndpointName", "test_endpoint"), + ("ImageUri", "156813124566.dkr.ecr.us-east-1.amazonaws.com/sagemaker-model-monitor-analyzer"), + ("InstanceType", os.environ["INSTANCETYPE"]), + ("InstanceVolumeSize", "20"), + ("BaselineMaxRuntimeSeconds", "3600"), + ("MonitorMaxRuntimeSeconds", "1800"), + ("MonitoringOutputLocation", "testbucket/model_monitor/monitor_output"), + ("MonitoringScheduleName", "test_endpoint-monitor-2a87"), + ("ScheduleExpression", os.environ["SCHEDULEEXP"]), + ("BaselineData", os.environ["TRAININGDATA"]), ] +@pytest.fixture +def expected_model_quality_monitor_params(expected_data_quality_monitor_params): + expected_model_quality = expected_data_quality_monitor_params.copy() + + expected_model_quality.extend( + [ + ("BaselineInferenceAttribute", "prediction"), + ("BaselineProbabilityAttribute", "probability"), + ("BaselineGroundTruthAttribute", "label"), + ("ProblemType", "Regression"), + ("MonitorInferenceAttribute", "0"), + ("MonitorProbabilityAttribute", "0"), + ("ProbabilityThresholdAttribute", "0.5"), + ("MonitorGroundTruthInput", "s3://test-bucket/groundtruth"), + ] + ) + + return expected_model_quality + + @pytest.fixture def expected_common_realtime_batch_params(): return [ - ("MODELNAME", "testmodel"), - ("MODELARTIFACTLOCATION", os.environ["MODELARTIFACTLOCATION"]), - ("INFERENCEINSTANCE", os.environ["INSTANCETYPE"]), - ("CUSTOMALGORITHMSECRREPOARN", "test-ecr-repo"), - ("IMAGEURI", "custom-image-uri"), - ("MODELPACKAGEGROUPNAME", ""), - ("MODELPACKAGENAME", os.environ["MODEL_PACKAGE_NAME"]), + ("ModelName", "testmodel"), + ("ModelArtifactLocation", os.environ["MODELARTIFACTLOCATION"]), + ("InferenceInstance", os.environ["INSTANCETYPE"]), + ("CustomAlgorithmsECRRepoArn", "test-ecr-repo"), + ("ImageUri", "custom-image-uri"), + ("ModelPackageGroupName", ""), + ("ModelPackageName", os.environ["MODEL_PACKAGE_NAME"]), ] @pytest.fixture def expected_image_builder_params(): return [ - ("NOTIFICATIONEMAIL", os.environ["NOTIFICATION_EMAIL"]), - ("ASSETSBUCKET", "testassetsbucket"), - ("CUSTOMCONTAINER", os.environ["CUSTOMIMAGE"]), - ("ECRREPONAME", "mlops-ecrrep"), - ("IMAGETAG", "tree"), + ("NotificationEmail", os.environ["NOTIFICATION_EMAIL"]), + ("AssetsBucket", "testassetsbucket"), + ("CustomImage", os.environ["CUSTOMIMAGE"]), + ("ECRRepoName", "mlops-ecrrep"), + ("ImageTag", "tree"), ] @pytest.fixture def expected_realtime_specific_params(): - return [("DATACAPTURELOCATION", os.environ["DATACAPTURE"])] + def _expected_realtime_specific_params(endpoint_name_provided=False): + endpoint_name = "test-endpoint" if endpoint_name_provided else "" + return [("DataCaptureLocation", os.environ["DATACAPTURE"]), ("EndpointName", endpoint_name)] + + return _expected_realtime_specific_params @pytest.fixture def expect_single_account_params_format(): return { "Parameters": { - "NOTIFICATIONEMAIL": os.environ["NOTIFICATION_EMAIL"], - "ASSETSBUCKET": "testassetsbucket", - "CUSTOMCONTAINER": os.environ["CUSTOMIMAGE"], - "ECRREPONAME": "mlops-ecrrep", - "IMAGETAG": "tree", + "NotificationEmail": os.environ["NOTIFICATION_EMAIL"], + "AssetsBucket": "testassetsbucket", + "CustomImage": os.environ["CUSTOMIMAGE"], + "ECRRepoName": "mlops-ecrrep", + "ImageTag": "tree", } } @@ -212,39 +275,39 @@ def stack_name(): @pytest.fixture def expected_multi_account_params_format(): return [ - {"ParameterKey": "NOTIFICATIONEMAIL", "ParameterValue": os.environ["NOTIFICATION_EMAIL"]}, - {"ParameterKey": "ASSETSBUCKET", "ParameterValue": "testassetsbucket"}, - {"ParameterKey": "CUSTOMCONTAINER", "ParameterValue": os.environ["CUSTOMIMAGE"]}, - {"ParameterKey": "ECRREPONAME", "ParameterValue": "mlops-ecrrep"}, - {"ParameterKey": "IMAGETAG", "ParameterValue": "tree"}, + {"ParameterKey": "NotificationEmail", "ParameterValue": os.environ["NOTIFICATION_EMAIL"]}, + {"ParameterKey": "AssetsBucket", "ParameterValue": "testassetsbucket"}, + {"ParameterKey": "CustomImage", "ParameterValue": os.environ["CUSTOMIMAGE"]}, + {"ParameterKey": "ECRRepoName", "ParameterValue": "mlops-ecrrep"}, + {"ParameterKey": "ImageTag", "ParameterValue": "tree"}, ] @pytest.fixture def expected_batch_specific_params(): return [ - ("BATCHINPUTBUCKET", "inference"), - ("BATCHINFERENCEDATA", os.environ["INFERENCEDATA"]), - ("BATCHOUTPUTLOCATION", os.environ["BATCHOUTPUT"]), + ("BatchInputBucket", "inference"), + ("BatchInferenceData", os.environ["INFERENCEDATA"]), + ("BatchOutputLocation", os.environ["BATCHOUTPUT"]), ] @pytest.fixture def expected_batch_params(): return [ - ("ASSETSBUCKET", "testassetsbucket"), - ("KMSKEYARN", ""), - ("BLUEPRINTBUCKET", "testbucket"), - ("MODELNAME", "testmodel"), - ("MODELARTIFACTLOCATION", os.environ["MODELARTIFACTLOCATION"]), - ("INFERENCEINSTANCE", os.environ["INSTANCETYPE"]), - ("CUSTOMALGORITHMSECRREPOARN", "test-ecr-repo"), - ("IMAGEURI", "custom-image-uri"), - ("MODELPACKAGEGROUPNAME", ""), - ("MODELPACKAGENAME", os.environ["MODEL_PACKAGE_NAME"]), - ("BATCHINPUTBUCKET", "inference"), - ("BATCHINFERENCEDATA", os.environ["INFERENCEDATA"]), - ("BATCHOUTPUTLOCATION", os.environ["BATCHOUTPUT"]), + ("AssetsBucket", "testassetsbucket"), + ("KmsKeyArn", ""), + ("BlueprintBucket", "testbucket"), + ("ModelName", "testmodel"), + ("ModelArtifactLocation", os.environ["MODELARTIFACTLOCATION"]), + ("InferenceInstance", os.environ["INSTANCETYPE"]), + ("CustomAlgorithmsECRRepoArn", "test-ecr-repo"), + ("ImageUri", "custom-image-uri"), + ("ModelPackageGroupName", ""), + ("ModelPackageName", os.environ["MODEL_PACKAGE_NAME"]), + ("BatchInputBucket", "inference"), + ("BatchInferenceData", os.environ["INFERENCEDATA"]), + ("BatchOutputLocation", os.environ["BATCHOUTPUT"]), ] @@ -349,28 +412,42 @@ def _api_model_monitor_event(monitoring_type=""): @pytest.fixture def required_api_keys_model_monitor(): - def _required_api_keys_model_monitor(default=True): - default_keys = [ + def _required_api_keys_model_monitor(monitoring_type, problem_type=None): + common_keys = [ "pipeline_type", "model_name", "endpoint_name", + "baseline_data", "baseline_job_output_location", + "data_capture_location", "monitoring_output_location", "schedule_expression", - "training_data", + "monitor_max_runtime_seconds", "instance_type", - "data_capture_location", "instance_volume_size", ] - if default: - return default_keys + if monitoring_type != "ModelQuality": + return common_keys else: - return default_keys + [ - "features_attribute", - "inference_attribute", - "probability_attribute", - "probability_threshold_attribute", + common_model_keys = [ + "baseline_inference_attribute", + "baseline_ground_truth_attribute", + "problem_type", + "monitor_ground_truth_input", ] + if problem_type in ["Regression", "MulticlassClassification"]: + common_model_keys.append("monitor_inference_attribute") + + # BinaryClassification problem + else: + common_model_keys.extend( + [ + "monitor_probability_attribute", + "probability_threshold_attribute", + "baseline_probability_attribute", + ] + ) + return [*common_keys, *common_model_keys] return _required_api_keys_model_monitor @@ -613,5 +690,5 @@ def cf_client_params(api_byom_event, template_parameters_realtime_builtin): @pytest.fixture -def expcted_update_response(stack_name): +def expected_update_response(stack_name): return {"StackId": f"Pipeline {stack_name} is already provisioned. No updates are to be performed."} \ No newline at end of file diff --git a/source/lambdas/pipeline_orchestration/tests/test_helper.py b/source/lambdas/pipeline_orchestration/tests/test_helper.py index 6056725..eac8138 100644 --- a/source/lambdas/pipeline_orchestration/tests/test_helper.py +++ b/source/lambdas/pipeline_orchestration/tests/test_helper.py @@ -1,5 +1,5 @@ # ##################################################################################################################### -# Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # # # # Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance # # with the License. A copy of the License is located at # @@ -11,19 +11,12 @@ # and limitations under the License. # # ##################################################################################################################### import pytest -from shared.helper import get_built_in_model_monitor_container_uri, get_client, reset_client +from shared.helper import get_client, reset_client _helpers_service_clients = dict() -def test_get_built_in_model_monitor_container_uri(): - assert ( - get_built_in_model_monitor_container_uri("us-east-1") - == "156813124566.dkr.ecr.us-east-1.amazonaws.com/sagemaker-model-monitor-analyzer:latest" - ) - - @pytest.mark.parametrize("service,enpoint_url", [("s3", "https://s3"), ("cloudformation", "https://cloudformation")]) def test_get_client(service, enpoint_url): client = get_client(service) diff --git a/source/lambdas/pipeline_orchestration/tests/test_pipeline_orchestration.py b/source/lambdas/pipeline_orchestration/tests/test_pipeline_orchestration.py index 1843bd3..843c4be 100644 --- a/source/lambdas/pipeline_orchestration/tests/test_pipeline_orchestration.py +++ b/source/lambdas/pipeline_orchestration/tests/test_pipeline_orchestration.py @@ -25,7 +25,7 @@ clean_param, get_stack_name, get_common_realtime_batch_params, - get_bacth_specific_params, + get_batch_specific_params, get_model_monitor_params, get_image_builder_params, format_template_parameters, @@ -40,6 +40,7 @@ get_template_parameters, get_required_keys, validate, + get_built_in_model_monitor_image_uri, ) from pipeline_orchestration.index import ( handler, @@ -58,9 +59,11 @@ expected_realtime_specific_params, expected_batch_specific_params, stack_name, - api_monitor_event, - expcted_update_response, - expected_model_monitor_params, + api_data_quality_event, + api_model_quality_event, + expected_update_response, + expected_data_quality_monitor_params, + expected_model_quality_monitor_params, required_api_image_builder, expected_batch_params, api_image_builder_event, @@ -110,7 +113,7 @@ def test_handler(): "isBase64Encoded": False, "body": json.dumps( { - "message": "Bad request format. Expected httpMethod or pipeline_type, recevied none. " + "message": "Bad request format. Expected httpMethod or pipeline_type, received none. " + "Check documentation for API & config formats." } ), @@ -197,24 +200,24 @@ def test_provision_pipeline(api_image_builder_event, api_byom_event): @mock_s3 def test_upload_file_to_s3(): - s3_clinet = boto3.client("s3", region_name="us-east-1") + s3_client = boto3.client("s3", region_name="us-east-1") testfile = tempfile.NamedTemporaryFile() - s3_clinet.create_bucket(Bucket="assetsbucket") - upload_file_to_s3(testfile.name, "assetsbucket", os.environ["TESTFILE"], s3_clinet) + s3_client.create_bucket(Bucket="assetsbucket") + upload_file_to_s3(testfile.name, "assetsbucket", os.environ["TESTFILE"], s3_client) @mock_s3 def test_download_file_from_s3(): - s3_clinet = boto3.client("s3", region_name="us-east-1") + s3_client = boto3.client("s3", region_name="us-east-1") testfile = tempfile.NamedTemporaryFile() - s3_clinet.create_bucket(Bucket="assetsbucket") - upload_file_to_s3(testfile.name, "assetsbucket", os.environ["TESTFILE"], s3_clinet) - download_file_from_s3("assetsbucket", os.environ["TESTFILE"], testfile.name, s3_clinet) + s3_client.create_bucket(Bucket="assetsbucket") + upload_file_to_s3(testfile.name, "assetsbucket", os.environ["TESTFILE"], s3_client) + download_file_from_s3("assetsbucket", os.environ["TESTFILE"], testfile.name, s3_client) -def test_create_codepipeline_stack(cf_client_params, stack_name, expcted_update_response): +def test_create_codepipeline_stack(cf_client_params, stack_name, expected_update_response): cf_client = botocore.session.get_session().create_client("cloudformation") - not_image_satck = "teststack-testmodel-BYOMPipelineReatimeBuiltIn" + not_image_stack = "teststack-testmodel-BYOMPipelineReatimeBuiltIn" stubber = Stubber(cf_client) expected_params = cf_client_params cfn_response = {"StackId": "1234"} @@ -222,7 +225,7 @@ def test_create_codepipeline_stack(cf_client_params, stack_name, expcted_update_ stubber.add_response("create_stack", cfn_response, expected_params) with stubber: response = create_codepipeline_stack( - not_image_satck, + not_image_stack, expected_params["TemplateURL"], expected_params["Parameters"], cf_client, @@ -234,16 +237,16 @@ def test_create_codepipeline_stack(cf_client_params, stack_name, expcted_update_ with stubber: with pytest.raises(Exception): create_codepipeline_stack( - not_image_satck, + not_image_stack, expected_params["TemplateURL"], expected_params["Parameters"], cf_client, ) stubber.add_client_error("create_stack", service_message="already exists") - expected_response = {"StackId": f"Pipeline {not_image_satck} is already provisioned. Updating template parameters."} + expected_response = {"StackId": f"Pipeline {not_image_stack} is already provisioned. Updating template parameters."} with stubber: response = create_codepipeline_stack( - not_image_satck, + not_image_stack, expected_params["TemplateURL"], expected_params["Parameters"], cf_client, @@ -254,7 +257,7 @@ def test_create_codepipeline_stack(cf_client_params, stack_name, expcted_update_ # Test if the stack is image builder stubber.add_client_error("create_stack", service_message="already exists") stubber.add_client_error("update_stack", service_message="No updates are to be performed") - expected_response = expcted_update_response + expected_response = expected_update_response with stubber: response = create_codepipeline_stack( stack_name, @@ -266,7 +269,7 @@ def test_create_codepipeline_stack(cf_client_params, stack_name, expcted_update_ assert response == expected_response -def test_update_stack(cf_client_params, stack_name, expcted_update_response): +def test_update_stack(cf_client_params, stack_name, expected_update_response): cf_client = botocore.session.get_session().create_client("cloudformation") expected_params = cf_client_params @@ -289,7 +292,7 @@ def test_update_stack(cf_client_params, stack_name, expcted_update_response): # Test for no update error stubber.add_client_error("update_stack", service_message="No updates are to be performed") - expected_response = expcted_update_response + expected_response = expected_update_response with stubber: response = update_stack( stack_name, @@ -424,7 +427,7 @@ def test_pipeline_status(): assert response == expected_response_no_cp -def test_get_stack_name(api_byom_event, api_monitor_event, api_image_builder_event): +def test_get_stack_name(api_byom_event, api_data_quality_event, api_model_quality_event, api_image_builder_event): # realtime builtin pipeline realtime_builtin = api_byom_event("byom_realtime_builtin") assert ( @@ -435,8 +438,17 @@ def test_get_stack_name(api_byom_event, api_monitor_event, api_image_builder_eve batch_builtin = api_byom_event("byom_batch_builtin") assert get_stack_name(batch_builtin) == f"mlops-pipeline-{batch_builtin['model_name']}-byompipelinebatchbuiltin" - # model monitor pipeline - assert get_stack_name(api_monitor_event) == f"mlops-pipeline-{api_monitor_event['model_name']}-byommodelmonitor" + # data quality monitor pipeline + assert ( + get_stack_name(api_data_quality_event) + == f"mlops-pipeline-{api_data_quality_event['model_name']}-byomdataqualitymonitor" + ) + + # model quality monitor pipeline + assert ( + get_stack_name(api_model_quality_event) + == f"mlops-pipeline-{api_model_quality_event['model_name']}-byommodelqualitymonitor" + ) # image builder pipeline assert ( @@ -447,7 +459,8 @@ def test_get_stack_name(api_byom_event, api_monitor_event, api_image_builder_eve def test_get_required_keys( api_byom_event, # NOSONAR:S107 this test function is designed to take many fixtures - api_monitor_event, + api_data_quality_event, + api_model_quality_event, required_api_byom_realtime_builtin, required_api_byom_batch_builtin, required_api_byom_realtime_custom, @@ -471,21 +484,29 @@ def test_get_required_keys( returned_keys = get_required_keys("byom_batch_custom", "No") expected_keys = required_api_byom_batch_custom TestCase().assertCountEqual(expected_keys, returned_keys) - # Required keys in model_monitor, default (no monitoring_type provided) - returned_keys = get_required_keys("byom_model_monitor", "No") - expected_keys = required_api_keys_model_monitor() + # Required keys in data quality monitor + returned_keys = get_required_keys("byom_data_quality_monitor", "No") + expected_keys = required_api_keys_model_monitor("DataQuality") + TestCase().assertCountEqual(expected_keys, returned_keys) + # Required keys in model quality monitor, problem type Regression + returned_keys = get_required_keys("byom_model_quality_monitor", "No", "Regression") + expected_keys = required_api_keys_model_monitor("ModelQuality", "Regression") TestCase().assertCountEqual(expected_keys, returned_keys) - # Required keys in model_monitor, with monitoring_type provided - returned_keys = get_required_keys("byom_model_monitor", "No") - expected_keys = required_api_keys_model_monitor(True) + # Required keys in model quality monitor, problem type BinaryClassification + returned_keys = get_required_keys("byom_model_quality_monitor", "No", "BinaryClassification") + expected_keys = required_api_keys_model_monitor("ModelQuality", "BinaryClassification") TestCase().assertCountEqual(expected_keys, returned_keys) + # test exception for unsupported problem type + with pytest.raises(BadRequest) as error: + get_required_keys("byom_model_quality_monitor", "No", "UnsupportedProblemType") + assert str(error.value) == "Bad request format. Unsupported problem_type in byom_model_quality_monitor pipeline" # Required keys in image builder returned_keys = get_required_keys("byom_image_builder", "No") expected_keys = required_api_image_builder TestCase().assertCountEqual(expected_keys, returned_keys) # assert for exceptions with pytest.raises(BadRequest) as exceinfo: - get_required_keys({"pipeline_type": "not_supported"}, "No") + get_required_keys("not_supported", "No") assert ( str(exceinfo.value) == "Bad request format. Pipeline type not supported. Check documentation for API & config formats" @@ -498,7 +519,7 @@ def test_get_required_keys( def test_get_stage_param(api_byom_event): single_event = api_byom_event("byom_realtime_custom", False) - TestCase().assertEqual(get_stage_param(single_event, "data_capture_location", None), "bucket/datacapture") + TestCase().assertEqual(get_stage_param(single_event, "data_capture_location", "None"), "bucket/datacapture") multi_event = api_byom_event("byom_realtime_custom", True) TestCase().assertEqual(get_stage_param(multi_event, "data_capture_location", "dev"), "bucket/dev_datacapture") @@ -506,18 +527,40 @@ def test_get_stage_param(api_byom_event): def test_get_template_parameters( api_byom_event, api_image_builder_event, + api_data_quality_event, + api_model_quality_event, expected_params_realtime_custom, expected_image_builder_params, expected_batch_params, + expected_data_quality_monitor_params, + expected_model_quality_monitor_params, ): single_event = api_byom_event("byom_realtime_custom", False) - TestCase().assertEqual(get_template_parameters(single_event, False), expected_params_realtime_custom) + # realtime pipeline + TestCase().assertEqual(get_template_parameters(single_event, False), expected_params_realtime_custom()) + # image builder pipeline TestCase().assertEqual(get_template_parameters(api_image_builder_event, False), expected_image_builder_params) + # batch pipeline TestCase().assertEqual( get_template_parameters(api_byom_event("byom_batch_custom", False), False), expected_batch_params, ) + # data quality pipeline + assert len(get_template_parameters(api_data_quality_event, False)) == len( + [ + *expected_data_quality_monitor_params, + *[("AssetsBucket", "testassetsbucket"), ("KmsKeyArn", ""), ("BlueprintBucket", "testbucket")], + ] + ) + + # model quality pipeline + assert len(get_template_parameters(api_model_quality_event, False)) == len( + [ + *expected_model_quality_monitor_params, + *[("AssetsBucket", "testassetsbucket"), ("KmsKeyArn", ""), ("BlueprintBucket", "testbucket")], + ] + ) # test for exception with pytest.raises(BadRequest): get_template_parameters({"pipeline_type": "unsupported"}, False) @@ -528,23 +571,56 @@ def test_get_common_realtime_batch_params(api_byom_event, expected_common_realti batch_event = api_byom_event("byom_batch_custom", False) realtime_event.update(batch_event) TestCase().assertEqual( - get_common_realtime_batch_params(realtime_event, False, None), expected_common_realtime_batch_params + get_common_realtime_batch_params(realtime_event, "us-east-1", "None"), expected_common_realtime_batch_params ) def test_get_realtime_specific_params(api_byom_event, expected_realtime_specific_params): + # test with endpoint_name not provided realtime_event = api_byom_event("byom_realtime_builtin", False) - TestCase().assertEqual(get_realtime_specific_params(realtime_event, None), expected_realtime_specific_params) + TestCase().assertEqual(get_realtime_specific_params(realtime_event, "None"), expected_realtime_specific_params()) + # test with endpoint_name provided + realtime_event = api_byom_event("byom_realtime_builtin", False, True) + TestCase().assertEqual( + get_realtime_specific_params(realtime_event, "None"), expected_realtime_specific_params(True) + ) + # test with endpoint_name provided for multi-account + realtime_event = api_byom_event("byom_realtime_builtin", False, True) + TestCase().assertEqual(get_realtime_specific_params(realtime_event, "dev"), expected_realtime_specific_params(True)) -def test_get_bacth_specific_params(api_byom_event, expected_batch_specific_params): +def test_get_batch_specific_params(api_byom_event, expected_batch_specific_params): batch_event = api_byom_event("byom_batch_custom", False) - TestCase().assertEqual(get_bacth_specific_params(batch_event, None), expected_batch_specific_params) + TestCase().assertEqual(get_batch_specific_params(batch_event, "None"), expected_batch_specific_params) + + +def test_get_built_in_model_monitor_container_uri(): + # assert the returned value by an actual Model Monitor Image URI for the region. + assert ( + get_built_in_model_monitor_image_uri("us-east-1") + == "156813124566.dkr.ecr.us-east-1.amazonaws.com/sagemaker-model-monitor-analyzer" + ) -def test_get_model_monitor_params(api_monitor_event, expected_model_monitor_params): +@patch("lambda_helpers.sagemaker.image_uris.retrieve") +def test_get_model_monitor_params( + mocked_image_retrieve, + api_data_quality_event, + api_model_quality_event, + expected_data_quality_monitor_params, + expected_model_quality_monitor_params, +): + # provide an actual Model Monitor image URI (us-east-1) as the return value + mocked_image_retrieve.return_value = "156813124566.dkr.ecr.us-east-1.amazonaws.com/sagemaker-model-monitor-analyzer" + # data quality monitor + TestCase().assertEqual( + len(get_model_monitor_params(api_data_quality_event, "us-east-1", "None")), + len(expected_data_quality_monitor_params), + ) + # model quality monitor TestCase().assertEqual( - len(get_model_monitor_params(api_monitor_event, "us-east-1", None)), len(expected_model_monitor_params) + len(get_model_monitor_params(api_model_quality_event, "us-east-1", "None", monitoring_type="ModelQuality")), + len(expected_model_quality_monitor_params), ) @@ -567,22 +643,22 @@ def test_format_template_parameters( def test_get_image_uri(mocked_sm, api_byom_event): custom_event = api_byom_event("byom_realtime_custom", False) TestCase().assertEqual(get_image_uri("byom_realtime_custom", custom_event, "us-east-1"), "custom-image-uri") - mocked_sm.return_value = "test-imge-uri" + mocked_sm.return_value = "test-image-uri" builtin_event = api_byom_event("byom_realtime_builtin", False) - TestCase().assertEqual(get_image_uri("byom_realtime_builtin", builtin_event, "us-east-1"), "test-imge-uri") + TestCase().assertEqual(get_image_uri("byom_realtime_builtin", builtin_event, "us-east-1"), "test-image-uri") mocked_sm.assert_called_with( framework=builtin_event.get("model_framework"), region="us-east-1", version=builtin_event.get("model_framework_version"), ) - # assert exception for an unspported pipeline + # assert exception for an unsupported pipeline with pytest.raises(Exception) as exc: get_image_uri("not_spoorted_pipeline", builtin_event, "us-east-1") assert str(exc.value) == "Unsupported pipeline by get_image_uri function" +@patch("lambda_helpers.sagemaker.image_uris.retrieve") @patch("boto3.client") -@patch("builtins.open") @patch("lambda_helpers.shutil.make_archive") @patch("lambda_helpers.write_params_to_json") @patch("lambda_helpers.format_template_parameters") @@ -594,54 +670,54 @@ def test_create_template_zip_file( mocked_mkdir, mocked_get_template, mocked_format, - mocked_wrire, + mocked_write, mocked_shutil, - mocked_open, mocked_client, - api_monitor_event, + mocked_get_image, + api_image_builder_event, ): mocked_path.return_value = False - s3_clinet = boto3.client("s3", region_name="us-east-1") + s3_client = boto3.client("s3", region_name="us-east-1") # multi account create_template_zip_file( - api_monitor_event, "blueprint", "assets_bucket", "byom/template.yaml", "zipfile", "True", s3_clinet + api_image_builder_event, "blueprint", "assets_bucket", "byom/template.yaml", "zipfile", "True", s3_client ) # single account create_template_zip_file( - api_monitor_event, "blueprint", "assets_bucket", "byom/template.yaml", "zipfile", "False", s3_clinet + api_image_builder_event, "blueprint", "assets_bucket", "byom/template.yaml", "zipfile", "False", s3_client ) def test_get_codepipeline_params(): common_params = [ - ("NOTIFICATIONEMAIL", "test@example.com"), - ("TEMPLATEZIPNAME", "template_zip_name"), - ("TEMPLATEFILENAME", "template_file_name"), - ("ASSETSBUCKET", "testassetsbucket"), - ("STACKNAME", "stack_name"), + ("NotificationEmail", "test@example.com"), + ("TemplateZipFileName", "template_zip_name"), + ("TemplateFileName", "template_file_name"), + ("AssetsBucket", "testassetsbucket"), + ("StackName", "stack_name"), ] # multi account codepipeline TestCase().assertEqual( get_codepipeline_params("True", "stack_name", "template_zip_name", "template_file_name"), common_params + [ - ("DEVPARAMSNAME", "dev_template_params.json"), - ("STAGINGPARAMSNAME", "staging_template_params.json"), - ("PRODPARAMSNAME", "prod_template_params.json"), - ("DEVACCOUNTID", "dev_account_id"), - ("DEVORGID", "dev_org_id"), - ("STAGINGACCOUNTID", "staging_account_id"), - ("STAGINGORGID", "staging_org_id"), - ("PRODACCOUNTID", "prod_account_id"), - ("PRODORGID", "prod_org_id"), - ("BLUEPRINTBUCKET", "testbucket"), - ("DELEGATEDADMINACCOUNT", "No"), + ("DevParamsName", "dev_template_params.json"), + ("StagingParamsName", "staging_template_params.json"), + ("ProdParamsName", "prod_template_params.json"), + ("DevAccountId", "dev_account_id"), + ("DevOrgId", "dev_org_id"), + ("StagingAccountId", "staging_account_id"), + ("StagingOrgId", "staging_org_id"), + ("ProdAccountId", "prod_account_id"), + ("ProdOrgId", "prod_org_id"), + ("BlueprintBucket", "testbucket"), + ("DelegatedAdminAccount", "No"), ], ) # single account codepipeline TestCase().assertEqual( get_codepipeline_params("False", "stack_name", "template_zip_name", "template_file_name"), - common_params + [("TEMPLATEPARAMSNAME", "template_params.json")], + common_params + [("TemplateParamsName", "template_params.json")], ) diff --git a/source/lambdas/solution_helper/lambda_function.py b/source/lambdas/solution_helper/lambda_function.py index 5298217..1e79ae2 100644 --- a/source/lambdas/solution_helper/lambda_function.py +++ b/source/lambdas/solution_helper/lambda_function.py @@ -21,6 +21,18 @@ def _sanitize_data(resource_properties): + # Define allowed keys. You need to update this list with new metrics + main_keys = [ + "bucketSelected", + "gitSelected", + "Region", + "IsMultiAccount", + "UseModelRegistry", + "Version", + ] + optional_keys = ["IsDelegatedAccount"] + allowed_keys = main_keys + optional_keys + # Remove ServiceToken (lambda arn) to avoid sending AccountId resource_properties.pop("ServiceToken", None) resource_properties.pop("Resource", None) @@ -29,7 +41,37 @@ def _sanitize_data(resource_properties): resource_properties.pop("SolutionId", None) resource_properties.pop("UUID", None) - return resource_properties + # send only allowed metrics + sanitized_data = {key: resource_properties[key] for key in allowed_keys if key in resource_properties} + + return sanitized_data + + +def _send_anonymous_metrics(request_type, resource_properties): + try: + metrics_data = _sanitize_data(copy(resource_properties)) + metrics_data["RequestType"] = request_type + + headers = {"Content-Type": "application/json"} + + # create the payload + payload = { + "Solution": resource_properties["SolutionId"], + "UUID": resource_properties["UUID"], + "TimeStamp": datetime.utcnow().isoformat(), + "Data": metrics_data, + } + + logger.info(f"Sending payload: {payload}") + response = requests.post("https://metrics.awssolutionsbuilder.com/generic", json=payload, headers=headers) + # log the response + logger.info(f"Response from the metrics endpoint: {response.status_code} {response.reason}") + # raise error if response is an 404, 503, 500, 403 etc. + response.raise_for_status() + return response + except Exception as e: + logger.exception(f"Error when trying to send anonymous_metrics: {str(e)}") + return None @helper.create @@ -44,25 +86,8 @@ def custom_resource(event, _): random_id = str(uuid.uuid4()) helper.Data.update({"UUID": random_id}) elif resource == "AnonymousMetric": - try: - metrics_data = _sanitize_data(copy(resource_properties)) - metrics_data["RequestType"] = request_type - - headers = {"Content-Type": "application/json"} - - # create the payload - payload = { - "Solution": resource_properties["SolutionId"], - "UUID": resource_properties["UUID"], - "TimeStamp": datetime.utcnow().isoformat(), - "Data": metrics_data, - } - - logger.info(f"Sending payload: {payload}") - response = requests.post("https://metrics.awssolutionsbuilder.com/generic", json=payload, headers=headers) - logger.info(f"Response from metrics endpoint: {response.status_code} {response.reason}") - except Exception as e: - logger.exception(f"Error when trying to send usage data: {str(e)}") + # send Anonymous Metrics to AWS + _send_anonymous_metrics(request_type, resource_properties) def handler(event, context): diff --git a/source/lambdas/solution_helper/test_lambda_function.py b/source/lambdas/solution_helper/test_lambda_function.py index e4ccab3..5ad7b42 100644 --- a/source/lambdas/solution_helper/test_lambda_function.py +++ b/source/lambdas/solution_helper/test_lambda_function.py @@ -11,9 +11,9 @@ # and limitations under the License. # ###################################################################################################################### -import unittest, requests +import unittest +import requests from unittest import mock -import pytest from lambda_function import handler @@ -23,20 +23,53 @@ def __init__(self, status_code, reason): self.status_code = status_code self.reason = reason + def raise_for_status(self): + pass # NOSONAR this is just used as a mocked response object + return MockResponse(200, "OK") class LambdaTest(unittest.TestCase): - def test_create_unique_id(self): + exception_message = "Exception should not be raised when metrics cannot be sent" + + def test_custom_resource(self): import lambda_function + # test resource == "UUID" event = {"RequestType": "Create", "ResourceProperties": {"Resource": "UUID"}} lambda_function.custom_resource(event, None) self.assertIsNotNone(lambda_function.helper.Data.get("UUID")) + # test resource == "AnonymousMetric" + with mock.patch("requests.post", side_effect=mocked_requests_post) as mock_post: + event = { + "RequestType": "Create", + "ResourceProperties": { + "Resource": "AnonymousMetric", + "SolutionId": "SO1234", + "gitSelected": "True", + "bucketSelected": "False", + "IsMultiAccount": "True", + "IsDelegatedAccount": "True", + "UUID": "some-uuid", + }, + } + lambda_function.custom_resource(event, None) + actual_payload = mock_post.call_args.kwargs["json"] + self.assertEqual( + actual_payload["Data"], + { + "RequestType": "Create", + "gitSelected": "True", + "bucketSelected": "False", + "IsMultiAccount": "True", + "IsDelegatedAccount": "True", + }, + ) + @mock.patch("requests.post", side_effect=mocked_requests_post) - def test_send_metrics_successful(self, mock_post): + def test_send_anonymous_metrics_successful(self, mock_post): event = { "RequestType": "Create", "ResourceProperties": { @@ -49,9 +82,11 @@ def test_send_metrics_successful(self, mock_post): }, } - from lambda_function import custom_resource + from lambda_function import _send_anonymous_metrics + + response = _send_anonymous_metrics(event["RequestType"], event["ResourceProperties"]) - custom_resource(event, None) + self.assertIsNotNone(response) expected_metrics_endpoint = "https://metrics.awssolutionsbuilder.com/generic" actual_metrics_endpoint = mock_post.call_args.args[0] @@ -69,47 +104,69 @@ def test_send_metrics_successful(self, mock_post): self.assertIn("Data", actual_payload) self.assertEqual( actual_payload["Data"], - {"Foo": "Bar", "RequestType": "Create", "gitSelected": "True", "bucketSelected": "False"}, + {"RequestType": "Create", "gitSelected": "True", "bucketSelected": "False"}, ) # delete a key from the resource properties. It should send data with no errors del event["ResourceProperties"]["bucketSelected"] - custom_resource(event, None) + response = _send_anonymous_metrics(event["RequestType"], event["ResourceProperties"]) + self.assertIsNotNone(response) actual_payload = mock_post.call_args.kwargs["json"] self.assertEqual( actual_payload["Data"], - {"Foo": "Bar", "RequestType": "Create", "gitSelected": "True"}, + {"RequestType": "Create", "gitSelected": "True"}, ) - @mock.patch("requests.post") - def test_send_metrics_connection_error(self, mock_post): - mock_post.side_effect = requests.exceptions.ConnectionError() + @mock.patch("requests.post", side_effect=mocked_requests_post(404, "HTTPError")) + def test_send_anonymous_metrics_http_error(self, mock_post): + event = { + "RequestType": "Create", + "ResourceProperties": {"Resource": "AnonymousMetric", "SolutionId": "SO1234", "UUID": "some-uuid"}, + } + + try: + from lambda_function import _send_anonymous_metrics + + response = _send_anonymous_metrics(event["RequestType"], event["ResourceProperties"]) + # the function shouldn't throw an exception, and return None + self.assertIsNone(response) + + except AssertionError as e: + self.fail(str(e)) + @mock.patch("requests.post", side_effect=mocked_requests_post) + def test_send_anonymous_metrics_connection_error(self, mock_post): + mock_post.side_effect = requests.exceptions.ConnectionError() event = { "RequestType": "Update", "ResourceProperties": {"Resource": "AnonymousMetric", "SolutionId": "SO1234", "UUID": "some-uuid"}, } try: - from lambda_function import custom_resource + from lambda_function import _send_anonymous_metrics + + response = _send_anonymous_metrics(event["RequestType"], event["ResourceProperties"]) + # the function shouldn't throw an exception, and return None + self.assertIsNone(response) - custom_resource(event, None) - except: - self.fail("Exception should not be raised when metrics cannot be sent") + except AssertionError as e: + self.fail(str(e)) @mock.patch("requests.post") - def test_send_metrics_other_error(self, mock_post): + def test_send_anonymous_metrics_other_error(self, mock_post): try: invalid_event = { "RequestType": "Delete", "ResourceProperties": {"Resource": "AnonymousMetric", "UUID": "some-uuid"}, } - from lambda_function import custom_resource + from lambda_function import _send_anonymous_metrics - custom_resource(invalid_event, None) - except: - self.fail("Exception should not be raised when metrics cannot be sent") + response = _send_anonymous_metrics(invalid_event["RequestType"], invalid_event["ResourceProperties"]) + # the function shouldn't throw an exception, and return None + assert response is None + except AssertionError as e: + self.fail(str(e)) def test_sanitize_data(self): from lambda_function import _sanitize_data @@ -120,10 +177,16 @@ def test_sanitize_data(self): "SolutionId": "SO1234", "UUID": "some-uuid", "Region": "us-east-1", + "gitSelected": "True", + "bucketSelected": "False", "Foo": "Bar", } - expected_response = {"Region": "us-east-1", "Foo": "Bar"} + expected_response = { + "Region": "us-east-1", + "gitSelected": "True", + "bucketSelected": "False", + } actual_response = _sanitize_data(resource_properties) self.assertCountEqual(expected_response, actual_response) diff --git a/source/lib/aws_mlops_stack.py b/source/lib/aws_mlops_stack.py index b80efce..239fa80 100644 --- a/source/lib/aws_mlops_stack.py +++ b/source/lib/aws_mlops_stack.py @@ -31,18 +31,8 @@ suppress_lambda_policies, ) from lib.blueprints.byom.pipeline_definitions.templates_parameters import ( - create_notification_email_parameter, - create_git_address_parameter, - create_existing_bucket_parameter, - create_existing_ecr_repo_parameter, - create_git_address_provided_condition, - create_existing_bucket_provided_condition, - create_existing_ecr_provided_condition, - create_new_bucket_condition, - create_new_ecr_repo_condition, - create_use_model_registry_parameter, - create_model_registry_parameter, - create_model_registry_condition, + ParameteresFactory as pf, + ConditionsFactory as cf, ) from lib.blueprints.byom.pipeline_definitions.deploy_actions import ( sagemaker_layer, @@ -52,7 +42,7 @@ create_copy_assets_lambda, ) from lib.blueprints.byom.pipeline_definitions.iam_policies import ( - create_inovoke_lambda_policy, + create_invoke_lambda_policy, create_orchestrator_policy, ) from lib.blueprints.byom.pipeline_definitions.configure_multi_account import ( @@ -67,34 +57,34 @@ def __init__(self, scope: core.Construct, id: str, *, multi_account=False, **kwa super().__init__(scope, id, **kwargs) # Get stack parameters: - notification_email = create_notification_email_parameter(self) - git_address = create_git_address_parameter(self) + notification_email = pf.create_notification_email_parameter(self) + git_address = pf.create_git_address_parameter(self) # Get the optional S3 assets bucket to use - existing_bucket = create_existing_bucket_parameter(self) + existing_bucket = pf.create_existing_bucket_parameter(self) # Get the optional S3 assets bucket to use - existing_ecr_repo = create_existing_ecr_repo_parameter(self) + existing_ecr_repo = pf.create_existing_ecr_repo_parameter(self) # Will SageMaker's Model Registry be used to provision models - use_model_registry = create_use_model_registry_parameter(self) + use_model_registry = pf.create_use_model_registry_parameter(self) # Does the user want the solution to create model registry - create_model_registry = create_model_registry_parameter(self) + create_model_registry = pf.create_model_registry_parameter(self) # Conditions - git_address_provided = create_git_address_provided_condition(self, git_address) + git_address_provided = cf.create_git_address_provided_condition(self, git_address) # client provided an existing S3 bucket name, to be used for assets - existing_bucket_provided = create_existing_bucket_provided_condition(self, existing_bucket) + existing_bucket_provided = cf.create_existing_bucket_provided_condition(self, existing_bucket) # client provided an existing Amazon ECR name - existing_ecr_provided = create_existing_ecr_provided_condition(self, existing_ecr_repo) + existing_ecr_provided = cf.create_existing_ecr_provided_condition(self, existing_ecr_repo) # client wants the solution to create model registry - model_registry_condition = create_model_registry_condition(self, create_model_registry) + model_registry_condition = cf.create_model_registry_condition(self, create_model_registry) # S3 bucket needs to be created for assets - create_new_bucket = create_new_bucket_condition(self, existing_bucket) + create_new_bucket = cf.create_new_bucket_condition(self, existing_bucket) # Amazon ECR repo needs too be created for custom Algorithms - create_new_ecr_repo = create_new_ecr_repo_condition(self, existing_ecr_repo) + create_new_ecr_repo = cf.create_new_ecr_repo_condition(self, existing_ecr_repo) # Constants pipeline_stack_name = "mlops-pipeline" @@ -259,7 +249,7 @@ def __init__(self, scope: core.Construct, id: str, *, multi_account=False, **kwa }, ) - # add lambda supressions + # add lambda suppressions provisioner_apigw_lambda.lambda_function.node.default_child.cfn_options.metadata = suppress_lambda_policies() provision_resource = provisioner_apigw_lambda.api_gateway.root.add_resource("provisionpipeline") @@ -370,10 +360,10 @@ def __init__(self, scope: core.Construct, id: str, *, multi_account=False, **kwa cross_account_keys=False, ) codecommit_pipeline.add_to_role_policy( - create_inovoke_lambda_policy([provisioner_apigw_lambda.lambda_function.function_arn]) + create_invoke_lambda_policy([provisioner_apigw_lambda.lambda_function.function_arn]) ) codebuild_project.add_to_role_policy( - create_inovoke_lambda_policy([provisioner_apigw_lambda.lambda_function.function_arn]) + create_invoke_lambda_policy([provisioner_apigw_lambda.lambda_function.function_arn]) ) pipeline_child_nodes = codecommit_pipeline.node.find_all() pipeline_child_nodes[1].node.default_child.cfn_options.metadata = { @@ -425,7 +415,23 @@ def __init__(self, scope: core.Construct, id: str, *, multi_account=False, **kwa }, } + # configure mutli-account parameters and permissions + is_delegated_admin = None + if multi_account: + paramaters_list, paramaters_labels, is_delegated_admin = configure_multi_account_parameters_permissions( + self, + assets_bucket, + blueprint_repository_bucket, + ecr_repo, + model_registry, + provisioner_apigw_lambda.lambda_function, + paramaters_list, + paramaters_labels, + ) + # properties of send data custom resource + # if you add new metrics to the cr properties, make sure to updated the allowed keys + # to send in the "_sanitize_data" function in source/lambdas/solution_helper/lambda_function.py send_data_cr_properties = { "Resource": "AnonymousMetric", "UUID": create_id_function.get_att_string("UUID"), @@ -441,29 +447,12 @@ def __init__(self, scope: core.Construct, id: str, *, multi_account=False, **kwa ).to_string(), "Region": core.Aws.REGION, "IsMultiAccount": str(multi_account), + "IsDelegatedAccount": is_delegated_admin if multi_account else core.Aws.NO_VALUE, "UseModelRegistry": use_model_registry.value_as_string, "SolutionId": get_cdk_context_value(self, "SolutionId"), "Version": get_cdk_context_value(self, "Version"), } - # configure mutli-account parameters and permissions - if multi_account: - ( - paramaters_list, - paramaters_labels, - send_data_cr_properties, - ) = configure_multi_account_parameters_permissions( - self, - assets_bucket, - blueprint_repository_bucket, - ecr_repo, - model_registry, - provisioner_apigw_lambda.lambda_function, - paramaters_list, - paramaters_labels, - send_data_cr_properties, - ) - # create send data custom resource send_data_function = create_send_data_custom_resource( self, helper_function.function_arn, send_data_cr_properties diff --git a/source/lib/blueprints/byom/byom_batch_pipeline.py b/source/lib/blueprints/byom/byom_batch_pipeline.py index 7571fcb..8b3a3e7 100644 --- a/source/lib/blueprints/byom/byom_batch_pipeline.py +++ b/source/lib/blueprints/byom/byom_batch_pipeline.py @@ -1,5 +1,5 @@ # ##################################################################################################################### -# Copyright 2020-2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # # # # Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance # # with the License. A copy of the License is located at # @@ -22,22 +22,8 @@ from lib.blueprints.byom.pipeline_definitions.sagemaker_role import create_sagemaker_role from lib.blueprints.byom.pipeline_definitions.sagemaker_model import create_sagemaker_model from lib.blueprints.byom.pipeline_definitions.templates_parameters import ( - create_blueprint_bucket_name_parameter, - create_assets_bucket_name_parameter, - create_algorithm_image_uri_parameter, - create_batch_input_bucket_name_parameter, - create_batch_inference_data_parameter, - create_batch_job_output_location_parameter, - create_custom_algorithms_ecr_repo_arn_parameter, - create_inference_instance_parameter, - create_kms_key_arn_parameter, - create_model_artifact_location_parameter, - create_model_name_parameter, - create_custom_algorithms_ecr_repo_arn_provided_condition, - create_kms_key_arn_provided_condition, - create_model_package_name_parameter, - create_model_registry_provided_condition, - create_model_package_group_name_parameter, + ParameteresFactory as pf, + ConditionsFactory as cf, ) @@ -46,31 +32,33 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) # Parameteres # - blueprint_bucket_name = create_blueprint_bucket_name_parameter(self) - assets_bucket_name = create_assets_bucket_name_parameter(self) - custom_algorithms_ecr_repo_arn = create_custom_algorithms_ecr_repo_arn_parameter(self) - kms_key_arn = create_kms_key_arn_parameter(self) - algorithm_image_uri = create_algorithm_image_uri_parameter(self) - model_name = create_model_name_parameter(self) - model_artifact_location = create_model_artifact_location_parameter(self) - inference_instance = create_inference_instance_parameter(self) - batch_input_bucket = create_batch_input_bucket_name_parameter(self) - batch_inference_data = create_batch_inference_data_parameter(self) - batch_job_output_location = create_batch_job_output_location_parameter(self) - model_package_group_name = create_model_package_group_name_parameter(self) - model_package_name = create_model_package_name_parameter(self) + blueprint_bucket_name = pf.create_blueprint_bucket_name_parameter(self) + assets_bucket_name = pf.create_assets_bucket_name_parameter(self) + custom_algorithms_ecr_repo_arn = pf.create_custom_algorithms_ecr_repo_arn_parameter(self) + kms_key_arn = pf.create_kms_key_arn_parameter(self) + algorithm_image_uri = pf.create_algorithm_image_uri_parameter(self) + model_name = pf.create_model_name_parameter(self) + model_artifact_location = pf.create_model_artifact_location_parameter(self) + inference_instance = pf.create_inference_instance_parameter(self) + batch_input_bucket = pf.create_batch_input_bucket_name_parameter(self) + batch_inference_data = pf.create_batch_inference_data_parameter(self) + batch_job_output_location = pf.create_batch_job_output_location_parameter(self) + model_package_group_name = pf.create_model_package_group_name_parameter(self) + model_package_name = pf.create_model_package_name_parameter(self) # Conditions - custom_algorithms_ecr_repo_arn_provided = create_custom_algorithms_ecr_repo_arn_provided_condition( + custom_algorithms_ecr_repo_arn_provided = cf.create_custom_algorithms_ecr_repo_arn_provided_condition( self, custom_algorithms_ecr_repo_arn ) - kms_key_arn_provided = create_kms_key_arn_provided_condition(self, kms_key_arn) - model_registry_provided = create_model_registry_provided_condition(self, model_package_name) + kms_key_arn_provided = cf.create_kms_key_arn_provided_condition(self, kms_key_arn) + model_registry_provided = cf.create_model_registry_provided_condition(self, model_package_name) # Resources # - assets_bucket = s3.Bucket.from_bucket_name(self, "AssetsBucket", assets_bucket_name.value_as_string) + assets_bucket = s3.Bucket.from_bucket_name(self, "ImportedAssetsBucket", assets_bucket_name.value_as_string) # getting blueprint bucket object from its name - will be used later in the stack - blueprint_bucket = s3.Bucket.from_bucket_name(self, "BlueprintBucket", blueprint_bucket_name.value_as_string) + blueprint_bucket = s3.Bucket.from_bucket_name( + self, "ImportedBlueprintBucket", blueprint_bucket_name.value_as_string + ) sm_layer = sagemaker_layer(self, blueprint_bucket) # creating a sagemaker model @@ -147,7 +135,7 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: core.CfnOutput( self, - id="ModelName", + id="SageMakerModelName", value=sagemaker_model.attr_model_name, description="The name of the SageMaker model used by the batch transform job", ) diff --git a/source/lib/blueprints/byom/byom_custom_algorithm_image_builder.py b/source/lib/blueprints/byom/byom_custom_algorithm_image_builder.py index 29d6b1f..594f943 100644 --- a/source/lib/blueprints/byom/byom_custom_algorithm_image_builder.py +++ b/source/lib/blueprints/byom/byom_custom_algorithm_image_builder.py @@ -1,5 +1,5 @@ # ##################################################################################################################### -# Copyright 2020-2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # # # # Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance # # with the License. A copy of the License is located at # @@ -28,13 +28,7 @@ suppress_iam_complex, suppress_sns, ) -from lib.blueprints.byom.pipeline_definitions.templates_parameters import ( - create_notification_email_parameter, - create_assets_bucket_name_parameter, - create_custom_container_parameter, - create_ecr_repo_name_parameter, - create_image_tag_parameter, -) +from lib.blueprints.byom.pipeline_definitions.templates_parameters import ParameteresFactory as pf class BYOMCustomAlgorithmImageBuilderStack(core.Stack): @@ -42,14 +36,14 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) # Parameteres # - notification_email = create_notification_email_parameter(self) - assets_bucket_name = create_assets_bucket_name_parameter(self) - custom_container = create_custom_container_parameter(self) - ecr_repo_name = create_ecr_repo_name_parameter(self) - image_tag = create_image_tag_parameter(self) + notification_email = pf.create_notification_email_parameter(self) + assets_bucket_name = pf.create_assets_bucket_name_parameter(self) + custom_container = pf.create_custom_container_parameter(self) + ecr_repo_name = pf.create_ecr_repo_name_parameter(self) + image_tag = pf.create_image_tag_parameter(self) # Resources # - assets_bucket = s3.Bucket.from_bucket_name(self, "AssetsBucket", assets_bucket_name.value_as_string) + assets_bucket = s3.Bucket.from_bucket_name(self, "ImportedAssetsBucket", assets_bucket_name.value_as_string) # Defining pipeline stages # source stage @@ -75,7 +69,7 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: image_builder_pipeline = codepipeline.Pipeline( self, - "BYOMPipelineReatimeBuild", + "BYOMPipelineRealtimeBuild", stages=[source_stage, build_stage], cross_account_keys=False, ) @@ -103,7 +97,7 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: ) ) - # add cfn nag supressions + # add cfn nag suppressions pipeline_child_nodes = image_builder_pipeline.node.find_all() pipeline_child_nodes[1].node.default_child.cfn_options.metadata = suppress_pipeline_bucket() pipeline_child_nodes[6].node.default_child.cfn_options.metadata = suppress_iam_complex() diff --git a/source/lib/blueprints/byom/lambdas/create_data_baseline_job/.coveragerc b/source/lib/blueprints/byom/lambdas/create_baseline_job/.coveragerc similarity index 100% rename from source/lib/blueprints/byom/lambdas/create_data_baseline_job/.coveragerc rename to source/lib/blueprints/byom/lambdas/create_baseline_job/.coveragerc diff --git a/source/lib/blueprints/byom/lambdas/create_baseline_job/baselines_helper.py b/source/lib/blueprints/byom/lambdas/create_baseline_job/baselines_helper.py new file mode 100644 index 0000000..779c1aa --- /dev/null +++ b/source/lib/blueprints/byom/lambdas/create_baseline_job/baselines_helper.py @@ -0,0 +1,324 @@ +# ##################################################################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance # +# with the License. A copy of the License is located at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES # +# OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions # +# and limitations under the License. # +# ##################################################################################################################### +from typing import Callable, Any, Dict, List, Optional +import logging +import sagemaker +from sagemaker.model_monitor import DefaultModelMonitor +from sagemaker.model_monitor import ModelQualityMonitor +from sagemaker.model_monitor.dataset_format import DatasetFormat + +logger = logging.getLogger(__name__) + + +def exception_handler(func: Callable[..., Any]) -> Any: + """ + Docorator function to handle exceptions + + Args: + func (object): function to be decorated + + Returns: + func's return value + + Raises: + Exception thrown by the decorated function + """ + + def wrapper_function(*args, **kwargs): + try: + return func(*args, **kwargs) + + except Exception as e: + logger.error(f"Error in {func.__name__}: {str(e)}") + raise e + + return wrapper_function + + +class SolutionSageMakerBaselines: + """ + Creates Amazon SageMaker (DataQuality or ModelQuality) Baselines Jobs + + Attributes: + monitoring_type (str): type of SageMaker Model Monitor. Supported values ['DataQuality'|'ModelQuality'] + instance_type (str): compute instance type for the baseline job, in the form of a CDK CfnParameter object + instance_count (int): number of EC2 instances + instance_volume_size (int): volume size of the EC2 instance + role_arn (str): Sagemaker role's arn to be used to create the baseline job + baseline_job_name (str): name of the baseline job to be created + baseline_dataset (str): S3 URI location of the baseline data (file's format: csv) + output_s3_uri (str): S3 prefix of the baseline job's output + max_runtime_seconds (int): optional max time the job is allowed to run + kms_key_arn (str): optional arn of the kms key used to encrypt datacapture and + to encrypt job's output + problem_type (str): used with ModelQuality baseline. Type of Machine Learning problem. Valid values are + ['Regression'|'BinaryClassification'|'MulticlassClassification'] (default: None). + ground_truth_attribute (str): index or JSONpath to locate actual label(s) (used with ModelQuality baseline). + (default: None). + inference_attribute (str): index or JSONpath to locate predicted label(s) (used with ModelQuality baseline). + Required for 'Regression'|'MulticlassClassification' problems, + and not required for 'BinaryClassification' if 'probability_attribute' and + 'probability_threshold_attribute' are provided (default: None). + probability_attribute (str): index or JSONpath to locate probabilities(used with ModelQuality baseline). + Used only with 'BinaryClassification' problem if 'inference_attribute' is not provided (default: None). + probability_threshold_attribute (float): threshold to convert probabilities to binaries (used with ModelQuality baseline). + Used only with 'BinaryClassification' problem if 'inference_attribute' is not provided (default: None). + sagemaker_session: (sagemaker.session.Session): Session object which manages interactions with Amazon SageMaker + APIs and any other AWS services needed. If not specified, one is created using the default AWS configuration + chain (default: None). + tags (list[dict[str, str]]): resource tags (default: None). + """ + + @exception_handler + def __init__( + self, # NOSONAR:S107 the class is designed to take many attributes + monitoring_type: str, + instance_type: str, + instance_count: int, + instance_volume_size: int, + role_arn: str, + baseline_job_name: str, + baseline_dataset: str, + output_s3_uri: str, + max_runtime_in_seconds: Optional[int] = None, + kms_key_arn: Optional[str] = None, + problem_type: Optional[str] = None, + ground_truth_attribute: Optional[str] = None, + inference_attribute: Optional[str] = None, + probability_attribute: Optional[str] = None, + probability_threshold_attribute: Optional[float] = None, + sagemaker_session: Optional[sagemaker.session.Session] = None, + tags: Optional[List[Dict[str, str]]] = None, + ) -> None: + # validate the provided monitoring_type + if monitoring_type not in ["DataQuality", "ModelQuality"]: + raise ValueError( + ( + f"The provided monitoring type: {monitoring_type} is not valid. " + + "It must be 'DataQuality'|'ModelQuality'" + ) + ) + self.monitoring_type = monitoring_type + self.instance_type = instance_type + self.instance_count = instance_count + self.instance_volume_size = instance_volume_size + self.role_arn = role_arn + self.baseline_job_name = baseline_job_name + self.baseline_dataset = baseline_dataset + self.output_s3_uri = output_s3_uri + self.max_runtime_in_seconds = max_runtime_in_seconds + self.kms_key_arn = kms_key_arn + self.problem_type = problem_type + self.ground_truth_attribute = ground_truth_attribute + self.inference_attribute = inference_attribute + self.probability_attribute = probability_attribute + self.probability_threshold_attribute = probability_threshold_attribute + self.sagemaker_session = sagemaker_session + self.tags = tags + + @exception_handler + def create_baseline_job(self) -> sagemaker.processing.ProcessingJob: + """ + Gets the *BaselineJob based on the monitoring_type + + Returns: + sagemaker.processing.ProcessingJob object + """ + # create *Baseline Job MonitoringType->function_name map + type_function_map = dict( + DataQuality="_create_data_quality_baseline", ModelQuality="_create_model_quality_baseline" + ) + + # get the formated baseline job arguments + baseline_job_args = self._get_baseline_job_args() + + # call the right function to create the *Baseline Job + baseline_processing_job = getattr(self, type_function_map[self.monitoring_type])(baseline_job_args) + + return baseline_processing_job + + @exception_handler + def _get_baseline_job_args( + self, + ) -> Dict[str, Dict[str, str]]: + """ + Gets the baseline job arguments to create the *baseline job + + Returns: + dict[str, dict[str, str]]: the arguments to create the *baseline job + """ + # validate baseline_dataset + if not self._is_valid_argument_value(self.baseline_dataset): + raise ValueError( + f"BaselineDataset S3Uri must be provided to create the {self.monitoring_type} baseline job" + ) + + baseline_args = dict( + # args passed to the Monitor class's construct + class_args=dict( + instance_type=self.instance_type, + instance_count=self.instance_count, + volume_size_in_gb=self.instance_volume_size, + role=self.role_arn, + ), + # args passed to the Monitor class's suggest_baseline function + suggest_args=dict( + job_name=self.baseline_job_name, + dataset_format=DatasetFormat.csv(header=True), + baseline_dataset=self.baseline_dataset, + output_s3_uri=self.output_s3_uri, + ), + ) + + # add max_runtime_in_seconds if provided + if self.max_runtime_in_seconds: + baseline_args["class_args"].update({"max_runtime_in_seconds": self.max_runtime_in_seconds}) + + # add sagemaker session if provided + if self.sagemaker_session: + baseline_args["class_args"].update({"sagemaker_session": self.sagemaker_session}) + + # add tags if provided + if self.tags: + baseline_args["class_args"].update({"tags": self.tags}) + + # add kms key if provided + if self.kms_key_arn: + baseline_args["class_args"].update({"output_kms_key": self.kms_key_arn}) + baseline_args["class_args"].update({"volume_kms_key": self.kms_key_arn}) + + # add ModelQuality args + if self.monitoring_type == "ModelQuality": + baseline_args = self._add_model_quality_args(baseline_args) + + return baseline_args + + @exception_handler + def _add_model_quality_args( + self, + baseline_args: Dict[str, Dict[str, str]], + ) -> Dict[str, Dict[str, str]]: + """ + Adds ModelQuality's specific arguments to the passed baseline_args + + Args: + baseline_args (dict[str, dict[str, str]]): arguments to create the baseline job + + Returns: + dict[str, dict[str, str]]: The combined arguments to create the baseline job + """ + # validate the problem_type + if self.problem_type not in ["Regression", "BinaryClassification", "MulticlassClassification"]: + raise ValueError( + ( + f"The {self.problem_type} is not valid. ProblemType must be " + + "['Regression'|'BinaryClassification'|'MulticlassClassification']" + ) + ) + baseline_args["suggest_args"].update({"problem_type": self.problem_type}) + + # For Regression or MulticlassClassification, inference_attribute is required + if self.problem_type in ["Regression", "MulticlassClassification"]: + # validate InferenceAttribute value + if not self._is_valid_argument_value(self.inference_attribute): + raise ValueError( + "InferenceAttribute must not be provided for ProblemType: Regression or MulticlassClassification" + ) + # add to args dict + baseline_args["suggest_args"].update({"inference_attribute": self.inference_attribute}) + # For BinaryClassification, use probability_attribute and probability_threshold_attribute or inference_attribute + else: + if self._is_valid_argument_value(self.probability_attribute) and self._is_valid_argument_value( + self.probability_threshold_attribute + ): + baseline_args["suggest_args"].update({"probability_attribute": self.probability_attribute}) + baseline_args["suggest_args"].update( + {"probability_threshold_attribute": self.probability_threshold_attribute} + ) + + elif self._is_valid_argument_value(self.inference_attribute): + baseline_args["suggest_args"].update({"inference_attribute": self.inference_attribute}) + else: + raise ValueError( + ( + "InferenceAttribute or (ProbabilityAttribute/ProbabilityThresholdAttribute) must be provided " + + "for ProblemType: BinaryClassification" + ) + ) + + # validate ground_truth_attribute + if not self._is_valid_argument_value(self.ground_truth_attribute): + raise ValueError("GroundTruthAttribute must be provided") + + baseline_args["suggest_args"].update({"ground_truth_attribute": self.ground_truth_attribute}) + + return baseline_args + + @exception_handler + def _create_data_quality_baseline( + self, data_quality_baseline_job_args: Dict[str, Dict[str, str]] + ) -> sagemaker.processing.ProcessingJob: + """ + Creates SageMaker DataQuality baseline job + + Args: + data_quality_baseline_job_args (dict[str, dict[str, str]]): The DataQuality baseline job arguments + + Returns: + sagemaker.processing.ProcessingJob object + """ + logger.info( + f"Creating DataQuality baseline job {data_quality_baseline_job_args['suggest_args']['job_name']} ..." + ) + + # create DefaultModelMonitor + data_quality_monitor = DefaultModelMonitor(**data_quality_baseline_job_args["class_args"]) + + # create the DataQuality baseline job + data_baseline_job = data_quality_monitor.suggest_baseline( + **data_quality_baseline_job_args["suggest_args"], + ) + + return data_baseline_job + + @exception_handler + def _create_model_quality_baseline( + self, + model_quality_baseline_job_args: Dict[str, Dict[str, str]], + ) -> sagemaker.processing.ProcessingJob: + """ + Creates SageMaker ModelQuality baseline job + + Args: + model_quality_baseline_job_config (dict[str, dict[str, str]]): The ModelQuality baseline job arguments + + Returns: + sagemaker.processing.ProcessingJob object + """ + logger.info( + f"Creating ModelQuality baseline job {model_quality_baseline_job_args['suggest_args']['job_name']} ..." + ) + + # create ModelQualityMonitor + model_quality_monitor = ModelQualityMonitor(**model_quality_baseline_job_args["class_args"]) + + # create the DataQuality baseline job + model_baseline_job = model_quality_monitor.suggest_baseline( + **model_quality_baseline_job_args["suggest_args"], + ) + + return model_baseline_job + + def _is_valid_argument_value(self, value: str) -> bool: + # validate the argument's value is not None or empty string + return True if value else False diff --git a/source/lib/blueprints/byom/lambdas/create_baseline_job/main.py b/source/lib/blueprints/byom/lambdas/create_baseline_job/main.py new file mode 100644 index 0000000..80fb55d --- /dev/null +++ b/source/lib/blueprints/byom/lambdas/create_baseline_job/main.py @@ -0,0 +1,57 @@ +# ##################################################################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance # +# with the License. A copy of the License is located at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES # +# OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions # +# and limitations under the License. # +# ##################################################################################################################### +import os +import sagemaker +from shared.logger import get_logger +from baselines_helper import SolutionSageMakerBaselines, exception_handler + + +logger = get_logger(__name__) +sagemaker_session = sagemaker.session.Session() + + +@exception_handler +def handler(event, context): + # get some environment variables + assets_bucket = os.environ["ASSETS_BUCKET"] + monitoring_type = os.environ.get("MONITORING_TYPE") + baseline_job_name = os.environ["BASELINE_JOB_NAME"] + max_runtime_seconds = os.environ.get("MAX_RUNTIME_SECONDS") + + logger.info(f"Creating {monitoring_type} baseline processing job {baseline_job_name} ...") + + # create a SageMakerBaselines instance + sagemaker_baseline = SolutionSageMakerBaselines( + monitoring_type=os.environ.get("MONITORING_TYPE"), + instance_type=os.environ.get("INSTANCE_TYPE", "ml.m5.large"), + instance_count=int(os.environ.get("INSTANCE_COUNT", "1")), + instance_volume_size=int(os.environ.get("INSTANCE_VOLUME_SIZE", "30")), + role_arn=os.environ["ROLE_ARN"], + baseline_job_name=os.environ["BASELINE_JOB_NAME"], + baseline_dataset=f"s3://{assets_bucket}/{os.environ['BASELINE_DATA_LOCATION']}", + output_s3_uri=f"s3://{os.environ['BASELINE_JOB_OUTPUT_LOCATION']}", + max_runtime_in_seconds=int(max_runtime_seconds) if max_runtime_seconds else None, + kms_key_arn=os.environ.get("KMS_KEY_ARN"), + problem_type=os.environ.get("PROBLEM_TYPE"), + ground_truth_attribute=os.environ.get("GROUND_TRUTH_ATTRIBUTE"), + inference_attribute=os.environ.get("INFERENCE_ATTRIBUTE"), + probability_attribute=os.environ.get("PROBABILITY_ATTRIBUTE"), + probability_threshold_attribute=os.environ.get("PROBABILITY_THRESHOLD_ATTRIBUTE"), + sagemaker_session=sagemaker_session, + tags=[{"Key": "stack_name", "Value": os.environ["STACK_NAME"]}], + ) + + # create the SageMaker Baseline Job + baseline_job = sagemaker_baseline.create_baseline_job() + + logger.info(f"Started {monitoring_type} baseline processing job. Job info: {baseline_job.describe()}") diff --git a/source/lib/blueprints/byom/lambdas/create_data_baseline_job/requirements-test.txt b/source/lib/blueprints/byom/lambdas/create_baseline_job/requirements-test.txt similarity index 100% rename from source/lib/blueprints/byom/lambdas/create_data_baseline_job/requirements-test.txt rename to source/lib/blueprints/byom/lambdas/create_baseline_job/requirements-test.txt diff --git a/source/lib/blueprints/byom/lambdas/create_data_baseline_job/setup.py b/source/lib/blueprints/byom/lambdas/create_baseline_job/setup.py similarity index 100% rename from source/lib/blueprints/byom/lambdas/create_data_baseline_job/setup.py rename to source/lib/blueprints/byom/lambdas/create_baseline_job/setup.py diff --git a/source/lib/blueprints/byom/lambdas/create_data_baseline_job/tests/__init__.py b/source/lib/blueprints/byom/lambdas/create_baseline_job/tests/__init__.py similarity index 100% rename from source/lib/blueprints/byom/lambdas/create_data_baseline_job/tests/__init__.py rename to source/lib/blueprints/byom/lambdas/create_baseline_job/tests/__init__.py diff --git a/source/lib/blueprints/byom/lambdas/create_baseline_job/tests/fixtures/baseline_fixtures.py b/source/lib/blueprints/byom/lambdas/create_baseline_job/tests/fixtures/baseline_fixtures.py new file mode 100644 index 0000000..b035a6f --- /dev/null +++ b/source/lib/blueprints/byom/lambdas/create_baseline_job/tests/fixtures/baseline_fixtures.py @@ -0,0 +1,175 @@ +####################################################################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance # +# with the License. A copy of the License is located at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES # +# OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions # +# and limitations under the License. # +# ##################################################################################################################### +import os +import pytest +from baselines_helper import SolutionSageMakerBaselines +from sagemaker.model_monitor.dataset_format import DatasetFormat +import sagemaker + +# create sagemaker session +sagemaker_session = sagemaker.session.Session() + + +@pytest.fixture +def mock_basic_data_quality_env(): + data_quality_env = { + "MONITORING_TYPE": "DataQuality", + "BASELINE_JOB_NAME": "test-baseline-job", + "ASSETS_BUCKET": "testbucket", + "SAGEMAKER_ENDPOINT_NAME": "Sagemaker-test-endpoint", + "BASELINE_DATA_LOCATION": "baseline_data.csv", + "BASELINE_JOB_OUTPUT_LOCATION": "s3://testbucket/baseline_output", + "INSTANCE_TYPE": "ml.m5.4xlarge", + "INSTANCE_VOLUME_SIZE": "20", + "ROLE_ARN": "arn:aws:iam::account:role/myrole", + "STACK_NAME": "test_stack", + "LOG_LEVEL": "INFO", + } + + return data_quality_env + + +@pytest.fixture +def mock_data_quality_env_with_optional_vars(mock_basic_data_quality_env): + data_quality_env = mock_basic_data_quality_env.copy() + data_quality_env.update( + { + "MAX_RUNTIME_SECONDS": "3300", + "KMS_KEY_ARN": "arn:aws:kms:region:accountid:key/mykey", + } + ) + + return data_quality_env + + +@pytest.fixture +def mock_model_quality_env_with_optional_vars(mock_data_quality_env_with_optional_vars): + model_quality_env = mock_data_quality_env_with_optional_vars.copy() + model_quality_env.update( + { + "MONITORING_TYPE": "ModelQuality", + "PROBLEM_TYPE": "BinaryClassification", + "GROUND_TRUTH_ATTRIBUTE": "label", + "INFERENCE_ATTRIBUTE": "prediction", + "PROBABILITY_ATTRIBUTE": "probability", + "PROBABILITY_THRESHOLD_ATTRIBUTE": "0.5", + } + ) + + return model_quality_env + + +@pytest.fixture +def mocked_sagemaker_baseline_attributes( + monkeypatch, + mock_basic_data_quality_env, + mock_data_quality_env_with_optional_vars, + mock_model_quality_env_with_optional_vars, +): + def _mocked_sagemaker_baseline_attributes(monitoring_type, with_optional=False): + # set the env variables based on monitoring_type, with_optional + if monitoring_type == "DataQuality": + if with_optional: + envs = mock_data_quality_env_with_optional_vars + else: + envs = mock_basic_data_quality_env + else: + envs = mock_model_quality_env_with_optional_vars + + monkeypatch.setattr(os, "environ", envs) + max_runtime_seconds = os.environ.get("MAX_RUNTIME_SECONDS") + + return { + "monitoring_type": monitoring_type, + "instance_type": os.environ.get("INSTANCE_TYPE", "ml.m5.large"), + "instance_count": int(os.environ.get("INSTANCE_COUNT", "1")), + "instance_volume_size": int(os.environ.get("INSTANCE_VOLUME_SIZE", "30")), + "role_arn": os.environ["ROLE_ARN"], + "baseline_job_name": os.environ["BASELINE_JOB_NAME"], + "baseline_dataset": f"s3://{os.environ['ASSETS_BUCKET']}/{os.environ['BASELINE_DATA_LOCATION']}", + "output_s3_uri": os.environ["BASELINE_JOB_OUTPUT_LOCATION"], + "max_runtime_in_seconds": int(max_runtime_seconds) if max_runtime_seconds else None, + "kms_key_arn": os.environ.get("KMS_KEY_ARN"), + "problem_type": os.environ.get("PROBLEM_TYPE"), + "ground_truth_attribute": os.environ.get("GROUND_TRUTH_ATTRIBUTE"), + "inference_attribute": os.environ.get("INFERENCE_ATTRIBUTE"), + "probability_attribute": os.environ.get("PROBABILITY_ATTRIBUTE"), + "probability_threshold_attribute": os.environ.get("PROBABILITY_THRESHOLD_ATTRIBUTE"), + "sagemaker_session": sagemaker_session, + "tags": [{"Key": "stack_name", "Value": os.environ["STACK_NAME"]}], + } + + return _mocked_sagemaker_baseline_attributes + + +@pytest.fixture +def mocked_sagemaker_baselines_instance(mocked_sagemaker_baseline_attributes): + def _mocked_sagemaker_baselines_instance(monitoring_type, with_optional=True): + return SolutionSageMakerBaselines(**mocked_sagemaker_baseline_attributes(monitoring_type, with_optional)) + + return _mocked_sagemaker_baselines_instance + + +@pytest.fixture +def mocked_expected_baseline_args(mocked_sagemaker_baselines_instance): + def _mocked_expected_baseline_args(monitoring_type): + sagemaker_baselines_instance = mocked_sagemaker_baselines_instance(monitoring_type) + baseline_args = dict( + # args passed to the Monitor class's construct + class_args=dict( + instance_type=sagemaker_baselines_instance.instance_type, + instance_count=sagemaker_baselines_instance.instance_count, + volume_size_in_gb=sagemaker_baselines_instance.instance_volume_size, + role=sagemaker_baselines_instance.role_arn, + max_runtime_in_seconds=sagemaker_baselines_instance.max_runtime_in_seconds, + output_kms_key=sagemaker_baselines_instance.kms_key_arn, + volume_kms_key=sagemaker_baselines_instance.kms_key_arn, + sagemaker_session=sagemaker_baselines_instance.sagemaker_session, + tags=sagemaker_baselines_instance.tags, + ), + # args passed to the Monitor class's suggest_baseline function + suggest_args=dict( + job_name=sagemaker_baselines_instance.baseline_job_name, + dataset_format=DatasetFormat.csv(header=True), + baseline_dataset=sagemaker_baselines_instance.baseline_dataset, + output_s3_uri=sagemaker_baselines_instance.output_s3_uri, + ), + ) + + # add ModelQuality + if monitoring_type == "ModelQuality": + baseline_args["suggest_args"].update({"problem_type": sagemaker_baselines_instance.problem_type}) + if sagemaker_baselines_instance.problem_type in ["Regression", "MulticlassClassification"]: + baseline_args["suggest_args"].update( + {"inference_attribute": sagemaker_baselines_instance.inference_attribute} + ) + else: + baseline_args["suggest_args"].update( + {"probability_attribute": sagemaker_baselines_instance.probability_attribute} + ) + baseline_args["suggest_args"].update( + {"probability_threshold_attribute": sagemaker_baselines_instance.probability_threshold_attribute} + ) + baseline_args["suggest_args"].update( + {"ground_truth_attribute": sagemaker_baselines_instance.ground_truth_attribute} + ) + return baseline_args + + return _mocked_expected_baseline_args + + +@pytest.fixture() +def event(): + return { + "message": "Start data baseline job", + } diff --git a/source/lib/blueprints/byom/lambdas/create_baseline_job/tests/test_create_data_baseline.py b/source/lib/blueprints/byom/lambdas/create_baseline_job/tests/test_create_data_baseline.py new file mode 100644 index 0000000..764115d --- /dev/null +++ b/source/lib/blueprints/byom/lambdas/create_baseline_job/tests/test_create_data_baseline.py @@ -0,0 +1,195 @@ +####################################################################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance # +# with the License. A copy of the License is located at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES # +# OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions # +# and limitations under the License. # +# ##################################################################################################################### +from unittest.mock import patch +from unittest import TestCase +import pytest +import os +from main import handler +from tests.fixtures.baseline_fixtures import ( + mock_basic_data_quality_env, + mock_data_quality_env_with_optional_vars, + mock_model_quality_env_with_optional_vars, + mocked_sagemaker_baseline_attributes, + mocked_sagemaker_baselines_instance, + mocked_expected_baseline_args, + event, +) +from baselines_helper import SolutionSageMakerBaselines + + +def test_init(mocked_sagemaker_baseline_attributes): + # test object creation based on MonitoringType and env variables + # test DataQuality with Optional parameters (max_run_time and kms_key_arn) are not provided + baselines = SolutionSageMakerBaselines(**mocked_sagemaker_baseline_attributes("DataQuality")) + assert baselines.monitoring_type == os.environ["MONITORING_TYPE"] + assert baselines.problem_type is None + assert baselines.ground_truth_attribute is None + assert baselines.inference_attribute is None + assert baselines.probability_attribute is None + assert baselines.probability_threshold_attribute is None + assert baselines.max_runtime_in_seconds is None + assert baselines.kms_key_arn is None + + # test DataQuality with Optional parameters are provided + baselines = SolutionSageMakerBaselines(**mocked_sagemaker_baseline_attributes("DataQuality", with_optional=True)) + assert baselines.monitoring_type == os.environ["MONITORING_TYPE"] + assert baselines.max_runtime_in_seconds == int(os.environ["MAX_RUNTIME_SECONDS"]) + assert baselines.kms_key_arn == os.environ["KMS_KEY_ARN"] + + # test ModelQuality with Optional parameters (max_run_time and kms_key_arn) are not provided + baselines = SolutionSageMakerBaselines(**mocked_sagemaker_baseline_attributes("ModelQuality")) + assert baselines.monitoring_type == os.environ["MONITORING_TYPE"] + assert baselines.problem_type == os.environ["PROBLEM_TYPE"] + assert baselines.ground_truth_attribute == os.environ["GROUND_TRUTH_ATTRIBUTE"] + assert baselines.inference_attribute == os.environ["INFERENCE_ATTRIBUTE"] + assert baselines.probability_attribute == os.environ["PROBABILITY_ATTRIBUTE"] + assert baselines.probability_threshold_attribute == os.environ["PROBABILITY_THRESHOLD_ATTRIBUTE"] + + # test exception if non-supported monitoring type is passed + with pytest.raises(ValueError) as error: + SolutionSageMakerBaselines(**mocked_sagemaker_baseline_attributes("NotSupported")) + assert str(error.value) == ( + "The provided monitoring type: NotSupported is not valid. It must be 'DataQuality'|'ModelQuality'" + ) + + +def test_get_baseline_job_args( + mocked_sagemaker_baselines_instance, mocked_expected_baseline_args, mocked_sagemaker_baseline_attributes +): + sagemaker_baselines = mocked_sagemaker_baselines_instance("DataQuality") + # assert the returned baseline args for DataQuality baseline + TestCase().assertDictEqual( + sagemaker_baselines._get_baseline_job_args(), mocked_expected_baseline_args("DataQuality") + ) + + # assert the returned baseline args for ModelQuality baseline + sagemaker_baselines = mocked_sagemaker_baselines_instance("ModelQuality") + TestCase().assertDictEqual( + sagemaker_baselines._get_baseline_job_args(), mocked_expected_baseline_args("ModelQuality") + ) + + # test BinaryClassification with only inference_attribute provided + baseline_attributes = mocked_sagemaker_baseline_attributes("ModelQuality") + baseline_attributes["probability_attribute"] = "" + baseline_attributes["probability_threshold_attribute"] = None + baseline_instance = SolutionSageMakerBaselines(**baseline_attributes) + baseline_args = baseline_instance._get_baseline_job_args() + assert baseline_args["suggest_args"]["problem_type"] == "BinaryClassification" + assert baseline_args["suggest_args"]["inference_attribute"] == baseline_attributes["inference_attribute"] + assert baseline_args["suggest_args"].get("probability_attribute") is None + assert baseline_args["suggest_args"].get("probability_threshold_attribute") is None + + # test problem_type = "Regression"|"MulticlassClassification" + baseline_attributes = mocked_sagemaker_baseline_attributes("ModelQuality") + baseline_attributes["problem_type"] = "Regression" + baseline_instance = SolutionSageMakerBaselines(**baseline_attributes) + baseline_args = baseline_instance._get_baseline_job_args() + assert baseline_args["suggest_args"]["problem_type"] == "Regression" + assert baseline_args["suggest_args"]["inference_attribute"] == baseline_attributes["inference_attribute"] + assert baseline_args["suggest_args"].get("probability_attribute") is None + assert baseline_args["suggest_args"].get("probability_threshold_attribute") is None + + +def test_get_baseline_job_args_exceptions(mocked_sagemaker_baseline_attributes): + # test exception if baseline_dataset is not provided + baseline_attributes = mocked_sagemaker_baseline_attributes("ModelQuality") + # provide an empty baseline_dataset + baseline_attributes["baseline_dataset"] = "" + with pytest.raises(ValueError) as error: + baseline = SolutionSageMakerBaselines(**baseline_attributes) + baseline._get_baseline_job_args() + assert str(error.value) == "BaselineDataset S3Uri must be provided to create the ModelQuality baseline job" + # reset value + baseline_attributes["baseline_dataset"] = os.environ["BASELINE_DATA_LOCATION"] + + # test exception for unsupported problem_type + baseline_attributes["problem_type"] = "Unsupported" + with pytest.raises(ValueError) as error: + baseline = SolutionSageMakerBaselines(**baseline_attributes) + baseline._get_baseline_job_args() + assert str(error.value) == ( + "The Unsupported is not valid. ProblemType must be " + + "['Regression'|'BinaryClassification'|'MulticlassClassification']" + ) + + # test exception if inference_attribute not provided + baseline_attributes["problem_type"] = "Regression" + baseline_attributes["inference_attribute"] = "" + with pytest.raises(ValueError) as error: + baseline = SolutionSageMakerBaselines(**baseline_attributes) + baseline._get_baseline_job_args() + assert str(error.value) == ( + "InferenceAttribute must not be provided for ProblemType: Regression or MulticlassClassification" + ) + + # test exception if none of inference_attribute, probability_attribute and probability_threshold_attribute + # in not provided for BinaryClassification problem + baseline_attributes["problem_type"] = "BinaryClassification" + baseline_attributes["inference_attribute"] = "" + baseline_attributes["probability_attribute"] = "" + baseline_attributes["probability_threshold_attribute"] = None + with pytest.raises(ValueError) as error: + baseline = SolutionSageMakerBaselines(**baseline_attributes) + baseline._get_baseline_job_args() + assert str(error.value) == ( + "InferenceAttribute or (ProbabilityAttribute/ProbabilityThresholdAttribute) must be provided " + + "for ProblemType: BinaryClassification" + ) + # reset values + baseline_attributes["inference_attribute"] = os.environ["INFERENCE_ATTRIBUTE"] + baseline_attributes["probability_attribute"] = os.environ["PROBABILITY_ATTRIBUTE"] + baseline_attributes["probability_threshold_attribute"] = os.environ["PROBABILITY_THRESHOLD_ATTRIBUTE"] + + # test exception if ground_truth_attribute is not provides + baseline_attributes["ground_truth_attribute"] = "" + with pytest.raises(ValueError) as error: + baseline = SolutionSageMakerBaselines(**baseline_attributes) + baseline._get_baseline_job_args() + assert str(error.value) == "GroundTruthAttribute must be provided" + + +@patch("baselines_helper.SolutionSageMakerBaselines._create_model_quality_baseline") +@patch("baselines_helper.SolutionSageMakerBaselines._create_data_quality_baseline") +def test_create_baseline_job( + mocked_create_data_quality_baseline, mocked_create_model_quality_baseline, mocked_sagemaker_baselines_instance +): + sagemaker_baselines = mocked_sagemaker_baselines_instance("DataQuality") + sagemaker_baselines.create_baseline_job() + baseline_args = sagemaker_baselines._get_baseline_job_args() + mocked_create_data_quality_baseline.assert_called_with(baseline_args) + + +@patch("baselines_helper.DefaultModelMonitor.suggest_baseline") +def test_create_data_quality_baseline(mocked_default_monitor_suggest_baseline, mocked_sagemaker_baselines_instance): + sagemaker_baselines = mocked_sagemaker_baselines_instance("DataQuality") + expected_baseline_args = sagemaker_baselines._get_baseline_job_args() + sagemaker_baselines._create_data_quality_baseline(expected_baseline_args) + mocked_default_monitor_suggest_baseline.assert_called_with(**expected_baseline_args["suggest_args"]) + + +@patch("baselines_helper.ModelQualityMonitor.suggest_baseline") +def test_create_model_quality_baseline(mocked_model_monitor_suggest_baseline, mocked_sagemaker_baselines_instance): + sagemaker_baselines = mocked_sagemaker_baselines_instance("ModelQuality") + expected_baseline_args = sagemaker_baselines._get_baseline_job_args() + sagemaker_baselines._create_model_quality_baseline(expected_baseline_args) + mocked_model_monitor_suggest_baseline.assert_called_with(**expected_baseline_args["suggest_args"]) + + +@patch("baselines_helper.SolutionSageMakerBaselines.create_baseline_job") +def test_handler(mocked_create_baseline_job, event, mocked_sagemaker_baseline_attributes): + # set the environment variables + mocked_sagemaker_baseline_attributes("ModelQuality") + # calling the handler function should create the SolutionSageMakerBaselines object + # and call the create_baseline_job function + handler(event, {}) + mocked_create_baseline_job.assert_called() diff --git a/source/lib/blueprints/byom/lambdas/create_data_baseline_job/main.py b/source/lib/blueprints/byom/lambdas/create_data_baseline_job/main.py deleted file mode 100644 index eb733f4..0000000 --- a/source/lib/blueprints/byom/lambdas/create_data_baseline_job/main.py +++ /dev/null @@ -1,102 +0,0 @@ -# ##################################################################################################################### -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # -# # -# Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance # -# with the License. A copy of the License is located at # -# # -# http://www.apache.org/licenses/LICENSE-2.0 # -# # -# or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES # -# OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions # -# and limitations under the License. # -# ##################################################################################################################### -import os -import botocore -import boto3 -from shared.logger import get_logger -from shared.helper import get_client, get_built_in_model_monitor_container_uri - -logger = get_logger(__name__) -sm_client = get_client("sagemaker") - - -def handler(event, context): - baseline_job_name = os.environ["BASELINE_JOB_NAME"] - assets_bucket = os.environ["ASSETS_BUCKET"] - training_data_location = os.environ["TRAINING_DATA_LOCATION"] - baseline_job_output_location = os.environ["BASELINE_JOB_OUTPUT_LOCATION"] - instance_type = os.environ["INSTANCE_TYPE"] - instance_volume_size = int(os.environ["INSTANCE_VOLUME_SIZE"]) - role_arn = os.environ["ROLE_ARN"] - kms_key_arn = os.environ.get("KMS_KEY_ARN") - stack_name = os.environ["STACK_NAME"] - max_runtime_seconds = int(os.environ["MAX_RUNTIME_SECONDS"]) - - try: - logger.info(f"Creating data baseline processing job {baseline_job_name} ...") - request = { - "ProcessingJobName": baseline_job_name, - "ProcessingInputs": [ - { - "InputName": "baseline_dataset_input", - "S3Input": { - "S3Uri": f"s3://{assets_bucket}/{training_data_location}", - "LocalPath": "/opt/ml/processing/input/baseline_dataset_input", - "S3DataType": "S3Prefix", - "S3InputMode": "File", - "S3DataDistributionType": "FullyReplicated", - "S3CompressionType": "None", - }, - } - ], - "ProcessingOutputConfig": { - "Outputs": [ - { - "OutputName": "baseline_dataset_output", - "S3Output": { - "S3Uri": f"s3://{baseline_job_output_location}/{baseline_job_name}", - "LocalPath": "/opt/ml/processing/output", - "S3UploadMode": "EndOfJob", - }, - }, - ], - }, - "ProcessingResources": { - "ClusterConfig": { - "InstanceCount": 1, - "InstanceType": instance_type, - "VolumeSizeInGB": instance_volume_size, - } - }, - "AppSpecification": { - "ImageUri": get_built_in_model_monitor_container_uri(boto3.session.Session().region_name), - }, - "Environment": { - "dataset_format": '{"csv": {"header": true, "output_columns_position": "START"}}', - "dataset_source": "/opt/ml/processing/input/baseline_dataset_input", - "output_path": "/opt/ml/processing/output", - "publish_cloudwatch_metrics": "Disabled", - }, - "RoleArn": role_arn, - "Tags": [ - {"Key": "stack_name", "Value": stack_name}, - ], - } - - # optional value, if the client did not provide a value, the orchestraion lambda sets it to -1 - if max_runtime_seconds != -1: - request.update({"StoppingCondition": {"MaxRuntimeInSeconds": max_runtime_seconds}}) - # add kms key if provided - if kms_key_arn: - request["ProcessingOutputConfig"].update({"KmsKeyId": kms_key_arn}) - request["ProcessingResources"]["ClusterConfig"].update({"VolumeKmsKeyId": kms_key_arn}) - - # Sending request to create data baseline processing job - response = sm_client.create_processing_job(**request) - - logger.info(f"Finished creating data baseline processing job. respons: {response}") - logger.info("Data Baseline Processing JobArn: " + response["ProcessingJobArn"]) - - except botocore.exceptions.ClientError as error: - logger.info(str(error)) - logger.info(f"Creation of baseline processing job: {baseline_job_name} faild.") diff --git a/source/lib/blueprints/byom/lambdas/create_data_baseline_job/tests/fixtures/baseline_fixtures.py b/source/lib/blueprints/byom/lambdas/create_data_baseline_job/tests/fixtures/baseline_fixtures.py deleted file mode 100644 index ed4af2e..0000000 --- a/source/lib/blueprints/byom/lambdas/create_data_baseline_job/tests/fixtures/baseline_fixtures.py +++ /dev/null @@ -1,115 +0,0 @@ -################################################################################################################## -# Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. # -# # -# Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance # -# with the License. A copy of the License is located at # -# # -# http://www.apache.org/licenses/LICENSE-2.0 # -# # -# or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES # -# OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions # -# and limitations under the License. # -# ##################################################################################################################### -import os -import boto3 -import pytest -from shared.helper import get_built_in_model_monitor_container_uri - - -@pytest.fixture(autouse=True) -def mock_env_variables(): - new_env = { - "BASELINE_JOB_NAME": "test-baseline-job", - "ASSETS_BUCKET": "testbucket", - "TRAINING_DATA_LOCATION": "training_data.csv", - "BASELINE_JOB_OUTPUT_LOCATION": "baseline_output", - "INSTANCE_TYPE": "ml.m5.4xlarge", - "INSTANCE_VOLUME_SIZE": "20", - "ROLE_ARN": "arn:aws:iam::account:role/myrole", - "STACK_NAME": "test-stack", - "KMS_KEY_ARN": "mykey", - "MAX_RUNTIME_SECONDS": "3600", - } - os.environ = {**os.environ, **new_env} - - -@pytest.fixture -def sm_describe_processing_job_params(): - return {"ProcessingJobName": os.environ["BASELINE_JOB_NAME"]} - - -local_path = "/opt/ml/processing/input/baseline_dataset_input" -output_path = "/opt/ml/processing/output" - - -@pytest.fixture -def sm_create_baseline_expected_params(): - return { - "ProcessingJobName": os.environ["BASELINE_JOB_NAME"], - "ProcessingInputs": [ - { - "InputName": "baseline_dataset_input", - "S3Input": { - "S3Uri": "s3://" + os.environ["ASSETS_BUCKET"] + "/" + os.environ["TRAINING_DATA_LOCATION"], - "LocalPath": local_path, - "S3DataType": "S3Prefix", - "S3InputMode": "File", - "S3DataDistributionType": "FullyReplicated", - "S3CompressionType": "None", - }, - } - ], - "ProcessingOutputConfig": { - "Outputs": [ - { - "OutputName": "baseline_dataset_output", - "S3Output": { - "S3Uri": "s3://" - + os.environ["BASELINE_JOB_OUTPUT_LOCATION"] - + "/" - + os.environ["BASELINE_JOB_NAME"], - "LocalPath": output_path, - "S3UploadMode": "EndOfJob", - }, - }, - ], - "KmsKeyId": "mykey", - }, - "ProcessingResources": { - "ClusterConfig": { - "InstanceCount": 1, - "InstanceType": os.environ["INSTANCE_TYPE"], - "VolumeSizeInGB": int(os.environ["INSTANCE_VOLUME_SIZE"]), - "VolumeKmsKeyId": "mykey", - } - }, - "StoppingCondition": {"MaxRuntimeInSeconds": int(os.environ["MAX_RUNTIME_SECONDS"])}, - "AppSpecification": { - "ImageUri": get_built_in_model_monitor_container_uri(boto3.session.Session().region_name), - }, - "Environment": { - "dataset_format": '{"csv": {"header": true, "output_columns_position": "START"}}', - "dataset_source": local_path, - "output_path": output_path, - "publish_cloudwatch_metrics": "Disabled", - }, - "RoleArn": os.environ["ROLE_ARN"], - "Tags": [ - {"Key": "stack_name", "Value": os.environ["STACK_NAME"]}, - ], - } - - -@pytest.fixture -def sm_create_job_response_200(): - return { - "ResponseMetadata": {"HTTPStatusCode": 200}, - "ProcessingJobArn": "arn:aws:sagemaker:region:account:processing-job/name", - } - - -@pytest.fixture() -def event(): - return { - "message": "Start data baseline job", - } diff --git a/source/lib/blueprints/byom/lambdas/create_data_baseline_job/tests/test_create_data_baseline.py b/source/lib/blueprints/byom/lambdas/create_data_baseline_job/tests/test_create_data_baseline.py deleted file mode 100644 index 26014ee..0000000 --- a/source/lib/blueprints/byom/lambdas/create_data_baseline_job/tests/test_create_data_baseline.py +++ /dev/null @@ -1,47 +0,0 @@ -################################################################################################################## -# Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. # -# # -# Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance # -# with the License. A copy of the License is located at # -# # -# http://www.apache.org/licenses/LICENSE-2.0 # -# # -# or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES # -# OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions # -# and limitations under the License. # -# ##################################################################################################################### -from unittest.mock import patch -from moto import mock_sts -from botocore.stub import Stubber -from main import handler -from shared.helper import get_client, reset_client, get_built_in_model_monitor_container_uri -from tests.fixtures.baseline_fixtures import ( - mock_env_variables, - sm_create_baseline_expected_params, - sm_create_job_response_200, - event, -) - - -@mock_sts -def test_handler_success( - sm_create_baseline_expected_params, - sm_create_job_response_200, - event, -): - - sm_client = get_client("sagemaker") - sm_stubber = Stubber(sm_client) - - # success path - sm_stubber.add_response("create_processing_job", sm_create_job_response_200, sm_create_baseline_expected_params) - - with sm_stubber: - handler(event, {}) - reset_client() - - -def test_handler_exception(event): - with patch("boto3.client"): - handler(event, context={}) - reset_client() diff --git a/source/lib/blueprints/byom/lambdas/create_update_cf_stackset/main.py b/source/lib/blueprints/byom/lambdas/create_update_cf_stackset/main.py index 7b2ff6c..7ae467c 100644 --- a/source/lib/blueprints/byom/lambdas/create_update_cf_stackset/main.py +++ b/source/lib/blueprints/byom/lambdas/create_update_cf_stackset/main.py @@ -59,7 +59,7 @@ def lambda_handler(event, context): # {"stackset_name": "model2", "artifact":"SourceArtifact", # "template_file":"realtime-inference-pipeline.yaml", # "stage_params_file":"staging-config.json", - # "accound_ids":[""], "org_ids":[""], + # "account_ids":[""], "org_ids":[""], # "regions":["us-east-1"]} params = get_user_params(job_data) @@ -70,15 +70,15 @@ def lambda_handler(event, context): artifact = params["artifact"] template_file = params["template_file"] stage_params_file = params["stage_params_file"] - accound_ids = params["accound_ids"] + account_ids = params["account_ids"] org_ids = params["org_ids"] regions = params["regions"] if "continuationToken" in job_data: - logger.info(f"Ckecking the status of {stackset_name}") + logger.info(f"Checking the status of {stackset_name}") # If we're continuing then the create/update has already been triggered # we just need to check if it has finished. - check_stackset_update_status(job_id, stackset_name, accound_ids[0], regions[0], cf_client, cp_client) + check_stackset_update_status(job_id, stackset_name, account_ids[0], regions[0], cf_client, cp_client) else: logger.info(f"Creating StackSet {stackset_name} and its instances") @@ -95,7 +95,7 @@ def lambda_handler(event, context): stackset_name, template, json.loads(stage_params), - accound_ids, + account_ids, org_ids, regions, cf_client, diff --git a/source/lib/blueprints/byom/lambdas/create_update_cf_stackset/stackset_helpers.py b/source/lib/blueprints/byom/lambdas/create_update_cf_stackset/stackset_helpers.py index 4984ee9..4b7bc90 100644 --- a/source/lib/blueprints/byom/lambdas/create_update_cf_stackset/stackset_helpers.py +++ b/source/lib/blueprints/byom/lambdas/create_update_cf_stackset/stackset_helpers.py @@ -42,7 +42,7 @@ def find_artifact(artifacts, name): if artifact["name"] == name: return artifact - raise Exception(f"Input artifact named {name} not found in lambda's event") + raise ValueError(f"Input artifact named {name} not found in lambda's event") def get_template(s3_client, artifact, template_file_in_zip, params_file_in_zip): @@ -377,14 +377,14 @@ def validate_user_params(decoded_params, list_of_required_params): Args: decoded_params: json object of user parameters passed via codepipline's event - list_of_required_params: list of reqyured parameters + list_of_required_params: list of required parameters Raises: Your UserParameters JSON must include """ for param in list_of_required_params: if param not in decoded_params: - raise Exception(f"Your UserParameters JSON must include {param}") + raise ValueError(f"Your UserParameters JSON must include {param}") def get_user_params(job_data): @@ -405,13 +405,13 @@ def get_user_params(job_data): "artifact", "template_file", "stage_params_file", - "accound_ids", + "account_ids", "org_ids", "regions", ] try: # Get the user parameters which contain the stackset_name, artifact, template_name, - # stage_params, accound_ids, org_ids, and regions + # stage_params, account_ids, org_ids, and regions user_parameters = job_data["actionConfiguration"]["configuration"]["UserParameters"] decoded_parameters = json.loads(user_parameters) @@ -419,7 +419,7 @@ def get_user_params(job_data): # We're expecting the user parameters to be encoded as JSON # so we can pass multiple values. If the JSON can't be decoded # then fail the job with a helpful message. - raise Exception("UserParameters could not be decoded as JSON", e) + raise ValueError("UserParameters could not be decoded as JSON", e) # Validate required params were provided validate_user_params( diff --git a/source/lib/blueprints/byom/lambdas/create_update_cf_stackset/tests/fixtures/stackset_fixtures.py b/source/lib/blueprints/byom/lambdas/create_update_cf_stackset/tests/fixtures/stackset_fixtures.py index febd2a3..374d214 100644 --- a/source/lib/blueprints/byom/lambdas/create_update_cf_stackset/tests/fixtures/stackset_fixtures.py +++ b/source/lib/blueprints/byom/lambdas/create_update_cf_stackset/tests/fixtures/stackset_fixtures.py @@ -61,7 +61,7 @@ def required_user_params(): "artifact", "template_file", "stage_params_file", - "accound_ids", + "account_ids", "org_ids", "regions", ] @@ -74,7 +74,7 @@ def mocked_decoded_parameters(): "artifact": "SourceArtifact", "template_file": "template.yaml", "stage_params_file": "staging-config-test.json", - "accound_ids": ["moceked_account_id"], + "account_ids": ["mocked_account_id"], "org_ids": ["mocked_org_unit_id"], "regions": ["us-east-1"], } @@ -178,4 +178,4 @@ def mocked_stackset(cf_client, stackset_name, mocked_template_parameters): StackSetName=stackset_name, TemplateBody=stackset_name, Parameters=mocked_template_parameters, - ) \ No newline at end of file + ) diff --git a/source/lib/blueprints/byom/lambdas/create_update_cf_stackset/tests/test_create_update_cf_stackset.py b/source/lib/blueprints/byom/lambdas/create_update_cf_stackset/tests/test_create_update_cf_stackset.py index 13add37..5f3aa01 100644 --- a/source/lib/blueprints/byom/lambdas/create_update_cf_stackset/tests/test_create_update_cf_stackset.py +++ b/source/lib/blueprints/byom/lambdas/create_update_cf_stackset/tests/test_create_update_cf_stackset.py @@ -297,7 +297,7 @@ def test_check_stackset_update_status( ) # assert the put_job_success is called mocked_put_job_success.assert_called_once() - # assert it was called with the exoected arguments + # assert it was called with the expected arguments mocked_put_job_success.assert_called_with(mocked_job_id, "StackSet and its instance update complete", None) # Case 2: asserting for the second branch status in ["RUNNING","PENDING"]: @@ -311,7 +311,7 @@ def test_check_stackset_update_status( ) # assert the put_job_continuation is called mocked_put_job_continuation.assert_called_once() - # assert it was called with the exoected arguments + # assert it was called with the expected arguments mocked_put_job_continuation.assert_called_with(mocked_job_id, "StackSet update still in progress", None) # Case 3: asserting for the last branch status not one of ["RUNNING","PENDING", "SUCCEEDED"]: @@ -325,7 +325,7 @@ def test_check_stackset_update_status( ) # assert the put_job_continuation is called mocked_put_job_failure.assert_called_once() - # assert it was called with the exoected arguments + # assert it was called with the expected arguments mocked_put_job_failure.assert_called_with(mocked_job_id, "Update failed: FAILED", None) diff --git a/source/lib/blueprints/byom/lambdas/invoke_lambda_custom_resource/index.py b/source/lib/blueprints/byom/lambdas/invoke_lambda_custom_resource/index.py index f47f467..315f2c7 100644 --- a/source/lib/blueprints/byom/lambdas/invoke_lambda_custom_resource/index.py +++ b/source/lib/blueprints/byom/lambdas/invoke_lambda_custom_resource/index.py @@ -46,7 +46,7 @@ def invoke_lambda(event, _, lm_client=lambda_client): return resource_id else: - raise Exception(f"The Resource {resource} is unsupported by the Invoke Lambda custom resource.") + raise ValueError(f"The Resource {resource} is unsupported by the Invoke Lambda custom resource.") except Exception as e: logger.error(f"Custom resource failed: {str(e)}") diff --git a/source/lib/blueprints/byom/model_monitor.py b/source/lib/blueprints/byom/model_monitor.py index 937bb10..159c3e2 100644 --- a/source/lib/blueprints/byom/model_monitor.py +++ b/source/lib/blueprints/byom/model_monitor.py @@ -1,5 +1,5 @@ # ##################################################################################################################### -# Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # # # # Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance # # with the License. A copy of the License is located at # @@ -15,110 +15,117 @@ core, ) from lib.blueprints.byom.pipeline_definitions.deploy_actions import ( - create_data_baseline_job, + create_baseline_job_lambda, + sagemaker_layer, create_invoke_lambda_custom_resource, ) from lib.blueprints.byom.pipeline_definitions.templates_parameters import ( - create_blueprint_bucket_name_parameter, - create_assets_bucket_name_parameter, - create_baseline_job_name_parameter, - create_monitoring_schedule_name_parameter, - create_endpoint_name_parameter, - create_baseline_job_output_location_parameter, - create_monitoring_output_location_parameter, - create_instance_type_parameter, - create_training_data_parameter, - create_monitoring_type_parameter, - create_instance_volume_size_parameter, - create_max_runtime_seconds_parameter, - create_kms_key_arn_parameter, - create_kms_key_arn_provided_condition, - create_data_capture_bucket_name_parameter, - create_data_capture_location_parameter, - create_schedule_expression_parameter, - create_algorithm_image_uri_parameter, - create_baseline_output_bucket_name_parameter, + ParameteresFactory as pf, + ConditionsFactory as cf, ) from lib.blueprints.byom.pipeline_definitions.sagemaker_monitor_role import create_sagemaker_monitor_role -from lib.blueprints.byom.pipeline_definitions.sagemaker_monitoring_schedule import create_sagemaker_monitoring_scheduale +from lib.blueprints.byom.pipeline_definitions.sagemaker_model_monitor_construct import SageMakerModelMonitor class ModelMonitorStack(core.Stack): - def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: + def __init__(self, scope: core.Construct, id: str, monitoring_type: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) + # validate the provided monitoring_type + if monitoring_type not in ["DataQuality", "ModelQuality"]: + raise ValueError( + ( + f"The {monitoring_type} is not valid. Currently supported Monitoring Types are: " + f"['DataQuality'|'ModelQuality']" + ) + ) + + # Baseline/Monitor attributes, this will be updated based on the monitoring_type + self.baseline_attributes = dict() + self.monitor_attributes = dict() + # Parameteres # - blueprint_bucket_name = create_blueprint_bucket_name_parameter(self) - assets_bucket_name = create_assets_bucket_name_parameter(self) - endpoint_name = create_endpoint_name_parameter(self) - baseline_job_output_location = create_baseline_job_output_location_parameter(self) - training_data = create_training_data_parameter(self) - instance_type = create_instance_type_parameter(self) - instance_volume_size = create_instance_volume_size_parameter(self) - monitoring_type = create_monitoring_type_parameter(self) - max_runtime_seconds = create_max_runtime_seconds_parameter(self) - kms_key_arn = create_kms_key_arn_parameter(self) - baseline_job_name = create_baseline_job_name_parameter(self) - monitoring_schedule_name = create_monitoring_schedule_name_parameter(self) - data_capture_bucket = create_data_capture_bucket_name_parameter(self) - baseline_output_bucket = create_baseline_output_bucket_name_parameter(self) - data_capture_s3_location = create_data_capture_location_parameter(self) - monitoring_output_location = create_monitoring_output_location_parameter(self) - schedule_expression = create_schedule_expression_parameter(self) - image_uri = create_algorithm_image_uri_parameter(self) + blueprint_bucket_name = pf.create_blueprint_bucket_name_parameter(self) + assets_bucket_name = pf.create_assets_bucket_name_parameter(self) + endpoint_name = pf.create_endpoint_name_parameter(self) + baseline_job_output_location = pf.create_baseline_job_output_location_parameter(self) + baseline_data = pf.create_baseline_data_parameter(self) + instance_type = pf.create_instance_type_parameter(self) + instance_count = pf.create_instance_count_parameter(self) + instance_volume_size = pf.create_instance_volume_size_parameter(self) + baseline_max_runtime_seconds = pf.create_baseline_max_runtime_seconds_parameter(self) + monitor_max_runtime_seconds = pf.create_monitor_max_runtime_seconds_parameter(self, "ModelQuality") + kms_key_arn = pf.create_kms_key_arn_parameter(self) + baseline_job_name = pf.create_baseline_job_name_parameter(self) + monitoring_schedule_name = pf.create_monitoring_schedule_name_parameter(self) + data_capture_bucket = pf.create_data_capture_bucket_name_parameter(self) + baseline_output_bucket = pf.create_baseline_output_bucket_name_parameter(self) + data_capture_s3_location = pf.create_data_capture_location_parameter(self) + monitoring_output_location = pf.create_monitoring_output_location_parameter(self) + schedule_expression = pf.create_schedule_expression_parameter(self) + image_uri = pf.create_algorithm_image_uri_parameter(self) + + # add ModelQuality specific parameters/conditions, and update self.baseline_attributes/self.monitor_attributes + if monitoring_type == "ModelQuality": + self._add_model_quality_resources() # conditions - kms_key_arn_provided = create_kms_key_arn_provided_condition(self, kms_key_arn) + kms_key_arn_provided = cf.create_kms_key_arn_provided_condition(self, kms_key_arn) # Resources # - assets_bucket = s3.Bucket.from_bucket_name(self, "AssetsBucket", assets_bucket_name.value_as_string) + assets_bucket = s3.Bucket.from_bucket_name(self, "ImportedAssetsBucket", assets_bucket_name.value_as_string) # getting blueprint bucket object from its name - will be used later in the stack - blueprint_bucket = s3.Bucket.from_bucket_name(self, "BlueprintBucket", blueprint_bucket_name.value_as_string) + blueprint_bucket = s3.Bucket.from_bucket_name( + self, "ImportedBlueprintBucket", blueprint_bucket_name.value_as_string + ) + + # create sagemaker layer + sm_layer = sagemaker_layer(self, blueprint_bucket) - # creating data baseline job - baseline_job_lambda = create_data_baseline_job( + # update Baseline attributes + self.baseline_attributes.update( + dict( + monitoring_type=monitoring_type, + baseline_job_name=baseline_job_name.value_as_string, + baseline_data_location=baseline_data.value_as_string, + baseline_job_output_location=baseline_job_output_location.value_as_string, + endpoint_name=endpoint_name.value_as_string, + instance_type=instance_type.value_as_string, + instance_volume_size=instance_volume_size.value_as_string, + max_runtime_seconds=baseline_max_runtime_seconds.value_as_string, + kms_key_arn=core.Fn.condition_if( + kms_key_arn_provided.logical_id, kms_key_arn.value_as_string, core.Aws.NO_VALUE + ).to_string(), + kms_key_arn_provided_condition=kms_key_arn_provided, + stack_name=core.Aws.STACK_NAME, + ) + ) + # create baseline job lambda action + baseline_job_lambda = create_baseline_job_lambda( self, - blueprint_bucket, - assets_bucket, - baseline_job_name.value_as_string, - training_data.value_as_string, - baseline_job_output_location.value_as_string, - endpoint_name.value_as_string, - instance_type.value_as_string, - instance_volume_size.value_as_string, - max_runtime_seconds.value_as_string, - core.Fn.condition_if( - kms_key_arn_provided.logical_id, kms_key_arn.value_as_string, core.Aws.NO_VALUE - ).to_string(), - kms_key_arn_provided, - core.Aws.STACK_NAME, - ) - - # create custom resource to invoke the batch transform lambda + blueprint_bucket=blueprint_bucket, + assets_bucket=assets_bucket, + sm_layer=sm_layer, + **self.baseline_attributes, + ) + + # create custom resource to invoke the baseline job lambda + # remove the condition from the custom resource properties. Otherwise, CFN will give an error + del self.baseline_attributes["kms_key_arn_provided_condition"] invoke_lambda_custom_resource = create_invoke_lambda_custom_resource( - self, - "InvokeBaselineLambda", - baseline_job_lambda.function_arn, - baseline_job_lambda.function_name, - blueprint_bucket, - { + scope=self, + id="InvokeBaselineLambda", + lambda_function_arn=baseline_job_lambda.function_arn, + lambda_function_name=baseline_job_lambda.function_name, + blueprint_bucket=blueprint_bucket, + # add baseline attributes to the invoke lambda custom resource, so any change to these attributes + # (via template update) will re-invoke the baseline lambda and re-calculate the baseline + custom_resource_properties={ "Resource": "InvokeLambda", "function_name": baseline_job_lambda.function_name, "assets_bucket_name": assets_bucket_name.value_as_string, - "endpoint_name": endpoint_name.value_as_string, - "instance_type": instance_type.value_as_string, - "baseline_job_output_location": baseline_job_output_location.value_as_string, - "training_data": training_data.value_as_string, - "instance_volume_size": instance_volume_size.value_as_string, - "monitoring_schedule_name": monitoring_schedule_name.value_as_string, - "baseline_job_name": baseline_job_name.value_as_string, - "max_runtime_seconds": max_runtime_seconds.value_as_string, - "data_capture_s3_location": data_capture_s3_location.value_as_string, - "monitoring_output_location": monitoring_output_location.value_as_string, - "schedule_expression": schedule_expression.value_as_string, - "image_uri": image_uri.value_as_string, - "kms_key_arn": kms_key_arn.value_as_string, + **self.baseline_attributes, }, ) @@ -127,8 +134,8 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: # creating monitoring schedule sagemaker_role = create_sagemaker_monitor_role( - self, - "MLOpsSagemakerMonitorRole", + scope=self, + id="MLOpsSagemakerMonitorRole", kms_key_arn=kms_key_arn.value_as_string, assets_bucket_name=assets_bucket_name.value_as_string, data_capture_bucket=data_capture_bucket.value_as_string, @@ -138,37 +145,49 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: output_s3_location=monitoring_output_location.value_as_string, kms_key_arn_provided_condition=kms_key_arn_provided, baseline_job_name=baseline_job_name.value_as_string, - monitoring_schedual_name=monitoring_schedule_name.value_as_string, + monitoring_schedule_name=monitoring_schedule_name.value_as_string, + endpoint_name=endpoint_name.value_as_string, + model_monitor_ground_truth_input=None + if monitoring_type == "DataQuality" + else self.monitor_attributes["ground_truth_s3_uri"], ) + # resource tags + resource_tags = [{"key": "stack-name", "value": core.Aws.STACK_NAME}] + + # update attributes + self.monitor_attributes.update( + dict( + monitoring_schedule_name=monitoring_schedule_name.value_as_string, + endpoint_name=endpoint_name.value_as_string, + baseline_job_name=baseline_job_name.value_as_string, + baseline_job_output_location=baseline_job_output_location.value_as_string, + schedule_expression=schedule_expression.value_as_string, + monitoring_output_location=monitoring_output_location.value_as_string, + instance_type=instance_type.value_as_string, + instance_count=instance_count.value_as_string, + instance_volume_size=instance_volume_size.value_as_string, + max_runtime_seconds=monitor_max_runtime_seconds.value_as_string, + kms_key_arn=core.Fn.condition_if( + kms_key_arn_provided.logical_id, kms_key_arn.value_as_string, core.Aws.NO_VALUE + ).to_string(), + role_arn=sagemaker_role.role_arn, + image_uri=image_uri.value_as_string, + monitoring_type=monitoring_type, + tags=resource_tags, + ) + ) # create Sagemaker monitoring Schedule - sagemaker_monitoring_scheduale = create_sagemaker_monitoring_scheduale( - self, - "MonitoringSchedule", - monitoring_schedule_name.value_as_string, - endpoint_name.value_as_string, - baseline_job_name.value_as_string, - baseline_job_output_location.value_as_string, - schedule_expression.value_as_string, - monitoring_output_location.value_as_string, - instance_type.value_as_string, - instance_volume_size.value_as_number, - max_runtime_seconds.value_as_number, - core.Fn.condition_if( - kms_key_arn_provided.logical_id, kms_key_arn.value_as_string, core.Aws.NO_VALUE - ).to_string(), - sagemaker_role.role_arn, - image_uri.value_as_string, - core.Aws.STACK_NAME, - ) - - # add dependency on invoke_lambda_custom_resource - sagemaker_monitoring_scheduale.node.add_dependency(invoke_lambda_custom_resource) + sagemaker_monitor = SageMakerModelMonitor(self, f"{monitoring_type}Monitor", **self.monitor_attributes) + + # add job definition dependency on sagemaker role and invoke_lambda_custom_resource (so, the baseline job is created) + sagemaker_monitor.job_definition.node.add_dependency(sagemaker_role) + sagemaker_monitor.job_definition.node.add_dependency(invoke_lambda_custom_resource) # Outputs # core.CfnOutput( self, - id="DataBaselineJobName", + id="BaselineName", value=baseline_job_name.value_as_string, ) core.CfnOutput( @@ -179,19 +198,16 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: core.CfnOutput( self, id="MonitoringScheduleType", - value=monitoring_type.value_as_string, + value=monitoring_type, ) core.CfnOutput( self, - id="BaselineJobOutputLocation", - value=( - f"https://s3.console.aws.amazon.com/s3/buckets/{baseline_job_output_location.value_as_string}" - f"/{baseline_job_name.value_as_string}/" - ), + id="BaselineJobOutput", + value=f"https://s3.console.aws.amazon.com/s3/buckets/{baseline_job_output_location.value_as_string}/", ) core.CfnOutput( self, - id="MonitoringScheduleOutputLocation", + id="MonitoringScheduleOutput", value=( f"https://s3.console.aws.amazon.com/s3/buckets/{monitoring_output_location.value_as_string}/" f"{endpoint_name.value_as_string}/{monitoring_schedule_name.value_as_string}/" @@ -204,9 +220,70 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: ) core.CfnOutput( self, - id="DataCaptureLocation", + id="DataCaptureS3Location", value=( f"https://s3.console.aws.amazon.com/s3/buckets/{data_capture_s3_location.value_as_string}" f"/{endpoint_name.value_as_string}/" ), ) + + def _add_model_quality_resources(self): + """ + Adds ModelQuality specific parameters/conditions and updates self.baseline_attributes/self.monitor_attributes + """ + # add baseline job attributes (they are different from Monitor attributes) + baseline_inference_attribute = pf.create_inference_attribute_parameter(self, "Baseline") + baseline_probability_attribute = pf.create_probability_attribute_parameter(self, "Baseline") + ground_truth_attribute = pf.create_ground_truth_attribute_parameter(self) + # add monitor attributes + monitor_inference_attribute = pf.create_inference_attribute_parameter(self, "Monitor") + monitor_probability_attribute = pf.create_probability_attribute_parameter(self, "Monitor") + ground_truth_s3_uri = pf.create_ground_truth_s3_uri_parameter(self) + # problem_type and probability_threshold_attribute are the same for both + problem_type = pf.create_problem_type_parameter(self) + probability_threshold_attribute = pf.create_probability_threshold_attribute_parameter(self) + + # add conditions (used by monitor) + is_regression_or_multiclass_classification_problem = ( + cf.create_problem_type_regression_or_multiclass_classification_condition(self, problem_type) + ) + is_binary_classification_problem = cf.create_problem_type_binary_classification_condition(self, problem_type) + + # add ModelQuality Baseline attributes + self.baseline_attributes.update( + dict( + problem_type=problem_type.value_as_string, + ground_truth_attribute=ground_truth_attribute.value_as_string, + inference_attribute=baseline_inference_attribute.value_as_string, + probability_attribute=baseline_probability_attribute.value_as_string, + probability_threshold_attribute=probability_threshold_attribute.value_as_string, + ) + ) + + # add ModelQuality Monitor attributes + self.monitor_attributes.update( + dict( + problem_type=problem_type.value_as_string, + ground_truth_s3_uri=ground_truth_s3_uri.value_as_string, + # inference_attribute is required for Regression/Multiclass Classification problems + # probability_attribute/probability_threshold_attribute are not used + inference_attribute=core.Fn.condition_if( + is_regression_or_multiclass_classification_problem.logical_id, + monitor_inference_attribute.value_as_string, + core.Aws.NO_VALUE, + ).to_string(), + # for a Binary Classification problem, we use probability_attribute and probability_threshold_attribute. + # note: probability_attribute is the index of the predicted probability in the captured data by the + # SageMaker endpoint. Tepically, probability_attribute="0" and probability_threshold_attribute="0.5" + probability_attribute=core.Fn.condition_if( + is_binary_classification_problem.logical_id, + monitor_probability_attribute.value_as_string, + core.Aws.NO_VALUE, + ).to_string(), + probability_threshold_attribute=core.Fn.condition_if( + is_binary_classification_problem.logical_id, + probability_threshold_attribute.value_as_string, + core.Aws.NO_VALUE, + ).to_string(), + ) + ) diff --git a/source/lib/blueprints/byom/multi_account_codepipeline.py b/source/lib/blueprints/byom/multi_account_codepipeline.py index b93689e..2037529 100644 --- a/source/lib/blueprints/byom/multi_account_codepipeline.py +++ b/source/lib/blueprints/byom/multi_account_codepipeline.py @@ -32,17 +32,8 @@ suppress_sns, ) from lib.blueprints.byom.pipeline_definitions.templates_parameters import ( - create_notification_email_parameter, - create_template_zip_name_parameter, - create_template_file_name_parameter, - create_stage_params_file_name_parameter, - create_blueprint_bucket_name_parameter, - create_assets_bucket_name_parameter, - create_stack_name_parameter, - create_account_id_parameter, - create_org_id_parameter, - create_delegated_admin_parameter, - create_delegated_admin_condition, + ParameteresFactory as pf, + ConditionsFactory as cf, ) @@ -51,38 +42,40 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) # Parameteres # - notification_email = create_notification_email_parameter(self) - template_zip_name = create_template_zip_name_parameter(self) - template_file_name = create_template_file_name_parameter(self) - dev_params_file_name = create_stage_params_file_name_parameter(self, "DEV_PARAMS_NAME", "development") - staging_params_file_name = create_stage_params_file_name_parameter(self, "STAGING_PARAMS_NAME", "staging") - prod_params_file_name = create_stage_params_file_name_parameter(self, "PROD_PARAMS_NAME", "production") + notification_email = pf.create_notification_email_parameter(self) + template_zip_name = pf.create_template_zip_name_parameter(self) + template_file_name = pf.create_template_file_name_parameter(self) + dev_params_file_name = pf.create_stage_params_file_name_parameter(self, "DevParamsName", "development") + staging_params_file_name = pf.create_stage_params_file_name_parameter(self, "StagingParamsName", "staging") + prod_params_file_name = pf.create_stage_params_file_name_parameter(self, "ProdParamsName", "production") # create development parameters account_type = "development" - dev_account_id = create_account_id_parameter(self, "DEV_ACCOUNT_ID", account_type) - dev_org_id = create_org_id_parameter(self, "DEV_ORG_ID", account_type) + dev_account_id = pf.create_account_id_parameter(self, "DevAccountId", account_type) + dev_org_id = pf.create_org_id_parameter(self, "DevOrgId", account_type) # create staging parameters account_type = "staging" - staging_account_id = create_account_id_parameter(self, "STAGING_ACCOUNT_ID", account_type) - staging_org_id = create_org_id_parameter(self, "STAGING_ORG_ID", account_type) + staging_account_id = pf.create_account_id_parameter(self, "StagingAccountId", account_type) + staging_org_id = pf.create_org_id_parameter(self, "StagingOrgId", account_type) # create production parameters account_type = "production" - prod_account_id = create_account_id_parameter(self, "PROD_ACCOUNT_ID", account_type) - prod_org_id = create_org_id_parameter(self, "PROD_ORG_ID", account_type) + prod_account_id = pf.create_account_id_parameter(self, "ProdAccountId", account_type) + prod_org_id = pf.create_org_id_parameter(self, "ProdOrgId", account_type) # assets parameters - blueprint_bucket_name = create_blueprint_bucket_name_parameter(self) - assets_bucket_name = create_assets_bucket_name_parameter(self) - stack_name = create_stack_name_parameter(self) + blueprint_bucket_name = pf.create_blueprint_bucket_name_parameter(self) + assets_bucket_name = pf.create_assets_bucket_name_parameter(self) + stack_name = pf.create_stack_name_parameter(self) # delegated admin account - is_delegated_admin = create_delegated_admin_parameter(self) + is_delegated_admin = pf.create_delegated_admin_parameter(self) # create use delegated admin account condition - delegated_admin_account_condition = create_delegated_admin_condition(self, is_delegated_admin) + delegated_admin_account_condition = cf.create_delegated_admin_condition(self, is_delegated_admin) # Resources # - assets_bucket = s3.Bucket.from_bucket_name(self, "AssetsBucket", assets_bucket_name.value_as_string) + assets_bucket = s3.Bucket.from_bucket_name(self, "ImportedAssetsBucket", assets_bucket_name.value_as_string) # getting blueprint bucket object from its name - will be used later in the stack - blueprint_bucket = s3.Bucket.from_bucket_name(self, "BlueprintBucket", blueprint_bucket_name.value_as_string) + blueprint_bucket = s3.Bucket.from_bucket_name( + self, "ImportedBlueprintBucket", blueprint_bucket_name.value_as_string + ) # create sns topic and subscription pipeline_notification_topic = sns.Topic( diff --git a/source/lib/blueprints/byom/pipeline_definitions/configure_multi_account.py b/source/lib/blueprints/byom/pipeline_definitions/configure_multi_account.py index b8bed0b..c210679 100644 --- a/source/lib/blueprints/byom/pipeline_definitions/configure_multi_account.py +++ b/source/lib/blueprints/byom/pipeline_definitions/configure_multi_account.py @@ -18,11 +18,7 @@ create_ecr_repo_policy, model_package_group_policy, ) -from lib.blueprints.byom.pipeline_definitions.templates_parameters import ( - create_account_id_parameter, - create_org_id_parameter, - create_delegated_admin_parameter, -) +from lib.blueprints.byom.pipeline_definitions.templates_parameters import ParameteresFactory as pf def configure_multi_account_parameters_permissions( @@ -34,7 +30,6 @@ def configure_multi_account_parameters_permissions( orchestrator_lambda_function, paramaters_list, paramaters_labels, - send_data_cr_properties, ): """ configure_multi_account_parameters_permissions creates parameters and permissions for the multi-account option @@ -47,25 +42,24 @@ def configure_multi_account_parameters_permissions( :orchestrator_lambda_function: orchestrator lambda function CDK object :paramaters_list: list parameters' logical ids :paramaters_labels: dictionary of paramaters labels - :send_data_cr_properties: custom resource properties (dictionary) :return: (paramaters_list, paramaters_labels, send_data_cr_properties) """ # add parameters # delegated admin account - is_delegated_admin = create_delegated_admin_parameter(scope) + is_delegated_admin = pf.create_delegated_admin_parameter(scope) # create development parameters account_type = "development" - dev_account_id = create_account_id_parameter(scope, "DEV_ACCOUNT_ID", account_type) - dev_org_id = create_org_id_parameter(scope, "DEV_ORG_ID", account_type) + dev_account_id = pf.create_account_id_parameter(scope, "DevAccountId", account_type) + dev_org_id = pf.create_org_id_parameter(scope, "DevOrgId", account_type) # create staging parameters account_type = "staging" - staging_account_id = create_account_id_parameter(scope, "STAGING_ACCOUNT_ID", account_type) - staging_org_id = create_org_id_parameter(scope, "STAGING_ORG_ID", account_type) + staging_account_id = pf.create_account_id_parameter(scope, "StagingAccountId", account_type) + staging_org_id = pf.create_org_id_parameter(scope, "StagingOrgId", account_type) # create production parameters account_type = "production" - prod_account_id = create_account_id_parameter(scope, "PROD_ACCOUNT_ID", account_type) - prod_org_id = create_org_id_parameter(scope, "PROD_ORG_ID", account_type) + prod_account_id = pf.create_account_id_parameter(scope, "ProdAccountId", account_type) + prod_org_id = pf.create_org_id_parameter(scope, "ProdOrgId", account_type) principals = [ iam.AccountPrincipal(dev_account_id.value_as_string), @@ -73,7 +67,7 @@ def configure_multi_account_parameters_permissions( iam.AccountPrincipal(prod_account_id.value_as_string), ] - # add permission to access the assets bicket + # add permission to access the assets bucket assets_bucket.add_to_resource_policy( s3_policy_read( [assets_bucket.bucket_arn, f"{assets_bucket.bucket_arn}/*"], @@ -89,7 +83,7 @@ def configure_multi_account_parameters_permissions( ) ) - # add permissios to other account to pull images + # add permissions to other account to pull images ecr_repo.add_to_resource_policy(create_ecr_repo_policy(principals)) # give other accounts permissions to use the model registry @@ -137,8 +131,5 @@ def configure_multi_account_parameters_permissions( } ) - # add is_delegated_admin_account to the collected data - send_data_cr_properties.update({"IsDelegatedAccount": is_delegated_admin.value_as_string}) - - # return parameters, labels, and send_data_cr_properties - return (paramaters_list, paramaters_labels, send_data_cr_properties) + # return parameters, labels, and is_delegated_admin + return (paramaters_list, paramaters_labels, is_delegated_admin.value_as_string) diff --git a/source/lib/blueprints/byom/pipeline_definitions/deploy_actions.py b/source/lib/blueprints/byom/pipeline_definitions/deploy_actions.py index 03afdf2..ec5dbdd 100644 --- a/source/lib/blueprints/byom/pipeline_definitions/deploy_actions.py +++ b/source/lib/blueprints/byom/pipeline_definitions/deploy_actions.py @@ -86,7 +86,7 @@ def batch_transform( :batch_inference_data: location of the batch inference data in assets bucket, in the form of a CDK CfnParameter object :batch_job_output_location: S3 bucket location where the result of the batch job will be stored - :kms_key_arn: optionl kmsKeyArn used to encrypt job's output and instance volume. + :kms_key_arn: optional kmsKeyArn used to encrypt job's output and instance volume. :sm_layer: sagemaker lambda layer :return: Lambda function """ @@ -149,12 +149,13 @@ def batch_transform( return batch_transform_lambda -def create_data_baseline_job( +def create_baseline_job_lambda( scope, # NOSONAR:S107 this function is designed to take many arguments blueprint_bucket, assets_bucket, + monitoring_type, baseline_job_name, - training_data_location, + baseline_data_location, baseline_job_output_location, endpoint_name, instance_type, @@ -163,28 +164,48 @@ def create_data_baseline_job( kms_key_arn, kms_key_arn_provided_condition, stack_name, + sm_layer, + problem_type=None, + ground_truth_attribute=None, + inference_attribute=None, + probability_attribute=None, + probability_threshold_attribute=None, ): """ - create_baseline_job creates a data baseline processing job in a lambda invoked codepipeline action + create_baseline_job_lambda creates a data/model baseline processing job in a lambda invoked codepipeline action :scope: CDK Construct scope that's needed to create CDK resources :blueprint_bucket: CDK object of the blueprint bucket that contains resources for BYOM pipeline :assets_bucket: the bucket cdk object where pipeline assets are stored + :monitoring_type: SageMaker's monitoring type. Currently supported types (DataQualit/ModelQuality) :baseline_job_name: name of the baseline job to be created - :training_data_location: location of the training data used to train the deployed model + :baseline_data_location: location of the baseline data to create the SageMaker Model Monitor baseline :baseline_job_output_location: S3 prefix in the S3 assets bucket to store the output of the job :endpoint_name: name of the deployed SageMaker endpoint to be monitored :instance_type: compute instance type for the baseline job, in the form of a CDK CfnParameter object :instance_volume_size: volume size of the EC2 instance - :max_runtime_seconds: max time the job is allowd to run + :max_runtime_seconds: max time the job is allowed to run :kms_key_arn: kms key arn to encrypt the baseline job's output :stack_name: model monitor stack name + :sm_layer: sagemaker lambda layer + :problem_type: used with ModelQuality baseline. Type of Machine Learning problem. Valid values are + ['Regression'|'BinaryClassification'|'MulticlassClassification'] (default: None) + :ground_truth_attribute: index or JSONpath to locate actual label(s) (used with ModelQuality baseline). + (default: None). + :inference_attribute: index or JSONpath to locate predicted label(s) (used with ModelQuality baseline). + Required for 'Regression'|'MulticlassClassification' problems, + and not required for 'BinaryClassification' if 'probability_attribute' and + 'probability_threshold_attribute' are provided (default: None). + :probability_attribute: index or JSONpath to locate probabilities(used with ModelQuality baseline). + Used only with 'BinaryClassification' problem if 'inference_attribute' is not provided (default: None). + :probability_threshold_attribute: threshold to convert probabilities to binaries (used with ModelQuality baseline). + Used only with 'BinaryClassification' problem if 'inference_attribute' is not provided (default: None). :return: codepipeline action in a form of a CDK object that can be attached to a codepipeline stage """ s3_read = s3_policy_read( [ f"arn:aws:s3:::{assets_bucket.bucket_name}", - f"arn:aws:s3:::{assets_bucket.bucket_name}/{training_data_location}", + f"arn:aws:s3:::{assets_bucket.bucket_name}/{baseline_data_location}", ] ) s3_write = s3_policy_write( @@ -194,7 +215,7 @@ def create_data_baseline_job( ) create_baseline_job_policy = sagemaker_baseline_job_policy(baseline_job_name) - sagemaker_logs_policy = sagemaker_logs_metrics_policy_document(scope, "BaselineLogsMetrcis") + sagemaker_logs_policy = sagemaker_logs_metrics_policy_document(scope, "BaselineLogsMetrics") # Kms Key permissions kms_policy = kms_policy_document(scope, "BaselineKmsPolicy", kms_key_arn) @@ -234,27 +255,43 @@ def create_data_baseline_job( add_logs_policy(lambda_role) # defining the lambda function that gets invoked in this stage + # create environment variabes + lambda_environment_variables = { + "MONITORING_TYPE": monitoring_type, + "BASELINE_JOB_NAME": baseline_job_name, + "ASSETS_BUCKET": assets_bucket.bucket_name, + "SAGEMAKER_ENDPOINT_NAME": endpoint_name, + "BASELINE_DATA_LOCATION": baseline_data_location, + "BASELINE_JOB_OUTPUT_LOCATION": baseline_job_output_location, + "INSTANCE_TYPE": instance_type, + "INSTANCE_VOLUME_SIZE": instance_volume_size, + "MAX_RUNTIME_SECONDS": max_runtime_seconds, + "ROLE_ARN": sagemaker_role.role_arn, + "KMS_KEY_ARN": kms_key_arn, + "STACK_NAME": stack_name, + "LOG_LEVEL": "INFO", + } + + # add ModelQuality related variables (they will be passed by the Model Monitor stack) + if monitoring_type == "ModelQuality": + lambda_environment_variables.update( + { + "PROBLEM_TYPE": problem_type, + "GROUND_TRUTH_ATTRIBUTE": ground_truth_attribute, + "INFERENCE_ATTRIBUTE": inference_attribute, + "PROBABILITY_ATTRIBUTE": probability_attribute, + "PROBABILITY_THRESHOLD_ATTRIBUTE": probability_threshold_attribute, + } + ) create_baseline_job_lambda = lambda_.Function( scope, "create_data_baseline_job", runtime=lambda_.Runtime.PYTHON_3_8, handler=lambda_handler, role=lambda_role, - code=lambda_.Code.from_bucket(blueprint_bucket, "blueprints/byom/lambdas/create_data_baseline_job.zip"), - environment={ - "BASELINE_JOB_NAME": baseline_job_name, - "ASSETS_BUCKET": assets_bucket.bucket_name, - "SAGEMAKER_ENDPOINT_NAME": endpoint_name, - "TRAINING_DATA_LOCATION": training_data_location, - "BASELINE_JOB_OUTPUT_LOCATION": baseline_job_output_location, - "INSTANCE_TYPE": instance_type, - "INSTANCE_VOLUME_SIZE": instance_volume_size, - "MAX_RUNTIME_SECONDS": max_runtime_seconds, - "ROLE_ARN": sagemaker_role.role_arn, - "KMS_KEY_ARN": kms_key_arn, - "STACK_NAME": stack_name, - "LOG_LEVEL": "INFO", - }, + code=lambda_.Code.from_bucket(blueprint_bucket, "blueprints/byom/lambdas/create_baseline_job.zip"), + layers=[sm_layer], + environment=lambda_environment_variables, timeout=core.Duration.minutes(10), ) @@ -273,7 +310,7 @@ def create_stackset_action( artifact, template_file, stage_params_file, - accound_ids, + account_ids, org_ids, regions, assets_bucket, @@ -287,11 +324,11 @@ def create_stackset_action( :action_name: name of the StackSet action :blueprint_bucket: CDK object of the blueprint bucket that contains resources for BYOM pipeline :source_output: CDK object of the Source action's output - :artifact: name of the input aritifcat to the StackSet action + :artifact: name of the input artifact to the StackSet action :template_file: name of the Cloudformation template to be deployed - :stage_params_file: name of the template parameters for the satge - :accound_ids: list of AWS acounts where the stack with be deployed - :org_ids: list of AWS orginizational ids where the stack with be deployed + :stage_params_file: name of the template parameters for the stage + :account_ids: list of AWS accounts where the stack with be deployed + :org_ids: list of AWS organizational ids where the stack with be deployed :regions: list of regions where the stack with be deployed :assets_bucket: the bucket cdk object where pipeline assets are stored :stack_name: name of the stack to be deployed @@ -357,7 +394,7 @@ def create_stackset_action( "artifact": artifact, "template_file": template_file, "stage_params_file": stage_params_file, - "accound_ids": accound_ids, + "account_ids": account_ids, "org_ids": org_ids, "regions": regions, }, @@ -370,7 +407,7 @@ def create_cloudformation_action( scope, action_name, stack_name, source_output, template_file, template_parameters_file, run_order=1 ): """ - create_cloudformation_actio a CloudFormation action to be added to AWS Codepipeline stage + create_cloudformation_action a CloudFormation action to be added to AWS Codepipeline stage :scope: CDK Construct scope that's needed to create CDK resources :action_name: name of the StackSet action @@ -387,7 +424,7 @@ def create_cloudformation_action( stack_name=stack_name, capabilities=[cloudformation.CloudFormationCapabilities.NAMED_IAM], template_path=source_output.at_path(template_file), - # Admin permissions are added to the deployement role used by the CF action for simplicity + # Admin permissions are added to the deployment role used by the CF action for simplicity # and deploy different resources by different MLOps pipelines. Roles are defined by the # pipelines' cloudformation templates. admin_permissions=True, @@ -441,7 +478,7 @@ def create_invoke_lambda_custom_resource( invoke_lambda_custom_resource = core.CustomResource( scope, - f"{id}CustomeResource", + f"{id}CustomResource", service_token=custom_resource_lambda_fn.function_arn, properties={ "function_name": lambda_function_name, @@ -533,7 +570,7 @@ def create_uuid_custom_resource(scope, create_model_registry, helper_function_ar service_token=helper_function_arn, # add the template's paramater "create_model_registry" to the custom resource properties # so that a new UUID is generated when this value is updated - # the generated UUID is appeneded to the name of the model registry to be created + # the generated UUID is appended to the name of the model registry to be created properties={"Resource": "UUID", "CreateModelRegistry": create_model_registry}, resource_type="Custom::CreateUUID", ) diff --git a/source/lib/blueprints/byom/pipeline_definitions/iam_policies.py b/source/lib/blueprints/byom/pipeline_definitions/iam_policies.py index 0fd2864..b281a3a 100644 --- a/source/lib/blueprints/byom/pipeline_definitions/iam_policies.py +++ b/source/lib/blueprints/byom/pipeline_definitions/iam_policies.py @@ -1,5 +1,5 @@ # ##################################################################################################################### -# Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # # # # Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance # # with the License. A copy of the License is located at # @@ -17,34 +17,41 @@ suppress_delegated_admin_policy, ) - -def sagemaker_policiy_statement(): +sagemaker_arn_prefix = f"arn:{core.Aws.PARTITION}:sagemaker:{core.Aws.REGION}:{core.Aws.ACCOUNT_ID}" + + +def sagemaker_policy_statement(is_realtime_pipeline, endpoint_name, endpoint_name_provided): + actions = ["sagemaker:CreateModel", "sagemaker:DescribeModel", "sagemaker:DeleteModel"] + resources = [f"{sagemaker_arn_prefix}:model/mlopssagemakermodel*"] + + if is_realtime_pipeline: + # extend actions + actions.extend( + [ + "sagemaker:CreateEndpointConfig", + "sagemaker:DescribeEndpointConfig", + "sagemaker:DeleteEndpointConfig", + "sagemaker:CreateEndpoint", + "sagemaker:DescribeEndpoint", + "sagemaker:DeleteEndpoint", + ] + ) + + # if a custom endpoint_name is provided, use it. Otherwise, use the generated name + endpoint = core.Fn.condition_if( + endpoint_name_provided.logical_id, endpoint_name.value_as_string, "mlopssagemakerendpoint*" + ).to_string() + + # extend resources and add + resources.extend( + [ + f"{sagemaker_arn_prefix}:endpoint-config/mlopssagemakerendpointconfig*", + f"{sagemaker_arn_prefix}:endpoint/{endpoint}", + ] + ) return iam.PolicyStatement( - actions=[ - "sagemaker:CreateModel", # NOSONAR: permission needs to be repeated for clarity - "sagemaker:DescribeModel", - "sagemaker:DeleteModel", - "sagemaker:CreateEndpointConfig", - "sagemaker:DescribeEndpointConfig", - "sagemaker:DeleteEndpointConfig", - "sagemaker:CreateEndpoint", - "sagemaker:DescribeEndpoint", - "sagemaker:DeleteEndpoint", - ], - resources=[ - ( - f"arn:{core.Aws.PARTITION}:sagemaker:{core.Aws.REGION}:{core.Aws.ACCOUNT_ID}:model/" - f"mlopssagemakermodel*" - ), - ( - f"arn:{core.Aws.PARTITION}:sagemaker:{core.Aws.REGION}:{core.Aws.ACCOUNT_ID}:endpoint-config/" - f"mlopssagemakerendpointconfig*" - ), - ( - f"arn:{core.Aws.PARTITION}:sagemaker:{core.Aws.REGION}:{core.Aws.ACCOUNT_ID}:endpoint/" - f"mlopssagemakerendpoint*" - ), - ], + actions=actions, + resources=resources, ) @@ -56,12 +63,7 @@ def sagemaker_baseline_job_policy(baseline_job_name): "sagemaker:StopProcessingJob", "sagemaker:DeleteProcessingJob", ], - resources=[ - ( - f"arn:{core.Aws.PARTITION}:sagemaker:{core.Aws.REGION}:{core.Aws.ACCOUNT_ID}:" - f"processing-job/{baseline_job_name}" - ), - ], + resources=[f"{sagemaker_arn_prefix}:processing-job/{baseline_job_name}"], ) @@ -70,12 +72,7 @@ def batch_transform_policy(): actions=[ "sagemaker:CreateTransformJob", ], - resources=[ - ( - f"arn:{core.Aws.PARTITION}:sagemaker:{core.Aws.REGION}:{core.Aws.ACCOUNT_ID}:" - f"transform-job/mlopssagemakermodel-*-batch-transform-*" - ), - ], + resources=[f"{sagemaker_arn_prefix}:transform-job/mlopssagemakermodel-*-batch-transform-*"], ) @@ -88,7 +85,7 @@ def create_service_role(scope, id, service, description): ) -def sagemaker_monitor_policiy_statement(baseline_job_name, monitoring_schedual_name): +def sagemaker_monitor_policy_statement(baseline_job_name, monitoring_schedule_name, endpoint_name): return iam.PolicyStatement( actions=[ "sagemaker:DescribeEndpointConfig", @@ -98,24 +95,20 @@ def sagemaker_monitor_policiy_statement(baseline_job_name, monitoring_schedual_n "sagemaker:StopMonitoringSchedule", "sagemaker:DeleteMonitoringSchedule", "sagemaker:DescribeProcessingJob", + "sagemaker:CreateDataQualityJobDefinition", + "sagemaker:DescribeDataQualityJobDefinition", + "sagemaker:DeleteDataQualityJobDefinition", + "sagemaker:CreateModelQualityJobDefinition", + "sagemaker:DescribeModelQualityJobDefinition", + "sagemaker:DeleteModelQualityJobDefinition", ], resources=[ - ( - f"arn:{core.Aws.PARTITION}:sagemaker:{core.Aws.REGION}:{core.Aws.ACCOUNT_ID}:endpoint-config/" - f"mlopssagemakerendpointconfig*" - ), - ( - f"arn:{core.Aws.PARTITION}:sagemaker:{core.Aws.REGION}:{core.Aws.ACCOUNT_ID}:endpoint/" - f"mlopssagemakerendpoint*" - ), - ( - f"arn:{core.Aws.PARTITION}:sagemaker:{core.Aws.REGION}:{core.Aws.ACCOUNT_ID}:" - f"monitoring-schedule/{monitoring_schedual_name}" - ), - ( - f"arn:{core.Aws.PARTITION}:sagemaker:{core.Aws.REGION}:{core.Aws.ACCOUNT_ID}:" - f"processing-job/{baseline_job_name}" - ), + f"{sagemaker_arn_prefix}:endpoint-config/mlopssagemakerendpointconfig*", + f"{sagemaker_arn_prefix}:endpoint/{endpoint_name}", + f"{sagemaker_arn_prefix}:monitoring-schedule/{monitoring_schedule_name}", + f"{sagemaker_arn_prefix}:processing-job/{baseline_job_name}", + f"{sagemaker_arn_prefix}:data-quality-job-definition/*", + f"{sagemaker_arn_prefix}:model-quality-job-definition/*", ], ) @@ -126,7 +119,7 @@ def sagemaker_tags_policy_statement(): "sagemaker:AddTags", "sagemaker:DeleteTags", ], - resources=[f"arn:{core.Aws.PARTITION}:sagemaker:{core.Aws.REGION}:{core.Aws.ACCOUNT_ID}:*"], + resources=[f"{sagemaker_arn_prefix}:*"], ) @@ -283,8 +276,8 @@ def get_model_registry_actions_resources(model_package_group_name): ] resources = [ - f"arn:aws:sagemaker:{core.Aws.REGION}:{core.Aws.ACCOUNT_ID}:model-package-group/{model_package_group_name}", - f"arn:aws:sagemaker:{core.Aws.REGION}:{core.Aws.ACCOUNT_ID}:model-package/{model_package_group_name}/*", + f"{sagemaker_arn_prefix}:model-package-group/{model_package_group_name}", + f"{sagemaker_arn_prefix}:model-package/{model_package_group_name}/*", ] return (actions, resources) @@ -442,7 +435,7 @@ def create_orchestrator_policy( f"arn:{core.Aws.PARTITION}:codebuild:{core.Aws.REGION}:" f"{core.Aws.ACCOUNT_ID}:project/VerifySagemaker*" ), - (f"arn:{core.Aws.PARTITION}:codebuild:{core.Aws.REGION}:" f"{core.Aws.ACCOUNT_ID}:report-group/*"), + f"arn:{core.Aws.PARTITION}:codebuild:{core.Aws.REGION}:{core.Aws.ACCOUNT_ID}:report-group/*", ], ), iam.PolicyStatement( @@ -562,7 +555,7 @@ def create_orchestrator_policy( ) -def create_inovoke_lambda_policy(lambda_functions_list): +def create_invoke_lambda_policy(lambda_functions_list): return iam.PolicyStatement( actions=["lambda:InvokeFunction"], # NOSONAR: permission needs to be repeated for clarity resources=lambda_functions_list, diff --git a/source/lib/blueprints/byom/pipeline_definitions/sagemaker_endpoint.py b/source/lib/blueprints/byom/pipeline_definitions/sagemaker_endpoint.py index d524c8b..597677c 100644 --- a/source/lib/blueprints/byom/pipeline_definitions/sagemaker_endpoint.py +++ b/source/lib/blueprints/byom/pipeline_definitions/sagemaker_endpoint.py @@ -15,12 +15,13 @@ ) -def create_sagemaker_endpoint(scope, id, endpoint_config_name, model_name, **kwargs): +def create_sagemaker_endpoint(scope, id, endpoint_config_name, endpoint_name, model_name, **kwargs): # create Sagemaker endpoint sagemaker_endpoint = sagemaker.CfnEndpoint( scope, id, endpoint_config_name=endpoint_config_name, + endpoint_name=endpoint_name, tags=[{"key": "endpoint-name", "value": f"{model_name}-endpoint"}], **kwargs, ) diff --git a/source/lib/blueprints/byom/pipeline_definitions/sagemaker_endpoint_config.py b/source/lib/blueprints/byom/pipeline_definitions/sagemaker_endpoint_config.py index 473662f..a5724f3 100644 --- a/source/lib/blueprints/byom/pipeline_definitions/sagemaker_endpoint_config.py +++ b/source/lib/blueprints/byom/pipeline_definitions/sagemaker_endpoint_config.py @@ -1,5 +1,5 @@ # ##################################################################################################################### -# Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # # # # Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance # # with the License. A copy of the License is located at # @@ -44,7 +44,7 @@ def create_sagemaker_endpoint_config( "destinationS3Uri": f"s3://{data_capture_location}", "captureOptions": [{"captureMode": "Output"}, {"captureMode": "Input"}], "captureContentTypeHeader": {"csvContentTypes": ["text/csv"]}, - # The key specfied here is used to encrypt data on S3 captured by the endpoint. If you don't provide + # The key specified here is used to encrypt data on S3 captured by the endpoint. If you don't provide # a KMS key ID, Amazon SageMaker uses the default KMS key for Amazon S3 for your role's account. # for more info see DataCaptureConfig # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpointconfig.html diff --git a/source/lib/blueprints/byom/pipeline_definitions/sagemaker_model_monitor_construct.py b/source/lib/blueprints/byom/pipeline_definitions/sagemaker_model_monitor_construct.py new file mode 100644 index 0000000..7f9cef3 --- /dev/null +++ b/source/lib/blueprints/byom/pipeline_definitions/sagemaker_model_monitor_construct.py @@ -0,0 +1,322 @@ +# ##################################################################################################################### +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance # +# with the License. A copy of the License is located at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES # +# OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions # +# and limitations under the License. # +# ##################################################################################################################### +from typing import List, Dict, Union, Optional +from aws_cdk import aws_sagemaker as sagemaker, core + + +class SageMakerModelMonitor(core.Construct): + """ + Creates Amazon SageMaker Model Monitor (DataQuality or ModelQuality) + + Attributes: + scope (CDK Construct scope): that's needed to create CDK resources + id (str): CDK resource's logical id + monitoring_schedule_name (str): name of the monitoring job to be created + endpoint_name (str): name of the deployed SageMaker endpoint to be monitored + baseline_job_name (str): name of the baseline job + schedule_expression (str): cron job expression + monitoring_output_location (str): S3 location where the output will be stored + instance_type (str): compute instance type for the baseline job, in the form of a CDK CfnParameter object + instance_volume_size (str): volume size of the EC2 instance + instance_count (str): number of EC2 instances + max_runtime_seconds (str): max time the job is allowed to run + kms_key_arn (str): optional arn of the kms key used to encrypt datacapture and + to encrypt job's output + role_arn (str): Sagemaker role's arn to be used to create the monitoring schedule + image_uri (str): the Model Monitor's Docker image URI + monitoring_type (str): type of SageMaker Model Monitor. Supported values ['DataQuality'|'ModelQuality'] + tags (list[dict[str, str]]): resource tags + ground_truth_s3_uri (str): used with ModelQuality monitor. Location of the ground truth labels (default: None) + problem_type (str): used with ModelQuality monitor. Type of Machine Learning problem. Valid values are + ['Regression'|'BinaryClassification'|'MulticlassClassification'] (default: None). + inference_attribute (str): used with ModelQuality monitor. Index or JSONpath to locate predicted label(s). + Required for 'Regression'|'MulticlassClassification' problems, + and not required for 'BinaryClassification' if 'probability_attribute' and + 'probability_threshold_attribute' are provided (default: None). + probability_attribute (str): used with ModelQuality monitor. index or JSONpath to locate probabilities. + Used only with 'BinaryClassification' problem if 'inference_attribute' is not provided (default: None). + probability_threshold_attribute (str): used with ModelQuality monitor. Threshold to convert probabilities to + binaries. Used only with 'BinaryClassification' problem if 'inference_attribute' is not provided (default: None). + """ + + def __init__( + self, # NOSONAR:S107 the class is designed to take many attributes + scope: core.Construct, + id: str, + monitoring_schedule_name: str, + endpoint_name: str, + baseline_job_name: str, + baseline_job_output_location: str, + schedule_expression: str, + monitoring_output_location: str, + instance_type: str, + instance_count: str, + instance_volume_size: str, + max_runtime_seconds: str, + kms_key_arn: str, + role_arn: str, + image_uri: str, + monitoring_type: str, + tags: List[Dict[str, str]], + ground_truth_s3_uri: Optional[str] = None, + problem_type: Optional[str] = None, + inference_attribute: Optional[str] = None, + probability_attribute: Optional[str] = None, + probability_threshold_attribute: Optional[str] = None, + **kwargs, + ) -> None: + super().__init__(scope, id, **kwargs) + self.scope = scope + self.id = id + self.monitoring_schedule_name = monitoring_schedule_name + self.endpoint_name = endpoint_name + self.baseline_job_name = baseline_job_name + self.baseline_job_output_location = baseline_job_output_location + self.schedule_expression = schedule_expression + self.monitoring_output_location = monitoring_output_location + self.instance_type = instance_type + self.instance_count = instance_count + self.instance_volume_size = instance_volume_size + self.max_runtime_seconds = max_runtime_seconds + self.kms_key_arn = kms_key_arn + self.role_arn = role_arn + self.image_uri = image_uri + self.monitoring_type = monitoring_type + self.tags = tags + self.ground_truth_s3_uri = ground_truth_s3_uri + self.problem_type = problem_type + self.inference_attribute = inference_attribute + self.probability_attribute = probability_attribute + self.probability_threshold_attribute = probability_threshold_attribute + + # validate the provided monitoring_type + if monitoring_type not in ["DataQuality", "ModelQuality"]: + raise ValueError( + ( + f"The provided monitoring type: {monitoring_type} is not valid. " + + "It must be 'DataQuality'|'ModelQuality'" + ) + ) + + # create the [DataQuality|ModelQuality]JobDefinition + self.__job_definition = self._get_job_definition( + monitoring_type=monitoring_type, id=f"{monitoring_type}JobDefinition" + ) + + # create the monitoring schedule + self.__monitoring_schedule = self._create_sagemaker_monitoring_schedule( + monitoring_schedule_name=self.monitoring_schedule_name, + monitor_job_definition=self.__job_definition, + ) + + def _get_job_definition( + self, monitoring_type: str, id: str + ) -> Union[sagemaker.CfnDataQualityJobDefinition, sagemaker.CfnModelQualityJobDefinition]: + """ + Gets the *JobDefinition based on the monitoring_type + + Args: + monitoring_type (str): possible values [DataQuality, ModelQuality] + id (str): CDK resource's logical id + + Returns: + sagemaker.CfnDataQualityJobDefinition or sagemaker.CfnModelQualityJobDefinition object + """ + # create *JobDefinition MonitoringType->function_name map + type_function_map = dict( + DataQuality="_create_data_quality_job_definition", ModelQuality="_create_model_quality_job_definition" + ) + + # call the right function to create the *JobDefinition + job_definition = getattr(self, type_function_map[monitoring_type])(id) + + return job_definition + + def _create_data_quality_job_definition( + self, + id: str, + ) -> sagemaker.CfnDataQualityJobDefinition: + """ + Creates Amazon SageMaker's Data Quality Job Definition + + Args: + id (str): CDK resource's logical id + + Returns: + sagemaker.CfnDataQualityJobDefinition object + """ + data_quality_job_definition = sagemaker.CfnDataQualityJobDefinition( + self.scope, + id, + data_quality_app_specification=sagemaker.CfnDataQualityJobDefinition.DataQualityAppSpecificationProperty( + image_uri=self.image_uri + ), + data_quality_baseline_config=sagemaker.CfnDataQualityJobDefinition.DataQualityBaselineConfigProperty( + constraints_resource=sagemaker.CfnDataQualityJobDefinition.ConstraintsResourceProperty( + s3_uri=f"s3://{self.baseline_job_output_location}/constraints.json" + ), + statistics_resource=sagemaker.CfnDataQualityJobDefinition.StatisticsResourceProperty( + s3_uri=f"s3://{self.baseline_job_output_location}/statistics.json" + ), + ), + data_quality_job_input=sagemaker.CfnDataQualityJobDefinition.DataQualityJobInputProperty( + endpoint_input=sagemaker.CfnDataQualityJobDefinition.EndpointInputProperty( + endpoint_name=self.endpoint_name, + local_path="/opt/ml/processing/input/data_quality_input", + ) + ), + data_quality_job_output_config=sagemaker.CfnDataQualityJobDefinition.MonitoringOutputConfigProperty( + monitoring_outputs=[ + sagemaker.CfnDataQualityJobDefinition.MonitoringOutputProperty( + s3_output=sagemaker.CfnDataQualityJobDefinition.S3OutputProperty( + s3_uri=f"s3://{self.monitoring_output_location}", + local_path="/opt/ml/processing/output/data_quality_output", + s3_upload_mode="EndOfJob", + ) + ) + ], + kms_key_id=self.kms_key_arn, + ), + job_resources=sagemaker.CfnDataQualityJobDefinition.MonitoringResourcesProperty( + cluster_config=sagemaker.CfnDataQualityJobDefinition.ClusterConfigProperty( + instance_count=core.Token.as_number(self.instance_count), + instance_type=self.instance_type, + volume_size_in_gb=core.Token.as_number(self.instance_volume_size), + volume_kms_key_id=self.kms_key_arn, + ) + ), + stopping_condition=sagemaker.CfnDataQualityJobDefinition.StoppingConditionProperty( + max_runtime_in_seconds=core.Token.as_number(self.max_runtime_seconds) + ), + role_arn=self.role_arn, + tags=self.tags, + ) + + return data_quality_job_definition + + def _create_model_quality_job_definition( + self, + id: str, + ) -> sagemaker.CfnModelQualityJobDefinition: + """ + Creates Amazon SageMaker's Model Quality Job Definition + + Args: + id (str): CDK resource's logical id + + Returns: + sagemaker.CfnModelQualityJobDefinition object + """ + + # create the ModelQualityJobDefinition + model_quality_job_definition = sagemaker.CfnModelQualityJobDefinition( + self.scope, + id, + model_quality_app_specification=sagemaker.CfnModelQualityJobDefinition.ModelQualityAppSpecificationProperty( + problem_type=self.problem_type, image_uri=self.image_uri + ), + model_quality_baseline_config=sagemaker.CfnModelQualityJobDefinition.ModelQualityBaselineConfigProperty( + constraints_resource=sagemaker.CfnModelQualityJobDefinition.ConstraintsResourceProperty( + s3_uri=f"s3://{self.baseline_job_output_location}/constraints.json" + ), + ), + model_quality_job_input=sagemaker.CfnModelQualityJobDefinition.ModelQualityJobInputProperty( + endpoint_input=sagemaker.CfnModelQualityJobDefinition.EndpointInputProperty( + endpoint_name=self.endpoint_name, + local_path="/opt/ml/processing/input/model_quality_input", + inference_attribute=self.inference_attribute, + probability_attribute=self.probability_attribute, + probability_threshold_attribute=core.Token.as_number(self.probability_threshold_attribute), + ), + ground_truth_s3_input=sagemaker.CfnModelQualityJobDefinition.MonitoringGroundTruthS3InputProperty( + s3_uri=f"s3://{self.ground_truth_s3_uri}" + ), + ), + model_quality_job_output_config=sagemaker.CfnModelQualityJobDefinition.MonitoringOutputConfigProperty( + monitoring_outputs=[ + sagemaker.CfnModelQualityJobDefinition.MonitoringOutputProperty( + s3_output=sagemaker.CfnModelQualityJobDefinition.S3OutputProperty( + s3_uri=f"s3://{self.monitoring_output_location}", + local_path="/opt/ml/processing/output/model_quality_output", + s3_upload_mode="EndOfJob", + ) + ) + ], + kms_key_id=self.kms_key_arn, + ), + job_resources=sagemaker.CfnModelQualityJobDefinition.MonitoringResourcesProperty( + cluster_config=sagemaker.CfnModelQualityJobDefinition.ClusterConfigProperty( + instance_count=core.Token.as_number(self.instance_count), + instance_type=self.instance_type, + volume_size_in_gb=core.Token.as_number(self.instance_volume_size), + volume_kms_key_id=self.kms_key_arn, + ) + ), + stopping_condition=sagemaker.CfnModelQualityJobDefinition.StoppingConditionProperty( + max_runtime_in_seconds=core.Token.as_number(self.max_runtime_seconds) + ), + role_arn=self.role_arn, + tags=self.tags, + ) + + return model_quality_job_definition + + def _create_sagemaker_monitoring_schedule( + self, + monitoring_schedule_name: str, + monitor_job_definition: Union[sagemaker.CfnDataQualityJobDefinition, sagemaker.CfnModelQualityJobDefinition], + ) -> sagemaker.CfnMonitoringSchedule: + """ + Creates Amazon SageMaker's Monitoring Schedule object + + Args: + monitoring_schedule_name (str): name of the monitoring job to be created + monitor_job_definition (sagemaker.CfnDataQualityJobDefinition or sagemaker.CfnModelQualityJobDefinition): + monitor job definition + + Returns: + sagemaker.CfnMonitoringSchedule object + """ + + # create the monitoring schedule + schedule = sagemaker.CfnMonitoringSchedule( + self.scope, + f"{self.id}Schedule", + monitoring_schedule_name=monitoring_schedule_name, + monitoring_schedule_config=sagemaker.CfnMonitoringSchedule.MonitoringScheduleConfigProperty( + schedule_config=sagemaker.CfnMonitoringSchedule.ScheduleConfigProperty( + schedule_expression=self.schedule_expression + ), + # *JobDefinition's name is not specified, so stack updates won't fail + # hence, "monitor_job_definition.job_definition_name" has no value. + # The get_att is used to get the generated *JobDefinition's name + monitoring_job_definition_name=core.Fn.get_att( + monitor_job_definition.logical_id, "JobDefinitionName" + ).to_string(), + monitoring_type=self.monitoring_type, + ), + tags=self.tags, + ) + + # add dependency on teh monitor job defintion + schedule.add_depends_on(monitor_job_definition) + + return schedule + + @property + def job_definition(self) -> Union[sagemaker.CfnDataQualityJobDefinition, sagemaker.CfnModelQualityJobDefinition]: + return self.__job_definition + + @property + def monitoring_schedule(self) -> sagemaker.CfnMonitoringSchedule: + return self.__monitoring_schedule diff --git a/source/lib/blueprints/byom/pipeline_definitions/sagemaker_monitor_role.py b/source/lib/blueprints/byom/pipeline_definitions/sagemaker_monitor_role.py index d933bfa..824a7dd 100644 --- a/source/lib/blueprints/byom/pipeline_definitions/sagemaker_monitor_role.py +++ b/source/lib/blueprints/byom/pipeline_definitions/sagemaker_monitor_role.py @@ -18,7 +18,7 @@ from lib.blueprints.byom.pipeline_definitions.iam_policies import ( kms_policy_document, - sagemaker_monitor_policiy_statement, + sagemaker_monitor_policy_statement, sagemaker_tags_policy_statement, sagemaker_logs_metrics_policy_document, s3_policy_read, @@ -40,9 +40,11 @@ def create_sagemaker_monitor_role( output_s3_location, kms_key_arn_provided_condition, baseline_job_name, - monitoring_schedual_name, + monitoring_schedule_name, + endpoint_name, + model_monitor_ground_truth_input, ): - # create optional polocies + # create optional policies kms_policy = kms_policy_document(scope, "MLOpsKmsPolicy", kms_key_arn) # add conditions to KMS and ECR policies @@ -52,27 +54,32 @@ def create_sagemaker_monitor_role( role = iam.Role(scope, id, assumed_by=iam.ServicePrincipal("sagemaker.amazonaws.com")) # permissions to create sagemaker resources - sagemaker_policy = sagemaker_monitor_policiy_statement(baseline_job_name, monitoring_schedual_name) + sagemaker_policy = sagemaker_monitor_policy_statement(baseline_job_name, monitoring_schedule_name, endpoint_name) # sagemaker tags permissions sagemaker_tags_policy = sagemaker_tags_policy_statement() # logs/metrics permissions logs_metrics_policy = sagemaker_logs_metrics_policy_document(scope, "SagemakerLogsMetricsPolicy") # S3 permissions - s3_read = s3_policy_read( - list( - set( - [ - f"arn:aws:s3:::{assets_bucket_name}", - f"arn:aws:s3:::{assets_bucket_name}/*", - f"arn:aws:s3:::{data_capture_bucket}", - f"arn:aws:s3:::{data_capture_s3_location}/*", - f"arn:aws:s3:::{baseline_output_bucket}", - f"arn:aws:s3:::{baseline_job_output_location}/*", - ] - ) + s3_read_resources = list( + set( # set is used since a same bucket can be used more than once + [ + f"arn:aws:s3:::{assets_bucket_name}", + f"arn:aws:s3:::{assets_bucket_name}/*", + f"arn:aws:s3:::{data_capture_bucket}", + f"arn:aws:s3:::{data_capture_s3_location}/*", + f"arn:aws:s3:::{baseline_output_bucket}", + f"arn:aws:s3:::{baseline_job_output_location}/*", + ] ) ) + + # add permissions to read ground truth data (only for ModelQuality monitor) + if model_monitor_ground_truth_input: + s3_read_resources.extend( + [f"arn:aws:s3:::{model_monitor_ground_truth_input}", f"arn:aws:s3:::{model_monitor_ground_truth_input}/*"] + ) + s3_read = s3_policy_read(s3_read_resources) s3_write = s3_policy_write( [ f"arn:aws:s3:::{output_s3_location}/*", @@ -83,7 +90,7 @@ def create_sagemaker_monitor_role( # IAM GetRole permission get_role_policy = get_role_policy_statement(role) - # add policy statments + # add policy statements role.add_to_policy(sagemaker_policy) role.add_to_policy(sagemaker_tags_policy) role.add_to_policy(s3_read) diff --git a/source/lib/blueprints/byom/pipeline_definitions/sagemaker_monitoring_schedule.py b/source/lib/blueprints/byom/pipeline_definitions/sagemaker_monitoring_schedule.py deleted file mode 100644 index 812b6c7..0000000 --- a/source/lib/blueprints/byom/pipeline_definitions/sagemaker_monitoring_schedule.py +++ /dev/null @@ -1,131 +0,0 @@ -# ##################################################################################################################### -# Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. # -# # -# Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance # -# with the License. A copy of the License is located at # -# # -# http://www.apache.org/licenses/LICENSE-2.0 # -# # -# or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES # -# OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions # -# and limitations under the License. # -# ##################################################################################################################### -from aws_cdk import aws_sagemaker as sagemaker, core - - -def create_sagemaker_monitoring_scheduale( - scope, # NOSONAR:S107 this function is designed to take many arguments - id, - monitoring_schedule_name, - endpoint_name, - baseline_job_name, - baseline_job_output_location, - schedule_expression, - monitoring_output_location, - instance_type, - instance_volume_size, - max_runtime_seconds, - kms_key_arn, - role_arn, - image_uri, - stack_name, -): - """ - create_sagemaker_monitoring_scheduale creates a monitoring schedule using CDK - - :scope: CDK Construct scope that's needed to create CDK resources - :monitoring_schedual_name: name of the monitoring job to be created - :endpoint_name: name of the deployed SageMaker endpoint to be monitored - :baseline_job_name: name of the baseline job - :baseline_job_output_location: S3 prefix in the S3 assets bucket to store the output of the job - :schedule_expression: cron job expression - :monitoring_output_location: S3 location where the output will be stored - :instance_type: compute instance type for the baseline job, in the form of a CDK CfnParameter object - :instance_volume_size: volume size of the EC2 instance - :max_runtime_seconds: max time the job is allowd to run - :kms_key_arn": optional arn of the kms key used to encrypt datacapture and to encrypt job's output - :role_arn: Sagemaker role's arn to be used to create the monitoring schedule - :image_uri: the name of the stack where the schedule will be created - :return: return an sagemaker.CfnMonitoringSchedule object - - """ - schedule = sagemaker.CfnMonitoringSchedule( - scope, - id, - monitoring_schedule_name=monitoring_schedule_name, - monitoring_schedule_config=sagemaker.CfnMonitoringSchedule.MonitoringScheduleConfigProperty( - schedule_config=sagemaker.CfnMonitoringSchedule.ScheduleConfigProperty( - schedule_expression=schedule_expression - ), - monitoring_job_definition=sagemaker.CfnMonitoringSchedule.MonitoringJobDefinitionProperty( - baseline_config=sagemaker.CfnMonitoringSchedule.BaselineConfigProperty( - constraints_resource=sagemaker.CfnMonitoringSchedule.ConstraintsResourceProperty( - s3_uri=f"s3://{baseline_job_output_location}/{baseline_job_name}/constraints.json" - ), - statistics_resource=sagemaker.CfnMonitoringSchedule.StatisticsResourceProperty( - s3_uri=f"s3://{baseline_job_output_location}/{baseline_job_name}/statistics.json" - ), - ), - monitoring_inputs=sagemaker.CfnMonitoringSchedule.MonitoringInputsProperty( - monitoring_inputs=[ - sagemaker.CfnMonitoringSchedule.MonitoringInputProperty( - endpoint_input=sagemaker.CfnMonitoringSchedule.EndpointInputProperty( - endpoint_name=endpoint_name, - local_path="/opt/ml/processing/input/monitoring_dataset_input", - s3_input_mode="File", - s3_data_distribution_type="FullyReplicated", - ) - ) - ] - ), - monitoring_output_config=sagemaker.CfnMonitoringSchedule.MonitoringOutputConfigProperty( - monitoring_outputs=[ - sagemaker.CfnMonitoringSchedule.MonitoringOutputProperty( - s3_output=sagemaker.CfnMonitoringSchedule.S3OutputProperty( - s3_uri=f"s3://{monitoring_output_location}", - local_path="/opt/ml/processing/output", - s3_upload_mode="EndOfJob", - ) - ) - ], - kms_key_id=kms_key_arn, - ), - monitoring_resources=sagemaker.CfnMonitoringSchedule.MonitoringResourcesProperty( - cluster_config=sagemaker.CfnMonitoringSchedule.ClusterConfigProperty( - instance_count=1.0, - instance_type=instance_type, - volume_size_in_gb=core.Token.as_number(instance_volume_size), - volume_kms_key_id=kms_key_arn, - ) - ), - monitoring_app_specification=sagemaker.CfnMonitoringSchedule.MonitoringAppSpecificationProperty( - image_uri=image_uri - ), - stopping_condition=sagemaker.CfnMonitoringSchedule.StoppingConditionProperty( - max_runtime_in_seconds=core.Token.as_number(max_runtime_seconds) - ), - role_arn=role_arn, - ), - ), - tags=[ - {"key": "stack_name", "value": stack_name}, - ], - ) - - # This is a workaround the current bug in CDK aws-sagemaker, where the MonitoringInputs property - # is duplicated. link to the bug https://github.com/aws/aws-cdk/issues/12208 - schedule.add_property_override( - "MonitoringScheduleConfig.MonitoringJobDefinition.MonitoringInputs", - [ - { - "EndpointInput": { - "EndpointName": {"Ref": "ENDPOINTNAME"}, - "LocalPath": "/opt/ml/processing/input/monitoring_dataset_input", - "S3DataDistributionType": "FullyReplicated", - "S3InputMode": "File", - } - } - ], - ) - - return schedule diff --git a/source/lib/blueprints/byom/pipeline_definitions/sagemaker_role.py b/source/lib/blueprints/byom/pipeline_definitions/sagemaker_role.py index a448f77..246e605 100644 --- a/source/lib/blueprints/byom/pipeline_definitions/sagemaker_role.py +++ b/source/lib/blueprints/byom/pipeline_definitions/sagemaker_role.py @@ -19,8 +19,8 @@ from lib.blueprints.byom.pipeline_definitions.iam_policies import ( ecr_policy_document, kms_policy_document, - sagemaker_policiy_statement, - sagemaker_monitor_policiy_statement, + sagemaker_policy_statement, + sagemaker_monitor_policy_statement, sagemaker_tags_policy_statement, sagemaker_logs_metrics_policy_document, s3_policy_read, @@ -44,8 +44,11 @@ def create_sagemaker_role( ecr_repo_arn_provided_condition, kms_key_arn_provided_condition, model_registry_provided_condition, + is_realtime_pipeline=False, + endpoint_name=None, + endpoint_name_provided=None, ): - # create optional polocies + # create optional policies ecr_policy = ecr_policy_document(scope, "MLOpsECRPolicy", custom_algorithms_ecr_arn) kms_policy = kms_policy_document(scope, "MLOpsKmsPolicy", kms_key_arn) model_registry = model_registry_policy_document(scope, "ModelRegistryPolicy", model_package_group_name) @@ -59,7 +62,7 @@ def create_sagemaker_role( role = iam.Role(scope, id, assumed_by=iam.ServicePrincipal("sagemaker.amazonaws.com")) # permissions to create sagemaker resources - sagemaker_policy = sagemaker_policiy_statement() + sagemaker_policy = sagemaker_policy_statement(is_realtime_pipeline, endpoint_name, endpoint_name_provided) # sagemaker tags permissions sagemaker_tags_policy = sagemaker_tags_policy_statement() @@ -88,7 +91,7 @@ def create_sagemaker_role( # IAM GetRole permission get_role_policy = get_role_policy_statement(role) - # add policy statments + # add policy statements role.add_to_policy(sagemaker_policy) role.add_to_policy(sagemaker_tags_policy) logs_policy.attach_to_role(role) diff --git a/source/lib/blueprints/byom/pipeline_definitions/templates_parameters.py b/source/lib/blueprints/byom/pipeline_definitions/templates_parameters.py index a4aaea6..86124a8 100644 --- a/source/lib/blueprints/byom/pipeline_definitions/templates_parameters.py +++ b/source/lib/blueprints/byom/pipeline_definitions/templates_parameters.py @@ -1,5 +1,5 @@ # ##################################################################################################################### -# Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # # # # Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance # # with the License. A copy of the License is located at # @@ -13,518 +13,655 @@ from aws_cdk import core -def create_notification_email_parameter(scope): - return core.CfnParameter( - scope, - "NOTIFICATION_EMAIL", - type="String", - description="email for pipeline outcome notifications", - allowed_pattern="^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$", - constraint_description="Please enter an email address with correct format (example@exmaple.com)", - min_length=5, - max_length=320, - ) - - -def create_git_address_parameter(scope): - return core.CfnParameter( - scope, - "CodeCommit Repo Address", - type="String", - description="AWS CodeCommit repository clone URL to connect to the framework.", - allowed_pattern=( - "^(((https:\/\/|ssh:\/\/)(git\-codecommit)\.[a-zA-Z0-9_.+-]+(amazonaws\.com\/)[a-zA-Z0-9-.]" - "+(\/)[a-zA-Z0-9-.]+(\/)[a-zA-Z0-9-.]+$)|^$)" - ), - min_length=0, - max_length=320, - constraint_description=( - "CodeCommit address must follow the pattern: ssh or " - "https://git-codecommit.REGION.amazonaws.com/version/repos/REPONAME" - ), - ) - - -def create_existing_bucket_parameter(scope): - return core.CfnParameter( - scope, - "ExistingS3Bucket", - type="String", - description="Name of existing S3 bucket to be used for ML assests. S3 Bucket must be in the same region as the deployed stack, and has versioning enabled. If not provided, a new S3 bucket will be created.", - allowed_pattern="((?=^.{3,63}$)(?!^(\d+\.)+\d+$)(^(([a-z0-9]|[a-z0-9][a-z0-9\-]*[a-z0-9])\.)*([a-z0-9]|[a-z0-9][a-z0-9\-]*[a-z0-9])$)|^$)", - min_length=0, - max_length=63, - ) - - -def create_existing_ecr_repo_parameter(scope): - return core.CfnParameter( - scope, - "ExistingECRRepo", - type="String", - description="Name of existing Amazom ECR repository for custom algorithms. If not provided, a new ECR repo will be created.", - allowed_pattern="((?:[a-z0-9]+(?:[._-][a-z0-9]+)*/)*[a-z0-9]+(?:[._-][a-z0-9]+)*|^$)", - min_length=0, - max_length=63, - ) - - -def create_account_id_parameter(scope, id, account_type): - return core.CfnParameter( - scope, - id, - type="String", - description=f"AWS {account_type} account number where the CF template will be deployed", - allowed_pattern="^\d{12}$", - ) - - -def create_org_id_parameter(scope, id, account_type): - return core.CfnParameter( - scope, - id, - type="String", - description=f"AWS {account_type} organizational unit id where the CF template will be deployed", - allowed_pattern="^ou-[0-9a-z]{4,32}-[a-z0-9]{8,32}$", - ) - - -def create_blueprint_bucket_name_parameter(scope): - return core.CfnParameter( - scope, - "BLUEPRINT_BUCKET", - type="String", - description="Bucket name for blueprints of different types of ML Pipelines.", - min_length=3, - ) - - -def create_data_capture_bucket_name_parameter(scope): - return core.CfnParameter( - scope, - "DATA_CAPTURE_BUCKET", - type="String", - description="Bucket name where the data captured from SageMaker endpoint will be stored.", - min_length=3, - ) - - -def create_baseline_output_bucket_name_parameter(scope): - return core.CfnParameter( - scope, - "BASELINE_OUTPUT_BUCKET", - type="String", - description="Bucket name where the output of the baseline job will be stored.", - min_length=3, - ) - - -def create_batch_input_bucket_name_parameter(scope): - return core.CfnParameter( - scope, - "BATCH_INPUT_BUCKET", - type="String", - description="Bucket name where the data input of the bact transform is stored.", - min_length=3, - ) - - -def create_assets_bucket_name_parameter(scope): - return core.CfnParameter( - scope, - "ASSETS_BUCKET", - type="String", - description="Bucket name where the model and training data are stored.", - min_length=3, - ) - - -def create_custom_algorithms_ecr_repo_arn_parameter(scope): - return core.CfnParameter( - scope, - "CUSTOM_ALGORITHMS_ECR_REPO_ARN", - type="String", - description="The arn of the Amazon ECR repository where custom algorithm image is stored (optional)", - allowed_pattern="(^arn:aws:ecr:(us(-gov)?|ap|ca|cn|eu|sa)-(central|(north|south)?(east|west)?)-\\d:\\d{12}:repository/.+|^$)", - constraint_description="Please enter valid ECR repo ARN", - min_length=0, - max_length=2048, - ) - - -def create_kms_key_arn_parameter(scope): - return core.CfnParameter( - scope, - "KMS_KEY_ARN", - type="String", - description="The KMS ARN to encrypt the output of the batch transform job and instance volume (optional).", - allowed_pattern="(^arn:aws:kms:(us(-gov)?|ap|ca|cn|eu|sa)-(central|(north|south)?(east|west)?)-\d:\d{12}:key/.+|^$)", - constraint_description="Please enter kmsKey ARN", - min_length=0, - max_length=2048, - ) - - -def create_algorithm_image_uri_parameter(scope): - return core.CfnParameter( - scope, - "IMAGE_URI", - type="String", - description="The algorithm image uri (build-in or custom)", - ) - - -def create_model_name_parameter(scope): - return core.CfnParameter( - scope, "MODEL_NAME", type="String", description="An arbitrary name for the model.", min_length=1 - ) - - -def create_stack_name_parameter(scope): - return core.CfnParameter( - scope, "STACK_NAME", type="String", description="The name to assign to the deployed CF stack.", min_length=1 - ) - - -def create_endpoint_name_parameter(scope): - return core.CfnParameter( - scope, "ENDPOINT_NAME", type="String", description="The name of the ednpoint to monitor", min_length=1 - ) - - -def create_model_artifact_location_parameter(scope): - return core.CfnParameter( - scope, - "MODEL_ARTIFACT_LOCATION", - type="String", - description="Path to model artifact inside assets bucket.", - ) - - -def create_inference_instance_parameter(scope): - return core.CfnParameter( - scope, - "INFERENCE_INSTANCE", - type="String", - description="Inference instance that inference requests will be running on. E.g., ml.m5.large", - allowed_pattern="^[a-zA-Z0-9_.+-]+\.[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$", - min_length=7, - ) - - -def create_batch_inference_data_parameter(scope): - return core.CfnParameter( - scope, - "BATCH_INFERENCE_DATA", - type="String", - description="S3 bukcet path (including bucket name) to batch inference data file.", - ) - - -def create_batch_job_output_location_parameter(scope): - return core.CfnParameter( - scope, - "BATCH_OUTPUT_LOCATION", - type="String", - description="S3 path (including bucket name) to store the results of the batch job.", - ) - - -def create_data_capture_location_parameter(scope): - return core.CfnParameter( - scope, - "DATA_CAPTURE_LOCATION", - type="String", - description="S3 path (including bucket name) to store captured data from the Sagemaker endpoint.", - min_length=3, - ) - - -def create_baseline_job_output_location_parameter(scope): - return core.CfnParameter( - scope, - "BASELINE_JOB_OUTPUT_LOCATION", - type="String", - description="S3 path (including bucket name) to store the Data Baseline Job's output.", - min_length=3, - ) - - -def create_monitoring_output_location_parameter(scope): - return core.CfnParameter( - scope, - "MONITORING_OUTPUT_LOCATION", - type="String", - description="S3 path (including bucket name) to store the output of the Monitoring Schedule.", - min_length=3, - ) - - -def create_schedule_expression_parameter(scope): - return core.CfnParameter( - scope, - "SCHEDULE_EXPRESSION", - type="String", - description="cron expression to run the monitoring schedule. E.g., cron(0 * ? * * *), cron(0 0 ? * * *), etc.", - allowed_pattern="^cron(\\S+\\s){5}\\S+$", - ) - - -def create_training_data_parameter(scope): - return core.CfnParameter( - scope, - "TRAINING_DATA", - type="String", - description="Location of the training data in Assets S3 Bucket.", - ) - - -def create_instance_type_parameter(scope): - return core.CfnParameter( - scope, - "INSTANCE_TYPE", - type="String", - description="EC2 instance type that model moniroing jobs will be running on. E.g., ml.m5.large", - allowed_pattern="^[a-zA-Z0-9_.+-]+\.[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$", - min_length=7, - ) - - -def create_instance_volume_size_parameter(scope): - return core.CfnParameter( - scope, - "INSTANCE_VOLUME_SIZE", - type="Number", - description="Instance volume size used in model moniroing jobs. E.g., 20", - ) - - -def create_monitoring_type_parameter(scope): - return core.CfnParameter( - scope, - "MONITORING_TYPE", - type="String", - allowed_values=["dataquality", "modelquality", "modelbias", "modelexplainability"], - default="dataquality", - description="Type of model monitoring. Possible values: DataQuality | ModelQuality | ModelBias | ModelExplainability ", - ) - - -def create_max_runtime_seconds_parameter(scope): - return core.CfnParameter( - scope, - "MAX_RUNTIME_SECONDS", - type="Number", - description="Max runtime in secodns the job is allowed to run. E.g., 3600", - ) - - -def create_baseline_job_name_parameter(scope): - return core.CfnParameter( - scope, - "BASELINE_JOB_NAME", - type="String", - description="Unique name of the data baseline job", - min_length=3, - max_length=63, - ) - - -def create_monitoring_schedule_name_parameter(scope): - return core.CfnParameter( - scope, - "MONITORING_SCHEDULE_NAME", - type="String", - description="Unique name of the monitoring schedule job", - min_length=3, - max_length=63, - ) - - -def create_template_zip_name_parameter(scope): - return core.CfnParameter( - scope, - "TEMPLATE_ZIP_NAME", - type="String", - allowed_pattern="^.*\.zip$", - description="The zip file's name containing the CloudFormation template and its parameters files", - ) - - -def create_template_file_name_parameter(scope): - return core.CfnParameter( - scope, - "TEMPLATE_FILE_NAME", - type="String", - allowed_pattern="^.*\.yaml$", - description="CloudFormation template's file name", - ) - - -def create_stage_params_file_name_parameter(scope, id, stage_type): - return core.CfnParameter( - scope, - id, - type="String", - allowed_pattern="^.*\.json$", - description=f"parameters json file's name for the {stage_type} stage", - ) - - -def create_custom_container_parameter(scope): - return core.CfnParameter( - scope, - "CUSTOM_CONTAINER", - default="", - type="String", - description=( - "Should point to a zip file containing dockerfile and assets for building a custom model. " - "If empty it will beusing containers from SageMaker Registry" - ), - ) - - -def create_ecr_repo_name_parameter(scope): - return core.CfnParameter( - scope, - "ECR_REPO_NAME", - type="String", - description="Name of the Amazon ECR repository. This repo will be useed to store custom algorithms images.", - allowed_pattern="(?:[a-z0-9]+(?:[._-][a-z0-9]+)*/)*[a-z0-9]+(?:[._-][a-z0-9]+)*", - min_length=1, - ) - - -def create_image_tag_parameter(scope): - return core.CfnParameter( - scope, "IMAGE_TAG", type="String", description="Docker image tag for the custom algorithm", min_length=1 - ) - - -def create_custom_algorithms_ecr_repo_arn_provided_condition(scope, custom_algorithms_ecr_repo_arn): - return core.CfnCondition( - scope, - "CustomECRRepoProvided", - expression=core.Fn.condition_not(core.Fn.condition_equals(custom_algorithms_ecr_repo_arn, "")), - ) - - -def create_kms_key_arn_provided_condition(scope, kms_key_arn): - return core.CfnCondition( - scope, - "KMSKeyProvided", - expression=core.Fn.condition_not(core.Fn.condition_equals(kms_key_arn, "")), - ) - - -def create_git_address_provided_condition(scope, git_address): - return core.CfnCondition( - scope, - "GitAddressProvided", - expression=core.Fn.condition_not(core.Fn.condition_equals(git_address, "")), - ) - - -def create_existing_bucket_provided_condition(scope, existing_bucket): - return core.CfnCondition( - scope, - "S3BucketProvided", - expression=core.Fn.condition_not(core.Fn.condition_equals(existing_bucket.value_as_string, "")), - ) - - -def create_existing_ecr_provided_condition(scope, existing_ecr_repo): - return core.CfnCondition( - scope, - "ECRProvided", - expression=core.Fn.condition_not(core.Fn.condition_equals(existing_ecr_repo.value_as_string, "")), - ) - - -def create_new_bucket_condition(scope, existing_bucket): - return core.CfnCondition( - scope, - "CreateS3Bucket", - expression=core.Fn.condition_equals(existing_bucket.value_as_string, ""), - ) - - -def create_new_ecr_repo_condition(scope, existing_ecr_repo): - return core.CfnCondition( - scope, - "CreateECRRepo", - expression=core.Fn.condition_equals(existing_ecr_repo.value_as_string, ""), - ) - - -def create_delegated_admin_parameter(scope): - return core.CfnParameter( - scope, - "DELEGATED_ADMIN_ACCOUNT", - type="String", - allowed_values=["Yes", "No"], - default="Yes", - description="Is a delegated administrator account used to deploy accross account", - ) - - -def create_delegated_admin_condition(scope, delegated_admin_parameter): - return core.CfnCondition( - scope, - "UseDelegatedAdmin", - expression=core.Fn.condition_equals(delegated_admin_parameter.value_as_string, "Yes"), - ) - - -def create_use_model_registry_parameter(scope): - return core.CfnParameter( - scope, - "USE_MODEL_REGISTRY", - type="String", - allowed_values=["Yes", "No"], - default="No", - description="Will Amazon SageMaker's Model Registry be used to provision models?", - ) - - -def create_model_registry_parameter(scope): - return core.CfnParameter( - scope, - "CREATE_MODEL_REGISTRY", - type="String", - allowed_values=["Yes", "No"], - default="No", - description="Do you want the solution to create the SageMaker Model Package Group Name (i.e., Model Registry)", - ) - - -def create_model_registry_condition(scope, create_model_registry): - return core.CfnCondition( - scope, - "CreateModelRegistryCondition", - expression=core.Fn.condition_equals(create_model_registry.value_as_string, "Yes"), - ) - - -def create_model_package_group_name_parameter(scope): - return core.CfnParameter( - scope, "MODEL_PACKAGE_GROUP_NAME", type="String", description="SageMaker model package group name", min_length=0 - ) - - -def create_model_package_name_parameter(scope): - return core.CfnParameter( - scope, - "MODEL_PACKAGE_NAME", - allowed_pattern="(^arn:aws[a-z\-]*:sagemaker:[a-z0-9\-]*:[0-9]{12}:model-package/.*|^$)", - type="String", - description="The model name (version arn) in SageMaker's model package name group", - ) - - -def create_model_registry_provided_condition(scope, model_package_name): - return core.CfnCondition( - scope, - "ModelRegistryProvided", - expression=core.Fn.condition_not(core.Fn.condition_equals(model_package_name, "")), - ) \ No newline at end of file +class ParameteresFactory: + @staticmethod + def create_notification_email_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "NotificationEmail", + type="String", + description="email for pipeline outcome notifications", + allowed_pattern="^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$", + constraint_description="Please enter an email address with correct format (example@exmaple.com)", + min_length=5, + max_length=320, + ) + + @staticmethod + def create_git_address_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "CodeCommitRepoAddress", + type="String", + description="AWS CodeCommit repository clone URL to connect to the framework.", + allowed_pattern=( + "^(((https:\/\/|ssh:\/\/)(git\-codecommit)\.[a-zA-Z0-9_.+-]+(amazonaws\.com\/)[a-zA-Z0-9-.]" + "+(\/)[a-zA-Z0-9-.]+(\/)[a-zA-Z0-9-.]+$)|^$)" + ), + min_length=0, + max_length=320, + constraint_description=( + "CodeCommit address must follow the pattern: ssh or " + "https://git-codecommit.REGION.amazonaws.com/version/repos/REPONAME" + ), + ) + + @staticmethod + def create_existing_bucket_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "ExistingS3Bucket", + type="String", + description="Name of existing S3 bucket to be used for ML assets. S3 Bucket must be in the same region as the deployed stack, and has versioning enabled. If not provided, a new S3 bucket will be created.", + allowed_pattern="((?=^.{3,63}$)(?!^(\d+\.)+\d+$)(^(([a-z0-9]|[a-z0-9][a-z0-9\-]*[a-z0-9])\.)*([a-z0-9]|[a-z0-9][a-z0-9\-]*[a-z0-9])$)|^$)", + min_length=0, + max_length=63, + ) + + @staticmethod + def create_existing_ecr_repo_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "ExistingECRRepo", + type="String", + description="Name of existing Amazon ECR repository for custom algorithms. If not provided, a new ECR repo will be created.", + allowed_pattern="((?:[a-z0-9]+(?:[._-][a-z0-9]+)*/)*[a-z0-9]+(?:[._-][a-z0-9]+)*|^$)", + min_length=0, + max_length=63, + ) + + @staticmethod + def create_account_id_parameter(scope: core.Construct, id: str, account_type: str) -> core.CfnParameter: + return core.CfnParameter( + scope, + id, + type="String", + description=f"AWS {account_type} account number where the CF template will be deployed", + allowed_pattern="^\d{12}$", + ) + + @staticmethod + def create_org_id_parameter(scope: core.Construct, id: str, account_type: str) -> core.CfnParameter: + return core.CfnParameter( + scope, + id, + type="String", + description=f"AWS {account_type} organizational unit id where the CF template will be deployed", + allowed_pattern="^ou-[0-9a-z]{4,32}-[a-z0-9]{8,32}$", + ) + + @staticmethod + def create_blueprint_bucket_name_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "BlueprintBucket", + type="String", + description="Bucket name for blueprints of different types of ML Pipelines.", + min_length=3, + ) + + @staticmethod + def create_data_capture_bucket_name_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "DataCaptureBucket", + type="String", + description="Bucket name where the data captured from SageMaker endpoint will be stored.", + min_length=3, + ) + + @staticmethod + def create_baseline_output_bucket_name_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "BaselineOutputBucket", + type="String", + description="Bucket name where the output of the baseline job will be stored.", + min_length=3, + ) + + @staticmethod + def create_batch_input_bucket_name_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "BatchInputBucket", + type="String", + description="Bucket name where the data input of the bact transform is stored.", + min_length=3, + ) + + @staticmethod + def create_assets_bucket_name_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "AssetsBucket", + type="String", + description="Bucket name where the model and baselines data are stored.", + min_length=3, + ) + + @staticmethod + def create_custom_algorithms_ecr_repo_arn_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "CustomAlgorithmsECRRepoArn", + type="String", + description="The arn of the Amazon ECR repository where custom algorithm image is stored (optional)", + allowed_pattern="(^arn:aws:ecr:(us(-gov)?|ap|ca|cn|eu|sa)-(central|(north|south)?(east|west)?)-\\d:\\d{12}:repository/.+|^$)", + constraint_description="Please enter valid ECR repo ARN", + min_length=0, + max_length=2048, + ) + + @staticmethod + def create_kms_key_arn_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "KmsKeyArn", + type="String", + description="The KMS ARN to encrypt the output of the batch transform job and instance volume (optional).", + allowed_pattern="(^arn:aws:kms:(us(-gov)?|ap|ca|cn|eu|sa)-(central|(north|south)?(east|west)?)-\d:\d{12}:key/.+|^$)", + constraint_description="Please enter kmsKey ARN", + min_length=0, + max_length=2048, + ) + + @staticmethod + def create_algorithm_image_uri_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "ImageUri", + type="String", + description="The algorithm image uri (build-in or custom)", + ) + + @staticmethod + def create_model_name_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, "ModelName", type="String", description="An arbitrary name for the model.", min_length=1 + ) + + @staticmethod + def create_stack_name_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, "StackName", type="String", description="The name to assign to the deployed CF stack.", min_length=1 + ) + + @staticmethod + def create_endpoint_name_parameter(scope: core.Construct, optional=False) -> core.CfnParameter: + return core.CfnParameter( + scope, + "EndpointName", + type="String", + description="The name of the AWS SageMaker's endpoint", + min_length=0 if optional else 1, + ) + + @staticmethod + def create_model_artifact_location_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "ModelArtifactLocation", + type="String", + description="Path to model artifact inside assets bucket.", + ) + + @staticmethod + def create_inference_instance_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "InferenceInstance", + type="String", + description="Inference instance that inference requests will be running on. E.g., ml.m5.large", + allowed_pattern="^[a-zA-Z0-9_.+-]+\.[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$", + min_length=7, + ) + + @staticmethod + def create_batch_inference_data_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "BatchInferenceData", + type="String", + description="S3 bucket path (including bucket name) to batch inference data file.", + ) + + @staticmethod + def create_batch_job_output_location_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "BatchOutputLocation", + type="String", + description="S3 path (including bucket name) to store the results of the batch job.", + ) + + @staticmethod + def create_data_capture_location_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "DataCaptureLocation", + type="String", + description="S3 path (including bucket name) to store captured data from the Sagemaker endpoint.", + min_length=3, + ) + + @staticmethod + def create_baseline_job_output_location_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "BaselineJobOutputLocation", + type="String", + description="S3 path (including bucket name) to store the Data Baseline Job's output.", + min_length=3, + ) + + @staticmethod + def create_monitoring_output_location_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "MonitoringOutputLocation", + type="String", + description="S3 path (including bucket name) to store the output of the Monitoring Schedule.", + min_length=3, + ) + + @staticmethod + def create_schedule_expression_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "ScheduleExpression", + type="String", + description="cron expression to run the monitoring schedule. E.g., cron(0 * ? * * *), cron(0 0 ? * * *), etc.", + allowed_pattern="^cron(\\S+\\s){5}\\S+$", + ) + + @staticmethod + def create_baseline_data_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "BaselineData", + type="String", + description="Location of the Baseline data in Assets S3 Bucket.", + ) + + @staticmethod + def create_instance_type_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "InstanceType", + type="String", + description="EC2 instance type that model monitoring jobs will be running on. E.g., ml.m5.large", + allowed_pattern="^[a-zA-Z0-9_.+-]+\.[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$", + min_length=7, + ) + + @staticmethod + def create_instance_volume_size_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "InstanceVolumeSize", + type="Number", + description="Instance volume size used in model monitoring jobs. E.g., 20", + ) + + @staticmethod + def create_baseline_max_runtime_seconds_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "BaselineMaxRuntimeSeconds", + type="String", + default="", + description="Optional Maximum runtime in seconds the baseline job is allowed to run. E.g., 3600", + ) + + @staticmethod + def create_monitor_max_runtime_seconds_parameter(scope: core.Construct, monitoring_type: str) -> core.CfnParameter: + max_default = "1800" if monitoring_type in ["ModelQuality", "ModelBias"] else "3600" + return core.CfnParameter( + scope, + "MonitorMaxRuntimeSeconds", + type="Number", + default=max_default, + description=( + f" Required Maximum runtime in seconds the job is allowed to run the {monitoring_type} baseline job. " + + "For data quality and model explainability, this can be up to 3600 seconds for an hourly schedule. " + + "For model bias and model quality hourly schedules, this can be up to 1800 seconds." + ), + min_value=1, + max_value=86400, + ) + + @staticmethod + def create_baseline_job_name_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "BaselineJobName", + type="String", + description="Unique name of the data baseline job", + min_length=3, + max_length=63, + ) + + @staticmethod + def create_monitoring_schedule_name_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "MonitoringScheduleName", + type="String", + description="Unique name of the monitoring schedule job", + min_length=3, + max_length=63, + ) + + @staticmethod + def create_template_zip_name_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "TemplateZipFileName", + type="String", + allowed_pattern="^.*\.zip$", + description="The zip file's name containing the CloudFormation template and its parameters files", + ) + + @staticmethod + def create_template_file_name_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "TemplateFileName", + type="String", + allowed_pattern="^.*\.yaml$", + description="CloudFormation template's file name", + ) + + @staticmethod + def create_stage_params_file_name_parameter(scope: core.Construct, id: str, stage_type: str) -> core.CfnParameter: + return core.CfnParameter( + scope, + id, + type="String", + allowed_pattern="^.*\.json$", + description=f"parameters json file's name for the {stage_type} stage", + ) + + @staticmethod + def create_custom_container_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "CustomImage", + default="", + type="String", + description=( + "Should point to a zip file containing dockerfile and assets for building a custom model. " + "If empty it will be using containers from SageMaker Registry" + ), + ) + + @staticmethod + def create_ecr_repo_name_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "ECRRepoName", + type="String", + description="Name of the Amazon ECR repository. This repo will be used to store custom algorithms images.", + allowed_pattern="(?:[a-z0-9]+(?:[._-][a-z0-9]+)*/)*[a-z0-9]+(?:[._-][a-z0-9]+)*", + min_length=1, + ) + + @staticmethod + def create_image_tag_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, "ImageTag", type="String", description="Docker image tag for the custom algorithm", min_length=1 + ) + + @staticmethod + def create_delegated_admin_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "DelegatedAdminAccount", + type="String", + allowed_values=["Yes", "No"], + default="Yes", + description="Is a delegated administrator account used to deploy accross account", + ) + + @staticmethod + def create_use_model_registry_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "UseModelRegistry", + type="String", + allowed_values=["Yes", "No"], + default="No", + description="Will Amazon SageMaker's Model Registry be used to provision models?", + ) + + @staticmethod + def create_model_registry_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "CreateModelRegistry", + type="String", + allowed_values=["Yes", "No"], + default="No", + description="Do you want the solution to create the SageMaker Model Package Group Name (i.e., Model Registry)", + ) + + @staticmethod + def create_model_package_group_name_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "ModelPackageGroupName", + type="String", + description="SageMaker model package group name", + min_length=0, + ) + + @staticmethod + def create_model_package_name_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "ModelPackageName", + allowed_pattern="(^arn:aws[a-z\-]*:sagemaker:[a-z0-9\-]*:[0-9]{12}:model-package/.*|^$)", + type="String", + description="The model name (version arn) in SageMaker's model package name group", + ) + + @staticmethod + def create_instance_count_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "MonitoringJobInstanceCount", + type="Number", + default="1", + description="Instance count used by model monitoring job. For example, 1", + ) + + @staticmethod + def create_ground_truth_s3_uri_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "MonitorGroundTruthInput", + type="String", + description="Amazon S3 prefix that contains the ground truth data", + min_length=3, + ) + + @staticmethod + def create_problem_type_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "ProblemType", + type="String", + allowed_values=["Regression", "BinaryClassification", "MulticlassClassification"], + description="Problem type. Possible values: Regression | BinaryClassification | MulticlassClassification", + ) + + @staticmethod + def create_inference_attribute_parameter(scope: core.Construct, job_type: str) -> core.CfnParameter: + return core.CfnParameter( + scope, + f"{job_type}InferenceAttribute", + type="String", + description="Index or JSONpath to locate predicted label(s)", + ) + + @staticmethod + def create_probability_attribute_parameter(scope: core.Construct, job_type: str) -> core.CfnParameter: + return core.CfnParameter( + scope, + f"{job_type}ProbabilityAttribute", + type="String", + description="Index or JSONpath to locate probabilities.", + ) + + @staticmethod + def create_ground_truth_attribute_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "BaselineGroundTruthAttribute", + type="String", + description="Index or JSONpath to locate ground truth label.", + ) + + @staticmethod + def create_probability_threshold_attribute_parameter(scope: core.Construct) -> core.CfnParameter: + return core.CfnParameter( + scope, + "ProbabilityThresholdAttribute", + default="0.5", + type="Number", + description="Threshold to convert probabilities to binaries", + ) + + +class ConditionsFactory: + @staticmethod + def create_custom_algorithms_ecr_repo_arn_provided_condition( + scope: core.Construct, custom_algorithms_ecr_repo_arn: core.CfnParameter + ) -> core.CfnCondition: + return core.CfnCondition( + scope, + "CustomECRRepoProvided", + expression=core.Fn.condition_not( + core.Fn.condition_equals(custom_algorithms_ecr_repo_arn.value_as_string, "") + ), + ) + + @staticmethod + def create_kms_key_arn_provided_condition( + scope: core.Construct, kms_key_arn: core.CfnParameter + ) -> core.CfnCondition: + return core.CfnCondition( + scope, + "KmsKeyProvided", + expression=core.Fn.condition_not(core.Fn.condition_equals(kms_key_arn.value_as_string, "")), + ) + + @staticmethod + def create_git_address_provided_condition( + scope: core.Construct, git_address: core.CfnParameter + ) -> core.CfnCondition: + return core.CfnCondition( + scope, + "GitAddressProvided", + expression=core.Fn.condition_not(core.Fn.condition_equals(git_address.value_as_string, "")), + ) + + @staticmethod + def create_existing_bucket_provided_condition( + scope: core.Construct, existing_bucket: core.CfnParameter + ) -> core.CfnCondition: + return core.CfnCondition( + scope, + "S3BucketProvided", + expression=core.Fn.condition_not(core.Fn.condition_equals(existing_bucket.value_as_string, "")), + ) + + @staticmethod + def create_existing_ecr_provided_condition( + scope: core.Construct, existing_ecr_repo: core.CfnParameter + ) -> core.CfnCondition: + return core.CfnCondition( + scope, + "ECRProvided", + expression=core.Fn.condition_not(core.Fn.condition_equals(existing_ecr_repo.value_as_string, "")), + ) + + @staticmethod + def create_new_bucket_condition(scope: core.Construct, existing_bucket: core.CfnParameter) -> core.CfnCondition: + return core.CfnCondition( + scope, + "CreateS3Bucket", + expression=core.Fn.condition_equals(existing_bucket.value_as_string, ""), + ) + + @staticmethod + def create_new_ecr_repo_condition(scope: core.Construct, existing_ecr_repo: core.CfnParameter) -> core.CfnCondition: + return core.CfnCondition( + scope, + "CreateECRRepo", + expression=core.Fn.condition_equals(existing_ecr_repo.value_as_string, ""), + ) + + @staticmethod + def create_delegated_admin_condition( + scope: core.Construct, delegated_admin_parameter: core.CfnParameter + ) -> core.CfnCondition: + return core.CfnCondition( + scope, + "UseDelegatedAdmin", + expression=core.Fn.condition_equals(delegated_admin_parameter.value_as_string, "Yes"), + ) + + @staticmethod + def create_model_registry_condition( + scope: core.Construct, create_model_registry: core.CfnParameter + ) -> core.CfnCondition: + return core.CfnCondition( + scope, + "CreateModelRegistryCondition", + expression=core.Fn.condition_equals(create_model_registry.value_as_string, "Yes"), + ) + + @staticmethod + def create_model_registry_provided_condition( + scope: core.Construct, model_package_name: core.CfnParameter + ) -> core.CfnCondition: + return core.CfnCondition( + scope, + "ModelRegistryProvided", + expression=core.Fn.condition_not(core.Fn.condition_equals(model_package_name.value_as_string, "")), + ) + + @staticmethod + def create_endpoint_name_provided_condition( + scope: core.Construct, endpoint_name: core.CfnParameter + ) -> core.CfnCondition: + return core.CfnCondition( + scope, + "EndpointNameProvided", + expression=core.Fn.condition_not(core.Fn.condition_equals(endpoint_name.value_as_string, "")), + ) + + @staticmethod + def create_problem_type_regression_or_multiclass_classification_condition( + scope: core.Construct, problem_type: core.CfnParameter + ) -> core.CfnCondition: + return core.CfnCondition( + scope, + "ProblemTypeRegressionOrMulticlassClassification", + expression=core.Fn.condition_or( + core.Fn.condition_equals(problem_type.value_as_string, "Regression"), + core.Fn.condition_equals(problem_type.value_as_string, "MulticlassClassification"), + ), + ) + + @staticmethod + def create_problem_type_binary_classification_condition( + scope: core.Construct, problem_type: core.CfnParameter + ) -> core.CfnCondition: + return core.CfnCondition( + scope, + "ProblemTypeBinaryClassification", + expression=core.Fn.condition_equals(problem_type.value_as_string, "BinaryClassification"), + ) diff --git a/source/lib/blueprints/byom/realtime_inference_pipeline.py b/source/lib/blueprints/byom/realtime_inference_pipeline.py index f490846..fd0b5df 100644 --- a/source/lib/blueprints/byom/realtime_inference_pipeline.py +++ b/source/lib/blueprints/byom/realtime_inference_pipeline.py @@ -1,5 +1,5 @@ # ##################################################################################################################### -# Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. # +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # # # # Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance # # with the License. A copy of the License is located at # @@ -25,20 +25,8 @@ from lib.blueprints.byom.pipeline_definitions.sagemaker_endpoint import create_sagemaker_endpoint from lib.blueprints.byom.pipeline_definitions.helpers import suppress_lambda_policies from lib.blueprints.byom.pipeline_definitions.templates_parameters import ( - create_blueprint_bucket_name_parameter, - create_assets_bucket_name_parameter, - create_algorithm_image_uri_parameter, - create_custom_algorithms_ecr_repo_arn_parameter, - create_inference_instance_parameter, - create_kms_key_arn_parameter, - create_model_artifact_location_parameter, - create_model_name_parameter, - create_data_capture_location_parameter, - create_custom_algorithms_ecr_repo_arn_provided_condition, - create_kms_key_arn_provided_condition, - create_model_package_name_parameter, - create_model_registry_provided_condition, - create_model_package_group_name_parameter, + ParameteresFactory as pf, + ConditionsFactory as cf, ) @@ -47,28 +35,33 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) # Parameteres # - assets_bucket_name = create_assets_bucket_name_parameter(self) - blueprint_bucket_name = create_blueprint_bucket_name_parameter(self) - custom_algorithms_ecr_repo_arn = create_custom_algorithms_ecr_repo_arn_parameter(self) - kms_key_arn = create_kms_key_arn_parameter(self) - algorithm_image_uri = create_algorithm_image_uri_parameter(self) - model_name = create_model_name_parameter(self) - model_artifact_location = create_model_artifact_location_parameter(self) - data_capture_location = create_data_capture_location_parameter(self) - inference_instance = create_inference_instance_parameter(self) - model_package_group_name = create_model_package_group_name_parameter(self) - model_package_name = create_model_package_name_parameter(self) + assets_bucket_name = pf.create_assets_bucket_name_parameter(self) + blueprint_bucket_name = pf.create_blueprint_bucket_name_parameter(self) + custom_algorithms_ecr_repo_arn = pf.create_custom_algorithms_ecr_repo_arn_parameter(self) + kms_key_arn = pf.create_kms_key_arn_parameter(self) + algorithm_image_uri = pf.create_algorithm_image_uri_parameter(self) + model_name = pf.create_model_name_parameter(self) + model_artifact_location = pf.create_model_artifact_location_parameter(self) + data_capture_location = pf.create_data_capture_location_parameter(self) + inference_instance = pf.create_inference_instance_parameter(self) + model_package_group_name = pf.create_model_package_group_name_parameter(self) + model_package_name = pf.create_model_package_name_parameter(self) + # add the optional endpoint_name + endpoint_name = pf.create_endpoint_name_parameter(self, optional=True) # Conditions - custom_algorithms_ecr_repo_arn_provided = create_custom_algorithms_ecr_repo_arn_provided_condition( + custom_algorithms_ecr_repo_arn_provided = cf.create_custom_algorithms_ecr_repo_arn_provided_condition( self, custom_algorithms_ecr_repo_arn ) - kms_key_arn_provided = create_kms_key_arn_provided_condition(self, kms_key_arn) - model_registry_provided = create_model_registry_provided_condition(self, model_package_name) + kms_key_arn_provided = cf.create_kms_key_arn_provided_condition(self, kms_key_arn) + model_registry_provided = cf.create_model_registry_provided_condition(self, model_package_name) + endpoint_name_provided = cf.create_endpoint_name_provided_condition(self, endpoint_name) # Resources # # getting blueprint bucket object from its name - will be used later in the stack - blueprint_bucket = s3.Bucket.from_bucket_name(self, "BlueprintBucket", blueprint_bucket_name.value_as_string) + blueprint_bucket = s3.Bucket.from_bucket_name( + self, "ImportedBlueprintBucket", blueprint_bucket_name.value_as_string + ) # provision api gateway and lambda for inference using solution constructs inference_api_gateway = aws_apigateway_lambda.ApiGatewayToLambda( @@ -87,7 +80,7 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: "proxy": False, }, ) - # add supressions + # add suppressions inference_api_gateway.lambda_function.node.default_child.cfn_options.metadata = suppress_lambda_policies() provision_resource = inference_api_gateway.api_gateway.root.add_resource("inference") provision_resource.add_method("POST") @@ -106,6 +99,9 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: ecr_repo_arn_provided_condition=custom_algorithms_ecr_repo_arn_provided, kms_key_arn_provided_condition=kms_key_arn_provided, model_registry_provided_condition=model_registry_provided, + is_realtime_pipeline=True, + endpoint_name=endpoint_name, + endpoint_name_provided=endpoint_name_provided, ) # create sagemaker model @@ -121,15 +117,15 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: model_name=model_name.value_as_string, ) - # Create Sagemaker EndpointConfg + # Create Sagemaker EndpointConfig sagemaker_endpoint_config = create_sagemaker_endpoint_config( - self, - "MLOpsSagemakerEndpointConfig", - sagemaker_model.attr_model_name, - model_name.value_as_string, - inference_instance.value_as_string, - data_capture_location.value_as_string, - core.Fn.condition_if( + scope=self, + id="MLOpsSagemakerEndpointConfig", + sagemaker_model_name=sagemaker_model.attr_model_name, + model_name=model_name.value_as_string, + inference_instance=inference_instance.value_as_string, + data_capture_location=data_capture_location.value_as_string, + kms_key_arn=core.Fn.condition_if( kms_key_arn_provided.logical_id, kms_key_arn.value_as_string, core.Aws.NO_VALUE ).to_string(), ) @@ -139,10 +135,15 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: # create Sagemaker endpoint sagemaker_endpoint = create_sagemaker_endpoint( - self, - "MLOpsSagemakerEndpoint", - sagemaker_endpoint_config.attr_endpoint_config_name, - model_name.value_as_string, + scope=self, + id="MLOpsSagemakerEndpoint", + endpoint_config_name=sagemaker_endpoint_config.attr_endpoint_config_name, + endpoint_name=core.Fn.condition_if( + endpoint_name_provided.logical_id, + endpoint_name.value_as_string, + core.Aws.NO_VALUE, + ).to_string(), + model_name=model_name.value_as_string, ) # add dependency on endpoint config diff --git a/source/lib/blueprints/byom/single_account_codepipeline.py b/source/lib/blueprints/byom/single_account_codepipeline.py index 4d3dc01..b16c5de 100644 --- a/source/lib/blueprints/byom/single_account_codepipeline.py +++ b/source/lib/blueprints/byom/single_account_codepipeline.py @@ -29,14 +29,7 @@ suppress_sns, suppress_cloudformation_action, ) -from lib.blueprints.byom.pipeline_definitions.templates_parameters import ( - create_notification_email_parameter, - create_template_zip_name_parameter, - create_template_file_name_parameter, - create_stage_params_file_name_parameter, - create_assets_bucket_name_parameter, - create_stack_name_parameter, -) +from lib.blueprints.byom.pipeline_definitions.templates_parameters import ParameteresFactory as pf class SingleAccountCodePipelineStack(core.Stack): @@ -44,15 +37,15 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) # Parameteres # - notification_email = create_notification_email_parameter(self) - template_zip_name = create_template_zip_name_parameter(self) - template_file_name = create_template_file_name_parameter(self) - template_params_file_name = create_stage_params_file_name_parameter(self, "TEMPLATE_PARAMS_NAME", "main") - assets_bucket_name = create_assets_bucket_name_parameter(self) - stack_name = create_stack_name_parameter(self) + notification_email = pf.create_notification_email_parameter(self) + template_zip_name = pf.create_template_zip_name_parameter(self) + template_file_name = pf.create_template_file_name_parameter(self) + template_params_file_name = pf.create_stage_params_file_name_parameter(self, "TemplateParamsName", "main") + assets_bucket_name = pf.create_assets_bucket_name_parameter(self) + stack_name = pf.create_stack_name_parameter(self) # Resources # - assets_bucket = s3.Bucket.from_bucket_name(self, "AssetsBucket", assets_bucket_name.value_as_string) + assets_bucket = s3.Bucket.from_bucket_name(self, "ImportedAssetsBucket", assets_bucket_name.value_as_string) # create sns topic and subscription pipeline_notification_topic = sns.Topic( @@ -119,7 +112,7 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: ) ) - # add cfn supressions + # add cfn suppressions pipeline_child_nodes = single_account_pipeline.node.find_all() pipeline_child_nodes[1].node.default_child.cfn_options.metadata = suppress_pipeline_bucket() pipeline_child_nodes[6].node.default_child.cfn_options.metadata = suppress_iam_complex() diff --git a/source/requirements.txt b/source/requirements.txt index 09c336b..7fea932 100644 --- a/source/requirements.txt +++ b/source/requirements.txt @@ -1,34 +1,34 @@ -aws-cdk.assets==1.96.0 -aws-cdk.aws-apigateway==1.96.0 -aws-cdk.aws-cloudformation==1.96.0 -aws-cdk.aws-cloudwatch==1.96.0 -aws-cdk.aws-codebuild==1.96.0 -aws-cdk.aws-codecommit==1.96.0 -aws-cdk.aws-codedeploy==1.96.0 -aws-cdk.aws-codepipeline==1.96.0 -aws-cdk.aws-codepipeline-actions==1.96.0 -aws-cdk.core==1.96.0 -aws-cdk.aws-ecr==1.96.0 -aws-cdk.aws-ecr-assets==1.96.0 -aws-cdk.aws-events==1.96.0 -aws-cdk.aws-events-targets==1.96.0 -aws-cdk.aws-iam==1.96.0 -aws-cdk.aws-kms==1.96.0 -aws-cdk.aws-lambda==1.96.0 -aws-cdk.aws-lambda-event-sources==1.96.0 -aws-cdk.aws-logs==1.96.0 -aws-cdk.aws-s3==1.96.0 -aws-cdk.aws-s3-assets==1.96.0 -aws-cdk.aws-s3-deployment==1.96.0 -aws-cdk.aws-s3-notifications==1.96.0 -aws-cdk.aws-sagemaker==1.96.0 -aws-cdk.aws-sns==1.96.0 -aws-cdk.aws-sns-subscriptions==1.96.0 -aws-cdk.core==1.96.0 -aws-cdk.custom-resources==1.96.0 -aws-cdk.region-info==1.96.0 -aws-solutions-constructs.aws-apigateway-lambda==1.96.0 -aws-solutions-constructs.aws-lambda-sagemakerendpoint==1.96.0 -aws-solutions-constructs.core==1.96.0 -aws-cdk.cloudformation-include==1.96.0 -aws-cdk.aws-cloudformation==1.96.0 +aws-cdk.assets==1.117.0 +aws-cdk.aws-apigateway==1.117.0 +aws-cdk.aws-cloudformation==1.117.0 +aws-cdk.aws-cloudwatch==1.117.0 +aws-cdk.aws-codebuild==1.117.0 +aws-cdk.aws-codecommit==1.117.0 +aws-cdk.aws-codedeploy==1.117.0 +aws-cdk.aws-codepipeline==1.117.0 +aws-cdk.aws-codepipeline-actions==1.117.0 +aws-cdk.core==1.117.0 +aws-cdk.aws-ecr==1.117.0 +aws-cdk.aws-ecr-assets==1.117.0 +aws-cdk.aws-events==1.117.0 +aws-cdk.aws-events-targets==1.117.0 +aws-cdk.aws-iam==1.117.0 +aws-cdk.aws-kms==1.117.0 +aws-cdk.aws-lambda==1.117.0 +aws-cdk.aws-lambda-event-sources==1.117.0 +aws-cdk.aws-logs==1.117.0 +aws-cdk.aws-s3==1.117.0 +aws-cdk.aws-s3-assets==1.117.0 +aws-cdk.aws-s3-deployment==1.117.0 +aws-cdk.aws-s3-notifications==1.117.0 +aws-cdk.aws-sagemaker==1.117.0 +aws-cdk.aws-sns==1.117.0 +aws-cdk.aws-sns-subscriptions==1.117.0 +aws-cdk.core==1.117.0 +aws-cdk.custom-resources==1.117.0 +aws-cdk.region-info==1.117.0 +aws-solutions-constructs.aws-apigateway-lambda==1.117.0 +aws-solutions-constructs.aws-lambda-sagemakerendpoint==1.117.0 +aws-solutions-constructs.core==1.117.0 +aws-cdk.cloudformation-include==1.117.0 +aws-cdk.aws-cloudformation==1.117.0