From fa242fdee40c564bd3c9a5db3f506005399bd5d2 Mon Sep 17 00:00:00 2001 From: mahesh-balumuri <650714+mahesh-balumuri@users.noreply.github.com> Date: Tue, 27 Feb 2024 13:55:12 +0530 Subject: [PATCH 1/7] Role assume update --- scripts/role_assume_update.py | 51 +++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 scripts/role_assume_update.py diff --git a/scripts/role_assume_update.py b/scripts/role_assume_update.py new file mode 100644 index 00000000..e2cc991d --- /dev/null +++ b/scripts/role_assume_update.py @@ -0,0 +1,51 @@ +import json +import sys + +import boto3 + +iam = boto3.client("iam") +ROLE_ARN = sys.argv[1] +ROLE_NAME = "seedfarmer-addf-toolchain-role" + + +trusted_principals = iam.get_role(RoleName=ROLE_NAME)["Role"][ + "AssumeRolePolicyDocument" +]["Statement"][0]["Principal"]["AWS"] +if type(trusted_principals) is not list: + trusted_principals = [trusted_principals] + print( + f"Current principals in assume role policy for {ROLE_NAME}: {trusted_principals}" + ) + +principals = [] +for principal in trusted_principals: + if "arn:" not in principal: + print(f"Removing non-existent principal: {principal}") + else: + principals.append(principal) + +if ROLE_ARN not in principals: + print(f"{ROLE_ARN} not in trusted principals list and will be added.") + principals.append(ROLE_ARN) + +policy_document = json.dumps( + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": {"AWS": principals}, + "Action": ["sts:AssumeRole"], + } + ], + } +) +try: + response = iam.update_assume_role_policy( + RoleName=ROLE_NAME, + PolicyDocument=policy_document, + ) + print("Success") +except Exception as e: + print(f"issue updating assume role policy document: {e}") + raise e From 96709761c0c7f85fa1365eb96d11c28b3ff5f7a6 Mon Sep 17 00:00:00 2001 From: mahesh-balumuri <650714+mahesh-balumuri@users.noreply.github.com> Date: Tue, 27 Feb 2024 19:40:51 +0530 Subject: [PATCH 2/7] Add files via upload --- scripts/role_assume_update.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/role_assume_update.py b/scripts/role_assume_update.py index e2cc991d..8ba52c68 100644 --- a/scripts/role_assume_update.py +++ b/scripts/role_assume_update.py @@ -5,7 +5,7 @@ iam = boto3.client("iam") ROLE_ARN = sys.argv[1] -ROLE_NAME = "seedfarmer-addf-toolchain-role" +ROLE_NAME = "seedfarmer-mlops-toolchain-role" trusted_principals = iam.get_role(RoleName=ROLE_NAME)["Role"][ From a242817cec956e3173ca4c61a04f2545ba89fb91 Mon Sep 17 00:00:00 2001 From: Mahesh Balumuri Date: Wed, 28 Feb 2024 18:13:39 +0530 Subject: [PATCH 3/7] Updated region --- manifests/deployment.yaml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/manifests/deployment.yaml b/manifests/deployment.yaml index 33946fb4..a036ca2b 100644 --- a/manifests/deployment.yaml +++ b/manifests/deployment.yaml @@ -1,5 +1,7 @@ name: mlops -toolchainRegion: us-east-1 +toolchainRegion: + valueFrom: + envVariable: AWS_REGION forceDependencyRedeploy: true groups: - name: networking @@ -19,5 +21,7 @@ targetAccountMappings: envVariable: PRIMARY_ACCOUNT default: true regionMappings: - - region: us-east-1 + - region: + valueFrom: + envVariable: AWS_REGION default: true From c3051415b0d154d7ef622509c65a2e1bed37611d Mon Sep 17 00:00:00 2001 From: Mahesh Balumuri Date: Wed, 28 Feb 2024 19:02:46 +0530 Subject: [PATCH 4/7] Added manifest updated script --- manifests/deployment.yaml | 8 ++------ scripts/manifest-update.py | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 scripts/manifest-update.py diff --git a/manifests/deployment.yaml b/manifests/deployment.yaml index a036ca2b..33946fb4 100644 --- a/manifests/deployment.yaml +++ b/manifests/deployment.yaml @@ -1,7 +1,5 @@ name: mlops -toolchainRegion: - valueFrom: - envVariable: AWS_REGION +toolchainRegion: us-east-1 forceDependencyRedeploy: true groups: - name: networking @@ -21,7 +19,5 @@ targetAccountMappings: envVariable: PRIMARY_ACCOUNT default: true regionMappings: - - region: - valueFrom: - envVariable: AWS_REGION + - region: us-east-1 default: true diff --git a/scripts/manifest-update.py b/scripts/manifest-update.py new file mode 100644 index 00000000..91935ef3 --- /dev/null +++ b/scripts/manifest-update.py @@ -0,0 +1,27 @@ +import sys + +import yaml + +if len(sys.argv) != 5: + print( + "Usage: python manifest-update.py [MANIFEST PATH][TOOLCHAIN REGION] [TARGET REGION] [TARGET ACCOUNT]" + ) + exit(1) + +manifest_path = sys.argv[1] +toolchain_region = sys.argv[2] +target_region = sys.argv[3] +target_account = sys.argv[4] +with open(manifest_path, "r") as file: + data = yaml.safe_load(file) + +data["toolchainRegion"] = toolchain_region +data["targetAccountMappings"][0]["accountId"] = target_account +data["targetAccountMappings"][0]["regionMappings"][0]["region"] = target_region + +with open("deployment.yaml", "w") as file: + yaml.dump(data, file) + +print( + f"manifest has been updated and seedfarmer will deploy the following: \n{open('deployment.yaml').read()}" +) From c58fce1a37d99d6e3fbdbaff751ca1b58f4a289f Mon Sep 17 00:00:00 2001 From: Mahesh Balumuri Date: Wed, 28 Feb 2024 20:32:46 +0530 Subject: [PATCH 5/7] Added oneclick launch CFN template --- one-click-launch.yaml | 475 +++++++++++++++++++++++++++++++++++++ scripts/manifest-update.py | 27 --- 2 files changed, 475 insertions(+), 27 deletions(-) create mode 100644 one-click-launch.yaml delete mode 100644 scripts/manifest-update.py diff --git a/one-click-launch.yaml b/one-click-launch.yaml new file mode 100644 index 00000000..29121168 --- /dev/null +++ b/one-click-launch.yaml @@ -0,0 +1,475 @@ +AWSTemplateFormatVersion: 2010-09-09 +Description: Creates MLOps setup for Developers +Resources: + CodeBuildRole: + Type: AWS::IAM::Role + Properties: + Path: / + AssumeRolePolicyDocument: + Statement: + - Action: sts:AssumeRole + Effect: Allow + Principal: + Service: codebuild.amazonaws.com + + ManagedPolicyArns: + - arn:aws:iam::aws:policy/AWSCodeBuildAdminAccess + Policies: + - PolicyName: create + PolicyDocument: + Version: "2012-10-17" + Statement: + - Sid: Logs + Effect: Allow + Action: + - logs:CreateLogGroup + - logs:CreateLogStream + - logs:PutLogEvents + Resource: + - "*" + - Sid: CFN + Effect: Allow + Action: + - cloudformation:DescribeStacks + - cloudformation:CreateChangeSet + - cloudformation:DescribeChangeSet + - cloudformation:ExecuteChangeSet + - cloudformation:GetTemplate + - cloudformation:DescribeStackEvents + - cloudformation:DeleteStack + - cloudformation:DeleteChangeSet + Resource: + - !Sub arn:aws:cloudformation:${AWS::Region}:${AWS::AccountId}:stack/CDKToolkit/* + - !Sub arn:aws:cloudformation:${AWS::Region}:${AWS::AccountId}:stack/seedfarmer-* + - !Sub arn:aws:cloudformation:${AWS::Region}:${AWS::AccountId}:stack/aws-codeseeder-* + - Sid: IAM + Effect: Allow + Action: + - iam:GetRole + - iam:CreateRole + - iam:AttachRolePolicy + - iam:DetachRolePolicy + - iam:DeleteRole + - iam:PutRolePolicy + - iam:DeleteRolePolicy + - iam:getRolePolicy + - iam:TagRole + Resource: + - !Sub arn:aws:iam::${AWS::AccountId}:role/cdk-* + - !Sub arn:aws:iam::${AWS::AccountId}:role/seedfarmer-* + - Sid: ECR + Effect: Allow + Action: + - ecr:CreateRepository + - ecr:SetRepositoryPolicy + - ecr:Describe* + - ecr:DeleteRepository + - ecr:PutLifecyclePolicy + - ecr:PutImageTagMutability + - ecr:List* + Resource: !Sub arn:aws:ecr:${AWS::Region}:${AWS::AccountId}:repository/cdk-* + - Sid: S3 + Effect: Allow + Action: + - s3:CreateBucket + - s3:GetBucketPolicy + - s3:PutBucketPolicy + - s3:PutBucketVersioning + - s3:PutBucketPublicAccessBlock + - s3:PutBucketAcl + - s3:GetEncryptionConfiguration + - s3:PutEncryptionConfiguration + - s3:PutLifecycleConfiguration + - s3:PutObjectTagging + - s3:PutObjectVersionTagging + - s3:DeleteObjectTagging + - s3:DeleteObjectVersionTagging + Resource: "*" + - Sid: SSM + Effect: Allow + Action: + - ssm:PutParameter + - ssm:DeleteParameter + - ssm:GetParameters + Resource: !Sub arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/cdk-* + - Sid: SecretsManager + Effect: Allow + Action: + - secretsmanager:CreateSecret + - secretsmanager:DeleteSecret + Resource: + - !Sub "arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:*" + - Sid: Password + Effect: Allow + Action: + - secretsmanager:GetRandomPassword + Resource: "*" + - Sid: ES + Effect: Allow + Action: + - es:Get* + - es:Describe* + - es:List* + - es:ESHttpGet + Resource: + - !Sub "arn:aws:es:${AWS::Region}:${AWS::AccountId}:*" + - !Sub "arn:aws:es:${AWS::Region}:${AWS::AccountId}:domain:*" + - PolicyName: delete + PolicyDocument: + Version: "2012-10-17" + Statement: + - Sid: CFN + Effect: Allow + Action: + - cloudformation:DescribeStacks + - cloudformation:CreateChangeSet + - cloudformation:DescribeChangeSet + - cloudformation:ExecuteChangeSet + - cloudformation:GetTemplate + - cloudformation:DescribeStackEvents + - cloudformation:DeleteStack + - cloudformation:DeleteChangeSet + Resource: + - !Sub arn:aws:cloudformation:${AWS::Region}:${AWS::AccountId}:stack/CDKToolkit/* + - !Sub arn:aws:cloudformation:${AWS::Region}:${AWS::AccountId}:stack/seedfarmer-* + - !Sub arn:aws:cloudformation:${AWS::Region}:${AWS::AccountId}:stack/aws-codeseeder-* + - !Sub arn:aws:cloudformation:${AWS::Region}:${AWS::AccountId}:stack/mlops* + - Sid: IAM + Effect: Allow + Action: + - iam:GetRole + - iam:CreateRole + - iam:AttachRolePolicy + - iam:DetachRolePolicy + - iam:DeleteRole + - iam:PutRolePolicy + - iam:DeleteRolePolicy + - iam:getRolePolicy + - iam:UpdateAssumeRolePolicy + - iam:GetPolicy + - iam:List* + - iam:DeletePolicy + Resource: + - !Sub arn:aws:iam::${AWS::AccountId}:role/cdk-* + - !Sub arn:aws:iam::${AWS::AccountId}:role/seedfarmer-* + - !Sub arn:aws:iam::${AWS::AccountId}:role/codeseeder-* + - !Sub arn:aws:iam::${AWS::AccountId}:policy/codeseeder-* + - Sid: ECR + Effect: Allow + Action: + - ecr:CreateRepository + - ecr:SetRepositoryPolicy + - ecr:Describe* + - ecr:DeleteRepository + - ecr:PutLifecyclePolicy + - ecr:PutImageTagMutability + - ecr:List* + Resource: !Sub arn:aws:ecr:${AWS::Region}:${AWS::AccountId}:repository/cdk-* + - Sid: S3KMS + Effect: Allow + Action: + - s3:CreateBucket + - s3:GetBucketPolicy + - s3:PutBucketPolicy + - s3:PutBucketVersioning + - s3:PutBucketPublicAccessBlock + - s3:PutBucketAcl + - s3:GetEncryptionConfiguration + - s3:PutEncryptionConfiguration + - s3:PutLifecycleConfiguration + - s3:PutObjectTagging + - s3:PutObjectVersionTagging + - s3:DeleteObjectTagging + - s3:DeleteObjectVersionTagging + - s3:List* + - kms:Delete* + - kms:ScheduleKeyDeletion + - kms:CancelKeyDeletion + - kms:List* + - kms:Describe* + Resource: "*" + - Sid: SSM + Effect: Allow + Action: + - ssm:PutParameter + - ssm:DeleteParameter + - ssm:GetParameters + Resource: !Sub arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/cdk-* + - Sid: SecretsManager + Effect: Allow + Action: + - secretsmanager:CreateSecret + - secretsmanager:DeleteSecret + Resource: + - !Sub "arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:*" + - Sid: Password + Effect: Allow + Action: + - secretsmanager:GetRandomPassword + Resource: "*" + - Sid: ES + Effect: Allow + Action: + - es:Get* + - es:Describe* + - es:List* + - es:ESHttpGet + Resource: + - !Sub "arn:aws:es:${AWS::Region}:${AWS::AccountId}:*" + - !Sub "arn:aws:es:${AWS::Region}:${AWS::AccountId}:domain:*" + - Sid: S3DeleteCodeseeder + Effect: Allow + Action: + - s3:Delete* + - s3:PutObject + - s3:PutObjectAcl + Resource: + - !Sub "arn:aws:s3:::codeseeder-mlops-${AWS::AccountId}-*" + - !Sub "arn:aws:s3:::codeseeder-mlops-${AWS::AccountId}-*/*" + - !Sub "arn:aws:s3:::mlops*" + - !Sub "arn:aws:s3:::mlops*/*" + - Sid: CodebuildCleanup + Effect: Allow + Action: + - codebuild:DeleteProject + Resource: + - !Sub "arn:aws:codebuild:${AWS::Region}:${AWS::AccountId}:project/codeseeder-mlops" + CreateUpdateCodeBuildProject: + Type: AWS::CodeBuild::Project + Properties: + Description: Builds MLOps Solution Using Seedfarmer + ServiceRole: !GetAtt 'CodeBuildRole.Arn' + Artifacts: + Type: no_artifacts + TimeoutInMinutes: 480 + Environment: + Type: LINUX_CONTAINER + ComputeType: BUILD_GENERAL1_LARGE + Image: "aws/codebuild/standard:7.0" + EnvironmentVariables: + - Name: AWS_ACCOUNT_ID + Value: !Sub '${AWS::AccountId}' + - Name: PRIMARY_ACCOUNT + Value: !Sub '${AWS::AccountId}' + - Name: AWS_REGION + Value: !Sub '${AWS::Region}' + - Name: AWS_DEFAULT_REGION + Value: !Sub '${AWS::Region}' + - Name: ROLE_ARN + Value: !Sub '${CodeBuildRole.Arn}' + - Name: url_path + Value: 'placeholder' + - Name: url_query + Value: 'placeholder' + - Name: cfn_signal_url + Value: 'placeholder' + - Name: cfn_stack_id + Value: 'placeholder' + - Name: cfn_logical_resource_id + Value: 'placeholder' + - Name: cfn_request_id + Value: 'placeholder' + Source: + Type: NO_SOURCE + BuildSpec: | + version: 0.2 + env: + shell: bash + phases: + install: + runtime-versions: + python: 3.11 + nodejs: 18 + pre_build: + commands: + - pip install seed-farmer + - apt-get install jq git + - npm install -g aws-cdk + build: + commands: + - echo Build started on `date` + - echo 'Cloning mlops repo...' + - git clone https://github.com/mahesh-balumuri/mlops-modules.git + - echo 'Cloning complete' + - cd mlops-modules/ + - echo 'Installing dependencies...' + - pip install -r requirements.txt + - echo 'Python environment setup complete' + - echo 'Bootstrapping CDK...' + - cdk bootstrap aws://${AWS_ACCOUNT_ID}/${AWS_REGION} + - echo 'CDK bootstrap complete' + - echo 'Bootstrapping seedfarmer...' + - seedfarmer bootstrap toolchain --project mlops --trusted-principal ${ROLE_ARN} --as-target + - python scripts/role_assume_update.py ${ROLE_ARN} + - echo 'Sleeping 120 seconds after role update' + - sleep 120 + - echo 'Preparing Manifest files' + - sed -i "s/us-east-1/${AWS_REGION}/g" manifests/*.yaml + - echo 'Deploying MLOPS manifest' + - seedfarmer apply manifests/deployment.yaml --region ${AWS_REGION} --enable-session-timeout + - echo 'Deployment of mlops-modules manifest complete' + post_build: + commands: + - echo Build completed on `date` + - echo Signal back if we have gotten this far + - echo url_path - $url_path + - echo url_query - $url_query + - export UUID=1233244324 + - | + STATUS='SUCCESS' + if [ $CODEBUILD_BUILD_SUCCEEDING -ne 1 ] # Test if the build is failing + then + STATUS='FAILURE' + fi + cat < /tmp/payload.json + { + "UniqueId": "$UUID", + "Status": "$STATUS", + "Reason": "$STATUS", + "Data": "Deployment of solution has finished or stopped. See status." + } + EOF + cat /tmp/payload.json + echo "Calling Callback URL: ${cfn_signal_url}" + curl -T /tmp/payload.json "$cfn_signal_url" + CodeBuildRun: + Type: AWS::CloudFormation::CustomResource + Properties: + ServiceToken: !GetAtt CodeBuildLambda.Arn + BuildProjectName: !Ref CreateUpdateCodeBuildProject + CallbackUrl: !Ref CodeBuildRunWaitConditionHandler01 + CodeBuildRunWaitConditionHandler01: + Type: AWS::CloudFormation::WaitConditionHandle + CodeBuildRunWaitCondition: + Type: AWS::CloudFormation::WaitCondition + DependsOn : CodeBuildRun + Properties: + Count: 1 + Handle: !Ref CodeBuildRunWaitConditionHandler01 + Timeout: "18000" + CodeBuildLambda: + Type: AWS::Lambda::Function + Properties: + Code: + ZipFile: | + import http.client + import urllib.parse + import json + import boto3 + import traceback + + def lambda_handler(event, context): + account_id = context.invoked_function_arn.split(":")[4] + + try: + print(("Received event: " + json.dumps(event, indent=2))) + response = get_response_dict(event) + + if event['RequestType'] in ("Create", "Update"): + try: + print("Kicking off Build") + execute_build(event, event["ResourceProperties"]["BuildProjectName"]) + send_response(event, get_response_dict(event), "SUCCESS") + except Exception as build_exce: + print("ERROR: Build threw exception") + print((repr(build_exce))) + return send_response(event, get_response_dict(event), + "FAILED", repr(build_exce)) + else: + print("Build Kicked off ok CodeBuild should signal back") + return + elif event['RequestType'] == "Delete": + try: + send_response(event, get_response_dict(event), "SUCCESS") + except Exception as response_exce: + print("ERROR: Send Response threw exception") + print((repr(response_exce))) + return send_response(event, get_response_dict(event), + "FAILED", repr(response_exce)) + else: + return + else: + print("ERROR: Invalid request type send error signal to cfn") + print("ERROR: Expected - Create, Update, Delete") + except Exception as unhandled: + response = get_response_dict(event) + return send_response(event, response, "FAILED", + "Unhandled exception, failing gracefully: " + str(unhandled)) + + def execute_build(event, project_name): + """Kickoff CodeBuild Project.""" + build = boto3.client('codebuild') + signal_url = event["ResourceProperties"]["CallbackUrl"] + stack_id = event["StackId"] + request_id = event["RequestId"] + logical_resource_id = event["LogicalResourceId"] + url = urllib.parse.urlparse(event['ResponseURL']) + response = build.start_build( + projectName=project_name, environmentVariablesOverride=[ + {'name': 'url_path', 'value': url.path}, + {'name': 'url_query', 'value': url.query}, + {'name': 'cfn_signal_url', 'value': signal_url}, + {'name': 'cfn_stack_id', 'value': stack_id}, + {'name': 'cfn_request_id', 'value': request_id}, + {'name': 'cfn_logical_resource_id', 'value': logical_resource_id} + ]) + return response + + def get_response_dict(event): + response = { + 'StackId': event['StackId'], + 'RequestId': event['RequestId'], + 'LogicalResourceId': event['LogicalResourceId'], + 'Status': 'SUCCESS', + 'PhysicalResourceId': 'SeedFarmerDeployment' + } + return response + + def send_response(event, response, status=None, reason=None): + if status is not None: + response['Status'] = status + + if reason is not None: + response['Reason'] = reason + + if 'ResponseURL' in event and event['ResponseURL']: + url = urllib.parse.urlparse(event['ResponseURL']) + body = json.dumps(response) + https = http.client.HTTPSConnection(url.hostname) + https.request('PUT', url.path+'?'+url.query, body) + print("Sent CFN Response") + + return response + Handler: index.lambda_handler + Runtime: python3.12 + Timeout: 300 + Role: !GetAtt CodeBuildLambdaExecutionRole.Arn + CodeBuildLambdaExecutionRole: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Principal: + Service: + - lambda.amazonaws.com + Action: + - sts:AssumeRole + Path: "/" + Policies: + - PolicyName: root + PolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Action: + - codebuild:StartBuild + Resource: + - !GetAtt CreateUpdateCodeBuildProject.Arn + - Effect: Allow + Action: + - logs:CreateLogGroup + - logs:CreateLogStream + - logs:PutLogEvents + Resource: arn:aws:logs:*:*:* \ No newline at end of file diff --git a/scripts/manifest-update.py b/scripts/manifest-update.py deleted file mode 100644 index 91935ef3..00000000 --- a/scripts/manifest-update.py +++ /dev/null @@ -1,27 +0,0 @@ -import sys - -import yaml - -if len(sys.argv) != 5: - print( - "Usage: python manifest-update.py [MANIFEST PATH][TOOLCHAIN REGION] [TARGET REGION] [TARGET ACCOUNT]" - ) - exit(1) - -manifest_path = sys.argv[1] -toolchain_region = sys.argv[2] -target_region = sys.argv[3] -target_account = sys.argv[4] -with open(manifest_path, "r") as file: - data = yaml.safe_load(file) - -data["toolchainRegion"] = toolchain_region -data["targetAccountMappings"][0]["accountId"] = target_account -data["targetAccountMappings"][0]["regionMappings"][0]["region"] = target_region - -with open("deployment.yaml", "w") as file: - yaml.dump(data, file) - -print( - f"manifest has been updated and seedfarmer will deploy the following: \n{open('deployment.yaml').read()}" -) From b874742a55c7b80e127dd4e759c90d942a2442c7 Mon Sep 17 00:00:00 2001 From: Mahesh Balumuri Date: Wed, 28 Feb 2024 20:35:30 +0530 Subject: [PATCH 6/7] Added black line --- one-click-launch.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/one-click-launch.yaml b/one-click-launch.yaml index 29121168..ddb652da 100644 --- a/one-click-launch.yaml +++ b/one-click-launch.yaml @@ -472,4 +472,4 @@ Resources: - logs:CreateLogGroup - logs:CreateLogStream - logs:PutLogEvents - Resource: arn:aws:logs:*:*:* \ No newline at end of file + Resource: arn:aws:logs:*:*:* From 79efb9cc11bf34d0434e60b97958dbe33bcd5143 Mon Sep 17 00:00:00 2001 From: Mahesh Balumuri Date: Thu, 29 Feb 2024 07:37:07 +0530 Subject: [PATCH 7/7] updated repo url --- one-click-launch.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/one-click-launch.yaml b/one-click-launch.yaml index ddb652da..a34e9b95 100644 --- a/one-click-launch.yaml +++ b/one-click-launch.yaml @@ -289,7 +289,7 @@ Resources: commands: - echo Build started on `date` - echo 'Cloning mlops repo...' - - git clone https://github.com/mahesh-balumuri/mlops-modules.git + - git clone https://github.com/awslabs/mlops-modules.git - echo 'Cloning complete' - cd mlops-modules/ - echo 'Installing dependencies...'