Skip to content

Commit 7720bc7

Browse files
committed
feature: adding resourcekey and tags for api in config for intelligent defaults
Adding ResourceKey to the Config schema for the createEdgePackaging Job API Adding a new entry into the Config Schema for CreateEndpoint API with the addition of tags attribute
1 parent 42298df commit 7720bc7

File tree

7 files changed

+335
-120
lines changed

7 files changed

+335
-120
lines changed

src/sagemaker/config/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
COMPILATION_JOB_VPC_CONFIG_PATH,
4646
COMPILATION_JOB,
4747
EDGE_PACKAGING_ROLE_ARN_PATH,
48+
EDGE_PACKAGING_RESOURCE_KEY_PATH,
4849
EDGE_PACKAGING_OUTPUT_CONFIG_PATH,
4950
EDGE_PACKAGING_JOB,
5051
TRANSFORM_JOB,
@@ -62,10 +63,13 @@
6263
MODEL_PACKAGE_VALIDATION_PROFILES_PATH,
6364
ENDPOINT_CONFIG_PRODUCTION_VARIANTS_PATH,
6465
KMS_KEY_ID,
66+
RESOURCE_KEY,
6567
ENDPOINT_CONFIG_KMS_KEY_ID_PATH,
6668
ENDPOINT_CONFIG,
6769
ENDPOINT_CONFIG_DATA_CAPTURE_PATH,
6870
ENDPOINT_CONFIG_ASYNC_INFERENCE_PATH,
71+
ENDPOINT,
72+
ENDPOINT_TAGS_PATH,
6973
SAGEMAKER,
7074
FEATURE_GROUP,
7175
TAGS,

src/sagemaker/config/config_schema.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
ENABLE_NETWORK_ISOLATION = "EnableNetworkIsolation"
1919
VOLUME_KMS_KEY_ID = "VolumeKmsKeyId"
2020
KMS_KEY_ID = "KmsKeyId"
21+
RESOURCE_KEY = "ResourceKey"
2122
ROLE_ARN = "RoleArn"
2223
TAGS = "Tags"
2324
KEY = "Key"
@@ -78,6 +79,7 @@
7879
MODEL = "Model"
7980
MONITORING_SCHEDULE = "MonitoringSchedule"
8081
ENDPOINT_CONFIG = "EndpointConfig"
82+
ENDPOINT = "Endpoint"
8183
AUTO_ML_JOB = "AutoMLJob"
8284
COMPILATION_JOB = "CompilationJob"
8385
CUSTOM_PARAMETERS = "CustomParameters"
@@ -126,6 +128,7 @@ def _simple_path(*args: str):
126128
)
127129
EDGE_PACKAGING_OUTPUT_CONFIG_PATH = _simple_path(SAGEMAKER, EDGE_PACKAGING_JOB, OUTPUT_CONFIG)
128130
EDGE_PACKAGING_ROLE_ARN_PATH = _simple_path(SAGEMAKER, EDGE_PACKAGING_JOB, ROLE_ARN)
131+
EDGE_PACKAGING_RESOURCE_KEY_PATH = _simple_path(SAGEMAKER, EDGE_PACKAGING_JOB, RESOURCE_KEY)
129132
ENDPOINT_CONFIG_DATA_CAPTURE_KMS_KEY_ID_PATH = _simple_path(
130133
SAGEMAKER, ENDPOINT_CONFIG, DATA_CAPTURE_CONFIG, KMS_KEY_ID
131134
)
@@ -140,6 +143,7 @@ def _simple_path(*args: str):
140143
SAGEMAKER, ENDPOINT_CONFIG, ASYNC_INFERENCE_CONFIG, OUTPUT_CONFIG, KMS_KEY_ID
141144
)
142145
ENDPOINT_CONFIG_KMS_KEY_ID_PATH = _simple_path(SAGEMAKER, ENDPOINT_CONFIG, KMS_KEY_ID)
146+
ENDPOINT_TAGS_PATH = _simple_path(SAGEMAKER, ENDPOINT, TAGS)
143147
FEATURE_GROUP_ONLINE_STORE_CONFIG_PATH = _simple_path(SAGEMAKER, FEATURE_GROUP, ONLINE_STORE_CONFIG)
144148
FEATURE_GROUP_OFFLINE_STORE_CONFIG_PATH = _simple_path(
145149
SAGEMAKER, FEATURE_GROUP, OFFLINE_STORE_CONFIG
@@ -636,6 +640,15 @@ def _simple_path(*args: str):
636640
TAGS: {"$ref": "#/definitions/tags"},
637641
},
638642
},
643+
# Endpoint
644+
# https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEndpoint.html
645+
ENDPOINT: {
646+
TYPE: OBJECT,
647+
ADDITIONAL_PROPERTIES: False,
648+
PROPERTIES: {
649+
TAGS: {"$ref": "#/definitions/tags"}
650+
}
651+
},
639652
# Endpoint Config
640653
# https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEndpointConfig.html
641654
# Note: there is a separate API for creating Endpoints.
@@ -863,6 +876,7 @@ def _simple_path(*args: str):
863876
ADDITIONAL_PROPERTIES: False,
864877
PROPERTIES: {KMS_KEY_ID: {"$ref": "#/definitions/kmsKeyId"}},
865878
},
879+
RESOURCE_KEY: {"$ref": "#/definitions/kmsKeyId"},
866880
ROLE_ARN: {"$ref": "#/definitions/roleArn"},
867881
TAGS: {"$ref": "#/definitions/tags"},
868882
},

