in auto-model-deploy/app.py [0:0]
def __init__(self, app: core.App, id: str) -> None:
super().__init__(app, id)
input_bucket = s3.Bucket(self, id='inputs')
output_bucket = s3.Bucket(self, id='outputs')
## Permissions for SageMaker to access S3 buckets in account
sagemaker_role = iam.Role(self, 'automodeldeploy-sagemaker-role',
assumed_by=iam.ServicePrincipal('sagemaker.amazonaws.com'))
sagemaker_role.add_managed_policy(iam.ManagedPolicy.from_aws_managed_policy_name('AmazonSageMakerFullAccess'))
sagemaker_role.add_to_policy(iam.PolicyStatement(
resources=['arn:aws:s3:::*'],
actions=['s3:GetObject',
's3:PutObject',
's3:DeleteObject',
's3:ListBucket']))
# Lambda Fn to create SageMaker endpoint when a new json file is uploaded
# JSON specifies the details of the endpoint
# TODO: consider using a zip package for this function if it grows > 4kB
with open('lambda/deploy-model.py', encoding='utf8') as fp:
lambda_code = fp.read()
deploy_model_fn = serverless.Function(self,
id='deploy-model',
description='Creates SageMaker Endpoint based on S3 Object Trigger',
code=serverless.InlineCode(lambda_code),
handler='index.lambda_handler',
timeout=core.Duration.seconds(300),
runtime=serverless.Runtime.PYTHON_3_7,
environment={
'sagemaker_role': sagemaker_role.role_arn
})
deploy_model_fn.add_to_role_policy(iam.PolicyStatement(
actions=['sagemaker:CreateModel',
'sagemaker:DeleteModel',
'sagemaker:CreateEndpoint',
'sagemaker:DeleteEndpoint',
'sagemaker:DescribeEndpoint',
'sagemaker:CreateEndpointConfig',
'sagemaker:DeleteEndpointConfig'],
resources=['*']))
# Allows Lambda function to pass role to SageMaker
deploy_model_fn.add_to_role_policy(iam.PolicyStatement(
actions=['iam:PassRole'],
resources=['*']))
deploy_model_fn.add_event_source(S3EventSource(bucket=input_bucket,
events=[s3.EventType.OBJECT_CREATED],
filters=[{
'suffix': 'json'
}]))
input_bucket.grant_read_write(deploy_model_fn,'*')
# Lambda that is triggered when Sagemaker endpoint status changes
with open('lambda/check-status.py', encoding='utf8') as fp:
lambda_code = fp.read()
check_status_fn = serverless.Function(self,
id='check-status',
description='Checks on SageMaker Endpoint Status based on Cloudwatch Trigger',
code=serverless.InlineCode(lambda_code),
handler='index.lambda_handler',
timeout=core.Duration.seconds(300),
runtime=serverless.Runtime.PYTHON_3_7)
# CloudWatch rule to trigger check status fn
event_pattern = events.EventPattern(source=['aws.sagemaker'],
detail_type=['SageMaker Endpoint State Change'])
rule = events.Rule(self, 'sagemaker-endpoint-state',
description='Detects when SageMaker Endpoint State Changes',
enabled=True,
event_pattern=event_pattern)
rule.add_target(targets.LambdaFunction(check_status_fn))