From c652e6462b03b5cd7cfce4880229600967a963f7 Mon Sep 17 00:00:00 2001 From: Lauren Yu <6631887+laurenyu@users.noreply.github.com> Date: Thu, 5 Dec 2019 11:14:59 -0800 Subject: [PATCH 01/11] change: allow ModelMonitor and Processor to take IAM role names (in addition to ARNs) This change also removes some hardcoded AWS account IDs and regions from some integration tests. --- src/sagemaker/automl/automl.py | 2 +- .../model_monitor/model_monitoring.py | 27 +++++-------- src/sagemaker/processing.py | 6 +-- tests/integ/test_auto_ml.py | 40 +++++++++---------- tests/integ/test_model_monitor.py | 6 +-- tests/integ/test_processing.py | 4 +- 6 files changed, 38 insertions(+), 47 deletions(-) diff --git a/src/sagemaker/automl/automl.py b/src/sagemaker/automl/automl.py index 2c50a16c0e..2d08227af2 100644 --- a/src/sagemaker/automl/automl.py +++ b/src/sagemaker/automl/automl.py @@ -10,7 +10,7 @@ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF # ANY KIND, either express or implied. See the License for the specific # language governing permissions and limitations under the License. -"""A class for SageMaker AutoML Job.""" +"""A class for SageMaker AutoML Jobs.""" from __future__ import absolute_import from six import string_types diff --git a/src/sagemaker/model_monitor/model_monitoring.py b/src/sagemaker/model_monitor/model_monitoring.py index 99e64d9955..fae42d2777 100644 --- a/src/sagemaker/model_monitor/model_monitoring.py +++ b/src/sagemaker/model_monitor/model_monitoring.py @@ -22,24 +22,17 @@ import logging import uuid -from six.moves.urllib.parse import urlparse from six import string_types - +from six.moves.urllib.parse import urlparse from botocore.exceptions import ClientError +from sagemaker.exceptions import UnexpectedStatusException +from sagemaker.model_monitor.monitoring_files import Constraints, ConstraintViolations, Statistics from sagemaker.network import NetworkConfig +from sagemaker.processing import Processor, ProcessingInput, ProcessingJob, ProcessingOutput from sagemaker.s3 import S3Uploader - -from sagemaker.utils import name_from_base from sagemaker.session import Session -from sagemaker.processing import Processor -from sagemaker.processing import ProcessingJob -from sagemaker.processing import ProcessingInput -from sagemaker.processing import ProcessingOutput -from sagemaker.model_monitor.monitoring_files import Constraints, ConstraintViolations -from sagemaker.model_monitor.monitoring_files import Statistics -from sagemaker.exceptions import UnexpectedStatusException -from sagemaker.utils import retries +from sagemaker.utils import name_from_base, retries _DEFAULT_MONITOR_IMAGE_URI_WITH_PLACEHOLDERS = ( "{}.dkr.ecr.{}.amazonaws.com/sagemaker-model-monitor-analyzer" @@ -390,7 +383,7 @@ def update_monitoring_schedule( network_config (sagemaker.network.NetworkConfig): A NetworkConfig object that configures network isolation, encryption of inter-container traffic, security group IDs, and subnets. - role (str): An AWS IAM role. The Amazon SageMaker jobs use this role. + role (str): An AWS IAM role name or ARN. The Amazon SageMaker jobs use this role. image_uri (str): The uri of the image to use for the jobs started by the Monitor. @@ -452,7 +445,7 @@ def update_monitoring_schedule( self.network_config = network_config if role is not None: - self.role = role + self.role = self.sagemaker_session.expand_role(role) if image_uri is not None: self.image_uri = image_uri @@ -988,7 +981,7 @@ def __init__( creating Amazon SageMaker Monitoring Schedules to monitor SageMaker endpoints. Args: - role (str): An AWS IAM role. The Amazon SageMaker jobs use this role. + role (str): An AWS IAM role name or ARN. The Amazon SageMaker jobs use this role. instance_count (int): The number of instances to run the jobs with. instance_type (str): Type of EC2 instance to use for the job, for example, 'ml.m5.xlarge'. @@ -1355,7 +1348,7 @@ def update_monitoring_schedule( inter-container traffic, security group IDs, and subnets. enable_cloudwatch_metrics (bool): Whether to publish cloudwatch metrics as part of the baselining or monitoring jobs. - role (str): An AWS IAM role. The Amazon SageMaker jobs use this role. + role (str): An AWS IAM role name or ARN. The Amazon SageMaker jobs use this role. """ monitoring_inputs = None @@ -1431,7 +1424,7 @@ def update_monitoring_schedule( network_config_dict = self.network_config._to_request_dict() if role is not None: - self.role = role + self.role = self.sagemaker_session.expand_role(role) self.sagemaker_session.update_monitoring_schedule( monitoring_schedule_name=self.monitoring_schedule_name, diff --git a/src/sagemaker/processing.py b/src/sagemaker/processing.py index 40bb486058..07c4fb53a3 100644 --- a/src/sagemaker/processing.py +++ b/src/sagemaker/processing.py @@ -52,7 +52,7 @@ def __init__( SageMaker processing tasks. Args: - role (str): An AWS IAM role. The Amazon SageMaker training jobs + role (str): An AWS IAM role name or ARN. The Amazon SageMaker training jobs and APIs that create Amazon SageMaker endpoints use this role to access training data and model artifacts. After the endpoint is created, the inference code might use the IAM role, if it @@ -281,7 +281,7 @@ def __init__( handles Amazon SageMaker processing tasks for jobs using script mode. Args: - role (str): An AWS IAM role. The Amazon SageMaker training jobs + role (str): An AWS IAM role name or ARN. The Amazon SageMaker training jobs and APIs that create Amazon SageMaker endpoints use this role to access training data and model artifacts. After the endpoint is created, the inference code might use the IAM role, if it @@ -538,7 +538,7 @@ def start_new(cls, processor, inputs, outputs, experiment_config): else: process_request_args["network_config"] = None - process_request_args["role_arn"] = processor.role + process_request_args["role_arn"] = processor.sagemaker_session.expand_role(processor.role) process_request_args["tags"] = processor.tags diff --git a/tests/integ/test_auto_ml.py b/tests/integ/test_auto_ml.py index ef8b14f288..2b6dd5ec21 100644 --- a/tests/integ/test_auto_ml.py +++ b/tests/integ/test_auto_ml.py @@ -23,7 +23,6 @@ from tests.integ import DATA_DIR, AUTO_ML_DEFAULT_TIMEMOUT_MINUTES from tests.integ.timeout import timeout -DEV_ACCOUNT = 142577830533 ROLE = "SageMakerRole" PREFIX = "sagemaker/beta-automl-xgboost" HOSTING_INSTANCE_TYPE = "ml.c4.xlarge" @@ -40,26 +39,10 @@ # use a succeeded AutoML job to test describe and list candidates method, otherwise tests will run too long AUTO_ML_JOB_NAME = "sagemaker-auto-gamma-ml-test" -EXPECTED_DEFAULT_INPUT_CONFIG = [ - { - "DataSource": { - "S3DataSource": { - "S3DataType": "S3Prefix", - "S3Uri": "s3://sagemaker-us-east-2-{}/{}/input/iris_training.csv".format( - DEV_ACCOUNT, PREFIX - ), - } - }, - "TargetAttributeName": TARGET_ATTRIBUTE_NAME, - } -] EXPECTED_DEFAULT_JOB_CONFIG = { "CompletionCriteria": {"MaxCandidates": 3}, "SecurityConfig": {"EnableInterContainerTrafficEncryption": False}, } -EXPECTED_DEFAULT_OUTPUT_CONFIG = { - "S3OutputPath": "s3://sagemaker-us-east-2-{}/".format(DEV_ACCOUNT) -} def test_auto_ml_fit(sagemaker_session): @@ -102,7 +85,7 @@ def test_auto_ml_input_object_fit(sagemaker_session): def test_auto_ml_fit_optional_args(sagemaker_session): - output_path = "s3://sagemaker-us-east-2-{}/{}".format(DEV_ACCOUNT, "specified_ouput_path") + output_path = "s3://{}/{}".format(sagemaker_session.default_bucket(), "specified_ouput_path") problem_type = "MulticlassClassification" job_objective = {"MetricName": "Accuracy"} auto_ml = AutoML( @@ -138,6 +121,23 @@ def test_auto_ml_invalid_target_attribute(sagemaker_session): def test_auto_ml_describe_auto_ml_job(sagemaker_session): + expected_default_input_config = [ + { + "DataSource": { + "S3DataSource": { + "S3DataType": "S3Prefix", + "S3Uri": "s3://{}/{}/input/iris_training.csv".format( + sagemaker_session.default_bucket(), PREFIX + ), + } + }, + "TargetAttributeName": TARGET_ATTRIBUTE_NAME, + } + ] + expected_default_output_config = { + "S3OutputPath": "s3://{}/".format(sagemaker_session.default_bucket()) + } + auto_ml = AutoML( role=ROLE, target_attribute_name=TARGET_ATTRIBUTE_NAME, sagemaker_session=sagemaker_session ) @@ -146,9 +146,9 @@ def test_auto_ml_describe_auto_ml_job(sagemaker_session): assert desc["AutoMLJobName"] == AUTO_ML_JOB_NAME assert desc["AutoMLJobStatus"] == "Completed" assert isinstance(desc["BestCandidate"], dict) - assert desc["InputDataConfig"] == EXPECTED_DEFAULT_INPUT_CONFIG + assert desc["InputDataConfig"] == expected_default_input_config assert desc["AutoMLJobConfig"] == EXPECTED_DEFAULT_JOB_CONFIG - assert desc["OutputDataConfig"] == EXPECTED_DEFAULT_OUTPUT_CONFIG + assert desc["OutputDataConfig"] == expected_default_output_config def test_list_candidates(sagemaker_session): diff --git a/tests/integ/test_model_monitor.py b/tests/integ/test_model_monitor.py index 6e2c8db198..2b12ee567c 100644 --- a/tests/integ/test_model_monitor.py +++ b/tests/integ/test_model_monitor.py @@ -42,7 +42,7 @@ from tests.integ.kms_utils import get_or_create_kms_key from tests.integ.retry import retries -ROLE = "arn:aws:iam::142577830533:role/SageMakerRole" +ROLE = "SageMakerRole" INSTANCE_COUNT = 1 INSTANCE_TYPE = "ml.m5.xlarge" VOLUME_SIZE_IN_GB = 40 @@ -63,7 +63,7 @@ DEFAULT_EXECUTION_MAX_RUNTIME_IN_SECONDS = 3600 DEFAULT_IMAGE_SUFFIX = ".com/sagemaker-model-monitor-analyzer" -UPDATED_ROLE = "arn:aws:iam::142577830533:role/SageMakerRole" +UPDATED_ROLE = "SageMakerRole" UPDATED_INSTANCE_COUNT = 2 UPDATED_INSTANCE_TYPE = "ml.m5.2xlarge" UPDATED_VOLUME_SIZE_IN_GB = 50 @@ -99,7 +99,7 @@ def predictor(sagemaker_session, tf_full_version): ): model = Model( model_data=model_data, - role="SageMakerRole", + role=ROLE, framework_version=tf_full_version, sagemaker_session=sagemaker_session, ) diff --git a/tests/integ/test_processing.py b/tests/integ/test_processing.py index 28b89f2ead..0e70ae9c88 100644 --- a/tests/integ/test_processing.py +++ b/tests/integ/test_processing.py @@ -23,7 +23,7 @@ from tests.integ import DATA_DIR from tests.integ.kms_utils import get_or_create_kms_key -ROLE = "arn:aws:iam::142577830533:role/SageMakerRole" +ROLE = "SageMakerRole" @pytest.fixture(scope="module") @@ -57,8 +57,6 @@ def output_kms_key(sagemaker_session): def test_sklearn(sagemaker_session, sklearn_full_version, cpu_instance_type): - logging.getLogger().setLevel(logging.DEBUG) # TODO-reinvent-2019: REMOVE - script_path = os.path.join(DATA_DIR, "dummy_script.py") input_file_path = os.path.join(DATA_DIR, "dummy_input.txt") From 6826d12722bed2a5ec01715ef27470ff44f4a9a7 Mon Sep 17 00:00:00 2001 From: Lauren Yu <6631887+laurenyu@users.noreply.github.com> Date: Thu, 5 Dec 2019 11:22:07 -0800 Subject: [PATCH 02/11] Remove unused test constants --- tests/integ/test_data_capture_config.py | 10 ++-------- tests/integ/test_monitoring_files.py | 5 +---- tests/integ/test_processing.py | 1 - 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/tests/integ/test_data_capture_config.py b/tests/integ/test_data_capture_config.py index 45c0965aff..66ed2d24e4 100644 --- a/tests/integ/test_data_capture_config.py +++ b/tests/integ/test_data_capture_config.py @@ -17,23 +17,17 @@ import sagemaker import tests.integ import tests.integ.timeout - -from tests.integ.retry import retries -from sagemaker.model_monitor import NetworkConfig - -from sagemaker.model_monitor import DataCaptureConfig +from sagemaker.model_monitor import DataCaptureConfig, NetworkConfig from sagemaker.tensorflow.serving import Model from sagemaker.utils import unique_name_from_base +from tests.integ.retry import retries ROLE = "SageMakerRole" -REGION = "us-west-2" SKLEARN_FRAMEWORK = "scikit-learn" INSTANCE_COUNT = 1 INSTANCE_TYPE = "ml.m5.xlarge" VOLUME_SIZE_IN_GB = 20 -VOLUME_KMS_KEY = "arn:aws:kms:us-west-2:012345678901:key/volume-kms-key" -OUTPUT_KMS_KEY = "arn:aws:kms:us-west-2:012345678901:key/output-kms-key" MAX_RUNTIME_IN_SECONDS = 2 * 60 * 60 ENVIRONMENT = {"env_key_1": "env_value_1"} TAGS = [{"Key": "tag_key_1", "Value": "tag_value_1"}] diff --git a/tests/integ/test_monitoring_files.py b/tests/integ/test_monitoring_files.py index ae88c54a72..9e25996f7d 100644 --- a/tests/integ/test_monitoring_files.py +++ b/tests/integ/test_monitoring_files.py @@ -19,13 +19,10 @@ import tests.integ import tests.integ.timeout - from sagemaker.model_monitor import Statistics, Constraints, ConstraintViolations from sagemaker.s3 import S3Uploader from tests.integ.kms_utils import get_or_create_kms_key -ROLE = "arn:aws:iam::142577830533:role/SageMakerRole" - @pytest.fixture(scope="module") def monitoring_files_kms_key(sagemaker_session): @@ -40,7 +37,7 @@ def test_statistics_object_creation_from_file_path_with_customizations( kms_key=monitoring_files_kms_key, sagemaker_session=sagemaker_session, ) - # + assert statistics.file_s3_uri.startswith("s3://") assert statistics.file_s3_uri.endswith("statistics.json") diff --git a/tests/integ/test_processing.py b/tests/integ/test_processing.py index 0e70ae9c88..a167724ca8 100644 --- a/tests/integ/test_processing.py +++ b/tests/integ/test_processing.py @@ -12,7 +12,6 @@ # language governing permissions and limitations under the License. from __future__ import absolute_import -import logging import os import pytest From bb994178cf92284d8c6d1ba7669d4f16bae8180d Mon Sep 17 00:00:00 2001 From: Lauren Yu <6631887+laurenyu@users.noreply.github.com> Date: Thu, 5 Dec 2019 11:36:42 -0800 Subject: [PATCH 03/11] update unit tests --- tests/unit/test_processing.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/unit/test_processing.py b/tests/unit/test_processing.py index fe987f73ac..ae4e9376b0 100644 --- a/tests/unit/test_processing.py +++ b/tests/unit/test_processing.py @@ -40,6 +40,7 @@ def sagemaker_session(): name="upload_data", return_value="mocked_s3_uri_from_upload_data" ) session_mock.download_data = Mock(name="download_data") + session_mock.expand_role.return_value = ROLE return session_mock From 35ac28aa1324bf932c8c397643f6ed41c88c26c4 Mon Sep 17 00:00:00 2001 From: Lauren Yu <6631887+laurenyu@users.noreply.github.com> Date: Thu, 5 Dec 2019 13:34:13 -0800 Subject: [PATCH 04/11] fix integ tests --- src/sagemaker/sklearn/processing.py | 2 +- tests/integ/test_processing.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/sagemaker/sklearn/processing.py b/src/sagemaker/sklearn/processing.py index 8532bea0b8..ffc1345f1a 100644 --- a/src/sagemaker/sklearn/processing.py +++ b/src/sagemaker/sklearn/processing.py @@ -48,7 +48,7 @@ def __init__( Args: framework_version (str): The version of scikit-learn. - role (str): An AWS IAM role. The Amazon SageMaker training jobs + role (str): An AWS IAM role name or ARN. The Amazon SageMaker training jobs and APIs that create Amazon SageMaker endpoints use this role to access training data and model artifacts. After the endpoint is created, the inference code might use the IAM role, if it diff --git a/tests/integ/test_processing.py b/tests/integ/test_processing.py index a167724ca8..f48b92010e 100644 --- a/tests/integ/test_processing.py +++ b/tests/integ/test_processing.py @@ -88,7 +88,7 @@ def test_sklearn(sagemaker_session, sklearn_full_version, cpu_instance_type): "python3", "/opt/ml/processing/input/code/dummy_script.py", ] - assert job_description["RoleArn"] == ROLE + assert ROLE in job_description["RoleArn"] def test_sklearn_with_customizations( @@ -163,7 +163,7 @@ def test_sklearn_with_customizations( assert job_description["Environment"] == {"DUMMY_ENVIRONMENT_VARIABLE": "dummy-value"} - assert job_description["RoleArn"] == ROLE + assert ROLE in job_description["RoleArn"] assert job_description["StoppingCondition"] == {"MaxRuntimeInSeconds": 3600} @@ -211,7 +211,7 @@ def test_sklearn_with_no_inputs_or_outputs( assert job_description["Environment"] == {"DUMMY_ENVIRONMENT_VARIABLE": "dummy-value"} - assert job_description["RoleArn"] == ROLE + assert ROLE in job_description["RoleArn"] assert job_description["StoppingCondition"] == {"MaxRuntimeInSeconds": 3600} @@ -286,7 +286,7 @@ def test_script_processor(sagemaker_session, image_uri, cpu_instance_type, outpu assert job_description["Environment"] == {"DUMMY_ENVIRONMENT_VARIABLE": "dummy-value"} - assert job_description["RoleArn"] == ROLE + assert ROLE in job_description["RoleArn"] assert job_description["StoppingCondition"] == {"MaxRuntimeInSeconds": 3600} @@ -334,7 +334,7 @@ def test_script_processor_with_no_inputs_or_outputs( assert job_description["Environment"] == {"DUMMY_ENVIRONMENT_VARIABLE": "dummy-value"} - assert job_description["RoleArn"] == ROLE + assert ROLE in job_description["RoleArn"] assert job_description["StoppingCondition"] == {"MaxRuntimeInSeconds": 3600} @@ -400,6 +400,6 @@ def test_processor(sagemaker_session, image_uri, cpu_instance_type, output_kms_k assert job_description["Environment"] == {"DUMMY_ENVIRONMENT_VARIABLE": "dummy-value"} - assert job_description["RoleArn"] == ROLE + assert ROLE in job_description["RoleArn"] assert job_description["StoppingCondition"] == {"MaxRuntimeInSeconds": 3600} From b110bdda0457be506d028002d2fe6974e4e25a18 Mon Sep 17 00:00:00 2001 From: Lauren Yu <6631887+laurenyu@users.noreply.github.com> Date: Thu, 5 Dec 2019 16:29:20 -0800 Subject: [PATCH 05/11] fix integ tests --- tests/integ/test_processing.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/integ/test_processing.py b/tests/integ/test_processing.py index f48b92010e..364bc1d6d6 100644 --- a/tests/integ/test_processing.py +++ b/tests/integ/test_processing.py @@ -35,9 +35,10 @@ def image_uri(sagemaker_session): @pytest.fixture(scope="module") def volume_kms_key(sagemaker_session): + role_arn = sagemaker_session.expand_role(ROLE) return get_or_create_kms_key( sagemaker_session=sagemaker_session, - role_arn=ROLE, + role_arn=role_arn, alias="integ-test-processing-volume-kms-key-{}".format( sagemaker_session.boto_session.region_name ), @@ -46,9 +47,10 @@ def volume_kms_key(sagemaker_session): @pytest.fixture(scope="module") def output_kms_key(sagemaker_session): + role_arn = sagemaker_session.expand_role(ROLE) return get_or_create_kms_key( sagemaker_session=sagemaker_session, - role_arn=ROLE, + role_arn=role_arn, alias="integ-test-processing-output-kms-key-{}".format( sagemaker_session.boto_session.region_name ), From 84f1c45e1bbe1d34e533cfce0d4250c9b846e35e Mon Sep 17 00:00:00 2001 From: Lauren Yu <6631887+laurenyu@users.noreply.github.com> Date: Fri, 6 Dec 2019 08:25:24 -0800 Subject: [PATCH 06/11] fix integ tests --- tests/integ/test_model_monitor.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/integ/test_model_monitor.py b/tests/integ/test_model_monitor.py index 2b12ee567c..892e5081a1 100644 --- a/tests/integ/test_model_monitor.py +++ b/tests/integ/test_model_monitor.py @@ -220,9 +220,10 @@ def byoc_monitoring_schedule_name(sagemaker_session, output_kms_key, volume_kms_ @pytest.fixture(scope="module") def volume_kms_key(sagemaker_session): + role_arn = sagemaker_session.expand_role(ROLE) return get_or_create_kms_key( sagemaker_session=sagemaker_session, - role_arn=ROLE, + role_arn=role_arn, alias="integ-test-processing-volume-kms-key-{}".format( sagemaker_session.boto_session.region_name ), @@ -231,9 +232,10 @@ def volume_kms_key(sagemaker_session): @pytest.fixture(scope="module") def output_kms_key(sagemaker_session): + role_arn = sagemaker_session.expand_role(ROLE) return get_or_create_kms_key( sagemaker_session=sagemaker_session, - role_arn=ROLE, + role_arn=role_arn, alias="integ-test-processing-output-kms-key-{}".format( sagemaker_session.boto_session.region_name ), From cd0126b86704328d3d0dfc804350a6a0fe50b3c7 Mon Sep 17 00:00:00 2001 From: Lauren Yu <6631887+laurenyu@users.noreply.github.com> Date: Fri, 6 Dec 2019 14:08:31 -0800 Subject: [PATCH 07/11] fix integ tests --- tests/integ/test_model_monitor.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/integ/test_model_monitor.py b/tests/integ/test_model_monitor.py index 892e5081a1..1a0b7b2ba1 100644 --- a/tests/integ/test_model_monitor.py +++ b/tests/integ/test_model_monitor.py @@ -244,9 +244,10 @@ def output_kms_key(sagemaker_session): @pytest.fixture(scope="module") def updated_volume_kms_key(sagemaker_session): + role_arn = sagemaker_session.expand_role(ROLE) return get_or_create_kms_key( sagemaker_session=sagemaker_session, - role_arn=ROLE, + role_arn=role_arn, alias="integ-test-processing-volume-kms-key-updated-{}".format( sagemaker_session.boto_session.region_name ), @@ -255,9 +256,10 @@ def updated_volume_kms_key(sagemaker_session): @pytest.fixture(scope="module") def updated_output_kms_key(sagemaker_session): + role_arn = sagemaker_session.expand_role(ROLE) return get_or_create_kms_key( sagemaker_session=sagemaker_session, - role_arn=ROLE, + role_arn=role_arn, alias="integ-test-processing-output-kms-key-updated-{}".format( sagemaker_session.boto_session.region_name ), From 7e5eb8933d69c822b7299cd851620a94ff6f7550 Mon Sep 17 00:00:00 2001 From: Lauren Yu <6631887+laurenyu@users.noreply.github.com> Date: Fri, 6 Dec 2019 15:21:47 -0800 Subject: [PATCH 08/11] fix a couple more spots --- src/sagemaker/model_monitor/model_monitoring.py | 12 ++++++------ tests/integ/test_model_monitor.py | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/sagemaker/model_monitor/model_monitoring.py b/src/sagemaker/model_monitor/model_monitoring.py index fae42d2777..0e609376d7 100644 --- a/src/sagemaker/model_monitor/model_monitoring.py +++ b/src/sagemaker/model_monitor/model_monitoring.py @@ -324,7 +324,7 @@ def create_monitoring_schedule( max_runtime_in_seconds=self.max_runtime_in_seconds, environment=self.env, network_config=network_config_dict, - role_arn=self.role, + role_arn=self.sagemaker_session.expand_role(self.role), tags=self.tags, ) @@ -445,7 +445,7 @@ def update_monitoring_schedule( self.network_config = network_config if role is not None: - self.role = self.sagemaker_session.expand_role(role) + self.role = role if image_uri is not None: self.image_uri = image_uri @@ -471,7 +471,7 @@ def update_monitoring_schedule( max_runtime_in_seconds=max_runtime_in_seconds, environment=env, network_config=network_config_dict, - role_arn=role, + role_arn=self.sagemaker_session.expand_role(role), ) self._wait_for_schedule_changes_to_apply() @@ -1285,7 +1285,7 @@ def create_monitoring_schedule( max_runtime_in_seconds=self.max_runtime_in_seconds, environment=normalized_env, network_config=network_config_dict, - role_arn=self.role, + role_arn=self.sagemaker_session.expand_role(self.role), tags=self.tags, ) @@ -1424,7 +1424,7 @@ def update_monitoring_schedule( network_config_dict = self.network_config._to_request_dict() if role is not None: - self.role = self.sagemaker_session.expand_role(role) + self.role = role self.sagemaker_session.update_monitoring_schedule( monitoring_schedule_name=self.monitoring_schedule_name, @@ -1442,7 +1442,7 @@ def update_monitoring_schedule( max_runtime_in_seconds=max_runtime_in_seconds, environment=normalized_env, network_config=network_config_dict, - role_arn=role, + role_arn=self.sagemaker_session.expand_role(role), ) self._wait_for_schedule_changes_to_apply() diff --git a/tests/integ/test_model_monitor.py b/tests/integ/test_model_monitor.py index 1a0b7b2ba1..b429626eb5 100644 --- a/tests/integ/test_model_monitor.py +++ b/tests/integ/test_model_monitor.py @@ -319,7 +319,7 @@ def test_default_monitor_suggest_baseline_and_create_monitoring_schedule_with_cu == volume_kms_key ) assert DEFAULT_IMAGE_SUFFIX in baselining_job_description["AppSpecification"]["ImageUri"] - assert baselining_job_description["RoleArn"] == ROLE + assert ROLE in baselining_job_description["RoleArn"] assert ( baselining_job_description["ProcessingInputs"][0]["InputName"] == "baseline_dataset_input" ) @@ -496,7 +496,7 @@ def test_default_monitor_suggest_baseline_and_create_monitoring_schedule_without is None ) assert DEFAULT_IMAGE_SUFFIX in baselining_job_description["AppSpecification"]["ImageUri"] - assert baselining_job_description["RoleArn"] == ROLE + assert ROLE in baselining_job_description["RoleArn"] assert ( baselining_job_description["ProcessingInputs"][0]["InputName"] == "baseline_dataset_input" ) @@ -1528,7 +1528,7 @@ def test_byoc_monitor_suggest_baseline_and_create_monitoring_schedule_with_custo == volume_kms_key ) assert DEFAULT_IMAGE_SUFFIX in baselining_job_description["AppSpecification"]["ImageUri"] - assert baselining_job_description["RoleArn"] == ROLE + assert ROLE in baselining_job_description["RoleArn"] assert baselining_job_description["ProcessingInputs"][0]["InputName"] == "input-1" assert ( baselining_job_description["ProcessingOutputConfig"]["Outputs"][0]["OutputName"] @@ -1727,7 +1727,7 @@ def test_byoc_monitor_suggest_baseline_and_create_monitoring_schedule_without_cu is None ) assert DEFAULT_IMAGE_SUFFIX in baselining_job_description["AppSpecification"]["ImageUri"] - assert baselining_job_description["RoleArn"] == ROLE + assert ROLE in baselining_job_description["RoleArn"] assert baselining_job_description["ProcessingInputs"][0]["InputName"] == "input-1" assert ( baselining_job_description["ProcessingOutputConfig"]["Outputs"][0]["OutputName"] @@ -2185,7 +2185,7 @@ def test_byoc_monitor_attach_followed_by_baseline_and_update_monitoring_schedule == volume_kms_key ) assert DEFAULT_IMAGE_SUFFIX in baselining_job_description["AppSpecification"]["ImageUri"] - assert baselining_job_description["RoleArn"] == ROLE + assert ROLE in baselining_job_description["RoleArn"] assert baselining_job_description["ProcessingInputs"][0]["InputName"] == "input-1" assert ( baselining_job_description["ProcessingOutputConfig"]["Outputs"][0]["OutputName"] From 7d46f6edf021334e8388d796cf2080037c7d18ab Mon Sep 17 00:00:00 2001 From: Lauren Yu <6631887+laurenyu@users.noreply.github.com> Date: Sat, 7 Dec 2019 22:06:31 -0800 Subject: [PATCH 09/11] fix cron expression --- src/sagemaker/model_monitor/model_monitoring.py | 8 ++++---- tests/integ/test_model_monitor.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/sagemaker/model_monitor/model_monitoring.py b/src/sagemaker/model_monitor/model_monitoring.py index 0e609376d7..f39082b8a1 100644 --- a/src/sagemaker/model_monitor/model_monitoring.py +++ b/src/sagemaker/model_monitor/model_monitoring.py @@ -445,7 +445,7 @@ def update_monitoring_schedule( self.network_config = network_config if role is not None: - self.role = role + self.role = self.sagemaker_session.expand_role(role) if image_uri is not None: self.image_uri = image_uri @@ -471,7 +471,7 @@ def update_monitoring_schedule( max_runtime_in_seconds=max_runtime_in_seconds, environment=env, network_config=network_config_dict, - role_arn=self.sagemaker_session.expand_role(role), + role_arn=role, ) self._wait_for_schedule_changes_to_apply() @@ -1424,7 +1424,7 @@ def update_monitoring_schedule( network_config_dict = self.network_config._to_request_dict() if role is not None: - self.role = role + self.role = self.sagemaker_session.expand_role(role) self.sagemaker_session.update_monitoring_schedule( monitoring_schedule_name=self.monitoring_schedule_name, @@ -1442,7 +1442,7 @@ def update_monitoring_schedule( max_runtime_in_seconds=max_runtime_in_seconds, environment=normalized_env, network_config=network_config_dict, - role_arn=self.sagemaker_session.expand_role(role), + role_arn=role, ) self._wait_for_schedule_changes_to_apply() diff --git a/tests/integ/test_model_monitor.py b/tests/integ/test_model_monitor.py index b429626eb5..1e6e116309 100644 --- a/tests/integ/test_model_monitor.py +++ b/tests/integ/test_model_monitor.py @@ -84,7 +84,7 @@ INTEG_TEST_MONITORING_OUTPUT_BUCKET = "integ-test-monitoring-output-bucket" -FIVE_MINUTE_CRON_EXPRESSION = "cron(0/5 * ? * * *)" +FIVE_MINUTE_CRON_EXPRESSION = "cron(0 0/5 * ? * * *)" @pytest.fixture(scope="module") From e200bb3d4a49b26481eb05d2d4b1fad4d12f0d49 Mon Sep 17 00:00:00 2001 From: Lauren Yu <6631887+laurenyu@users.noreply.github.com> Date: Sat, 7 Dec 2019 22:40:03 -0800 Subject: [PATCH 10/11] fix logic and try new cron expression --- src/sagemaker/model_monitor/model_monitoring.py | 4 ++-- tests/integ/test_model_monitor.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sagemaker/model_monitor/model_monitoring.py b/src/sagemaker/model_monitor/model_monitoring.py index f39082b8a1..dbf07a6daf 100644 --- a/src/sagemaker/model_monitor/model_monitoring.py +++ b/src/sagemaker/model_monitor/model_monitoring.py @@ -471,7 +471,7 @@ def update_monitoring_schedule( max_runtime_in_seconds=max_runtime_in_seconds, environment=env, network_config=network_config_dict, - role_arn=role, + role_arn=self.role, ) self._wait_for_schedule_changes_to_apply() @@ -1442,7 +1442,7 @@ def update_monitoring_schedule( max_runtime_in_seconds=max_runtime_in_seconds, environment=normalized_env, network_config=network_config_dict, - role_arn=role, + role_arn=self.role, ) self._wait_for_schedule_changes_to_apply() diff --git a/tests/integ/test_model_monitor.py b/tests/integ/test_model_monitor.py index 1e6e116309..2a90ebf262 100644 --- a/tests/integ/test_model_monitor.py +++ b/tests/integ/test_model_monitor.py @@ -84,7 +84,7 @@ INTEG_TEST_MONITORING_OUTPUT_BUCKET = "integ-test-monitoring-output-bucket" -FIVE_MINUTE_CRON_EXPRESSION = "cron(0 0/5 * ? * * *)" +FIVE_MINUTE_CRON_EXPRESSION = "cron(0 5 * ? * *)" @pytest.fixture(scope="module") From b2bf2565405a7b44994dd3cf2cd8ef4eb91a3f18 Mon Sep 17 00:00:00 2001 From: Lauren Yu <6631887+laurenyu@users.noreply.github.com> Date: Mon, 9 Dec 2019 11:02:09 -0800 Subject: [PATCH 11/11] try again --- src/sagemaker/model_monitor/model_monitoring.py | 8 ++++---- tests/integ/test_model_monitor.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/sagemaker/model_monitor/model_monitoring.py b/src/sagemaker/model_monitor/model_monitoring.py index dbf07a6daf..92d3ea673c 100644 --- a/src/sagemaker/model_monitor/model_monitoring.py +++ b/src/sagemaker/model_monitor/model_monitoring.py @@ -445,7 +445,7 @@ def update_monitoring_schedule( self.network_config = network_config if role is not None: - self.role = self.sagemaker_session.expand_role(role) + self.role = role if image_uri is not None: self.image_uri = image_uri @@ -471,7 +471,7 @@ def update_monitoring_schedule( max_runtime_in_seconds=max_runtime_in_seconds, environment=env, network_config=network_config_dict, - role_arn=self.role, + role_arn=self.sagemaker_session.expand_role(self.role), ) self._wait_for_schedule_changes_to_apply() @@ -1424,7 +1424,7 @@ def update_monitoring_schedule( network_config_dict = self.network_config._to_request_dict() if role is not None: - self.role = self.sagemaker_session.expand_role(role) + self.role = role self.sagemaker_session.update_monitoring_schedule( monitoring_schedule_name=self.monitoring_schedule_name, @@ -1442,7 +1442,7 @@ def update_monitoring_schedule( max_runtime_in_seconds=max_runtime_in_seconds, environment=normalized_env, network_config=network_config_dict, - role_arn=self.role, + role_arn=self.sagemaker_session.expand_role(self.role), ) self._wait_for_schedule_changes_to_apply() diff --git a/tests/integ/test_model_monitor.py b/tests/integ/test_model_monitor.py index 2a90ebf262..b429626eb5 100644 --- a/tests/integ/test_model_monitor.py +++ b/tests/integ/test_model_monitor.py @@ -84,7 +84,7 @@ INTEG_TEST_MONITORING_OUTPUT_BUCKET = "integ-test-monitoring-output-bucket" -FIVE_MINUTE_CRON_EXPRESSION = "cron(0 5 * ? * *)" +FIVE_MINUTE_CRON_EXPRESSION = "cron(0/5 * ? * * *)" @pytest.fixture(scope="module")