src/sagemaker/model.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
COMPILATION_JOB_ROLE_ARN_PATH,
3434
EDGE_PACKAGING_KMS_KEY_ID_PATH,
3535
EDGE_PACKAGING_ROLE_ARN_PATH,
36+
EDGE_PACKAGING_RESOURCE_KEY_PATH,
3637
MODEL_VPC_CONFIG_PATH,
3738
MODEL_ENABLE_NETWORK_ISOLATION_PATH,
3839
MODEL_EXECUTION_ROLE_ARN_PATH,
@@ -945,6 +946,7 @@ def package_for_edge(
945946
role = resolve_value_from_config(
946947
role, EDGE_PACKAGING_ROLE_ARN_PATH, sagemaker_session=self.sagemaker_session
947948
)
949+
resource_key = resolve_value_from_config(resource_key, EDGE_PACKAGING_RESOURCE_KEY_PATH, sagemaker_session=self)
948950
if role is not None:
949951
role = self.sagemaker_session.expand_role(role)
950952
config = self._edge_packaging_job_config(

src/sagemaker/session.py

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
COMPILATION_JOB,
6868
EDGE_PACKAGING_ROLE_ARN_PATH,
6969
EDGE_PACKAGING_OUTPUT_CONFIG_PATH,
70+
EDGE_PACKAGING_RESOURCE_KEY_PATH,
7071
EDGE_PACKAGING_JOB,
7172
TRANSFORM_JOB,
7273
TRANSFORM_JOB_KMS_KEY_ID_PATH,
@@ -87,6 +88,7 @@
8788
ENDPOINT_CONFIG,
8889
ENDPOINT_CONFIG_DATA_CAPTURE_PATH,
8990
ENDPOINT_CONFIG_ASYNC_INFERENCE_PATH,
91+
ENDPOINT_TAGS_PATH,
9092
SAGEMAKER,
9193
FEATURE_GROUP,
9294
TAGS,
@@ -2475,6 +2477,7 @@ def package_model_for_edge(
24752477
"EdgePackagingJobName": job_name,
24762478
"CompilationJobName": compilation_job_name,
24772479
}
2480+
resource_key = resolve_value_from_config(resource_key, EDGE_PACKAGING_RESOURCE_KEY_PATH, sagemaker_session=self)
24782481
tags = _append_project_tags(tags)
24792482
tags = self._append_sagemaker_config_tags(
24802483
tags, "{}.{}.{}".format(SAGEMAKER, EDGE_PACKAGING_JOB, TAGS)
@@ -3954,6 +3957,8 @@ def create_endpoint(self, endpoint_name, config_name, tags=None, wait=True):
39543957
config_name (str): Name of the Amazon SageMaker endpoint configuration to deploy.
39553958
wait (bool): Whether to wait for the endpoint deployment to complete before returning
39563959
(default: True).
3960+
tags (list[dict[str, str]]): A list of key-value pairs for tagging the endpoint
3961+
(default: None).
39573962
39583963
Returns:
39593964
str: Name of the Amazon SageMaker ``Endpoint`` created.
@@ -3962,6 +3967,9 @@ def create_endpoint(self, endpoint_name, config_name, tags=None, wait=True):
39623967

39633968
tags = tags or []
39643969
tags = _append_project_tags(tags)
3970+
tags = self._append_sagemaker_config_tags(
3971+
tags, "{}.{}.{}".format(SAGEMAKER, ENDPOINT_TAGS_PATH, TAGS)
3972+
)
39653973

39663974
self.sagemaker_client.create_endpoint(
39673975
EndpointName=endpoint_name, EndpointConfigName=config_name, Tags=tags
@@ -4417,6 +4425,7 @@ def endpoint_from_model_data(
44174425
model_vpc_config=None,
44184426
accelerator_type=None,
44194427
data_capture_config=None,
4428+
tags=None,
44204429
):
44214430
"""Create and deploy to an ``Endpoint`` using existing model data stored in S3.
44224431
@@ -4448,14 +4457,23 @@ def endpoint_from_model_data(
44484457
data_capture_config (sagemaker.model_monitor.DataCaptureConfig): Specifies
44494458
configuration related to Endpoint data capture for use with
44504459
Amazon SageMaker Model Monitoring. Default: None.
4460+
tags (list[dict[str, str]]): A list of key-value pairs for tagging the endpoint
4461+
(default: None).
44514462
44524463
Returns:
44534464
str: Name of the ``Endpoint`` that is created.
44544465
"""
44554466
model_environment_vars = model_environment_vars or {}
44564467
name = name or name_from_image(image_uri)
44574468
model_vpc_config = vpc_utils.sanitize(model_vpc_config)
4458-
4469+
endpoint_config_tags = _append_project_tags(tags)
4470+
endpoint_tags = _append_project_tags(tags)
4471+
endpoint_tags = self._append_sagemaker_config_tags(
4472+
endpoint_tags, "{}.{}.{}".format(SAGEMAKER, ENDPOINT_TAGS_PATH, TAGS)
4473+
)
4474+
endpoint_config_tags = self._append_sagemaker_config_tags(
4475+
endpoint_config_tags, "{}.{}.{}".format(SAGEMAKER, ENDPOINT_CONFIG, TAGS)
4476+
)
44594477
primary_container = container_def(
44604478
image_uri=image_uri,
44614479
model_data_url=model_s3_location,
@@ -4478,12 +4496,13 @@ def endpoint_from_model_data(
44784496
instance_type=instance_type,
44794497
accelerator_type=accelerator_type,
44804498
data_capture_config_dict=data_capture_config_dict,
4499+
tags=endpoint_config_tags
44814500
)
44824501
)
44834502

44844503
# to make change backwards compatible
44854504
response = _create_resource(
4486-
lambda: self.create_endpoint(endpoint_name=name, config_name=name, wait=wait)
4505+
lambda: self.create_endpoint(endpoint_name=name, config_name=name, Tags=endpoint_tags, wait=wait)
44874506
)
44884507
if not response:
44894508
raise ValueError(
@@ -4548,12 +4567,18 @@ def endpoint_from_production_variants(
45484567
if supports_kms
45494568
else kms_key
45504569
)
4551-
tags = _append_project_tags(tags)
4552-
tags = self._append_sagemaker_config_tags(
4553-
tags, "{}.{}.{}".format(SAGEMAKER, ENDPOINT_CONFIG, TAGS)
4570+
4571+
endpoint_config_tags = _append_project_tags(tags)
4572+
endpoint_tags = _append_project_tags(tags)
4573+
4574+
endpoint_tags = self._append_sagemaker_config_tags(
4575+
endpoint_tags, "{}.{}.{}".format(SAGEMAKER, ENDPOINT_TAGS_PATH, TAGS)
45544576
)
4555-
if tags:
4556-
config_options["Tags"] = tags
4577+
endpoint_config_tags = self._append_sagemaker_config_tags(
4578+
endpoint_config_tags, "{}.{}.{}".format(SAGEMAKER, ENDPOINT_CONFIG, TAGS)
4579+
)
4580+
if endpoint_config_tags:
4581+
config_options["Tags"] = endpoint_config_tags
45574582
if kms_key:
45584583
config_options["KmsKeyId"] = kms_key
45594584
if data_capture_config_dict is not None:
@@ -4574,7 +4599,7 @@ def endpoint_from_production_variants(
45744599
LOGGER.info("Creating endpoint-config with name %s", name)
45754600
self.sagemaker_client.create_endpoint_config(**config_options)
45764601

4577-
return self.create_endpoint(endpoint_name=name, config_name=name, tags=tags, wait=wait)
4602+
return self.create_endpoint(endpoint_name=name, config_name=name, tags=endpoint_tags, wait=wait)
45784603

45794604
def expand_role(self, role):
45804605
"""Expand an IAM role name into an ARN.

tests/data/config/config.yaml

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ SageMaker:
5050
Subnets:
5151
- 'subnet-1234'
5252
RoleArn: 'arn:aws:iam::555555555555:role/IMRole'
53+
Endpoint:
54+
Tags:
55+
- Key: "tag1"
56+
Value: "tagValue1"
5357
EndpointConfig:
5458
AsyncInferenceConfig:
5559
OutputConfig:
@@ -143,4 +147,28 @@ SageMaker:
143147
EdgePackagingJob:
144148
OutputConfig:
145149
KmsKeyId: 'kmskeyid1'
146-
RoleArn: 'arn:aws:iam::555555555555:role/IMRole'
150+
RoleArn: 'arn:aws:iam::555555555555:role/IMRole'
151+
ResourceKey: 'kmskeyid1'
152+
PythonSDK:
153+
Modules:
154+
RemoteFunction:
155+
Dependencies: "./requirements.txt"
156+
EnvironmentVariables:
157+
"var1": "value1"
158+
"var2": "value2"
159+
ImageUri: "123456789012.dkr.ecr.us-west-2.amazonaws.com/myimage:latest"
160+
IncludeLocalWorkDir: true
161+
InstanceType: "ml.m5.xlarge"
162+
JobCondaEnvironment: "some_conda_env"
163+
RoleArn: "arn:aws:iam::555555555555:role/IMRole"
164+
S3KmsKeyId: "kmskeyid1"
165+
S3RootUri: "s3://my-bucket/key"
166+
Tags:
167+
- Key: "tag1"
168+
Value: "tagValue1"
169+
VolumeKmsKeyId: "kmskeyid2"
170+
VpcConfig:
171+
SecurityGroupIds:
172+
- 'sg123'
173+
Subnets:
174+
- 'subnet-1234'

tests/unit/__init__.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
COMPILATION_JOB,
4040
OUTPUT_CONFIG,
4141
EDGE_PACKAGING_JOB,
42+
RESOURCE_KEY,
43+
ENDPOINT,
4244
ENDPOINT_CONFIG,
4345
DATA_CAPTURE_CONFIG,
4446
PRODUCTION_VARIANTS,
@@ -140,6 +142,7 @@
140142
OUTPUT_CONFIG: {
141143
KMS_KEY_ID: "configKmsKeyId",
142144
},
145+
RESOURCE_KEY: "kmskeyid1",
143146
ROLE_ARN: "arn:aws:iam::111111111111:role/ConfigRole",
144147
TAGS: [{KEY: "some-tag", VALUE: "value-for-tag"}],
145148
},
@@ -168,6 +171,15 @@
168171
},
169172
}
170173

174+
SAGEMAKER_CONFIG_ENDPOINT = {
175+
SCHEMA_VERSION: "1.0",
176+
SAGEMAKER: {
177+
ENDPOINT: {
178+
TAGS: [{KEY: "some-tag", VALUE: "value-for-tag"}],
179+
}
180+
}
181+
}
182+
171183
SAGEMAKER_CONFIG_AUTO_ML = {
172184
SCHEMA_VERSION: "1.0",
173185
SAGEMAKER: {

0 commit comments

Comments
 (0)