Având un mediu capabil să ofere Amazon SageMaker Instanțele de notebook le permit oamenilor de știință de date și analiștilor de afaceri să răspundă eficient nevoilor organizaționale. Datele sunt componenta vitală a unei organizații, iar analiza eficientă a acestor date oferă informații utile pentru companii. O problemă comună cu care se confruntă organizațiile este crearea unui model automat care permite echipelor de dezvoltare să lanseze servicii AWS. Organizațiile doresc să le permită dezvoltatorilor să lanseze resurse așa cum au nevoie de ele, dar într-un mod centralizat și securizat.
Această postare demonstrează cum să centralizați gestionarea notebook-urilor de instanță SageMaker folosind serviciile AWS, inclusiv Formarea AWS Cloud, Model de aplicație fără server AWS (AWS SAM), Catalog de servicii AWS, Amazon EventBridge, Magazin de parametri AWS Systems Manager, Gateway API Amazon, și AWS Lambdas. Expunem cum să folosim aceste servicii AWS pentru a automatiza procesul de vânzare a notebook-urilor SageMaker către utilizatorii finali.
Prezentare generală a soluțiilor
În soluția noastră, un utilizator de notebook solicită o instanță de notebook folosind AWS Service Catalog. Solicitarea este procesată de AWS CloudFormation, care furnizează instanța de notebook. EventBridge monitorizează API-ul AWS Service Catalog pentru finalizarea furnizării resurselor de instanță de notebook. O regulă bazată pe evenimente din EventBridge apelează procesorul de evenimente Lambda, care rulează o funcție Lambda care returnează adresa URL presemnată.
Următoarea diagramă arhitecturală ilustrează starea infrastructurii așa cum este definită în șabloanele CloudFormation.
Procesul constă din următorii pași:
- Un utilizator solicită un nou notebook prin consola AWS Service Catalog.
- AWS Service Catalog lansează o stivă CloudFormation.
- AWS CloudFormation lansează notebook-ul SageMaker.
- Un notebook SageMaker rulează acum.
- O funcție EventBridge este declanșată atunci când este lansat un nou produs AWS Service Catalog.
- Amazon CloudWatch evenimentul invocă o funcție Lambda care generează adresa URL presemnată și un parametru SSM specific utilizatorului.
- Un utilizator solicită o nouă adresă URL presemnată.
- O funcție Lambda generează o nouă adresă URL presemnată și actualizează parametrul SSM al utilizatorului cu noua adresă URL.
Cerințe preliminare
Pentru a implementa această soluție, trebuie să aveți următoarele condiții prealabile:
Implementați resurse cu AWS CloudFormation
Pentru a vă crea resurse cu AWS CloudFormation, parcurgeți următorii pași:
- Implementați fișierul
s3-iam-config
Șablon CloudFormation:
aws cloudformation create-stack --stack-name s3-iam-config --template-body file://templates/s3-iam-config.yml --parameters file://parameters/s3-iam-params.json --capabilities CAPABILITY_NAMED_IAM
Ieșirea ar trebui să arate ca următorul cod:
{ "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/s3-iam-config/9be9f990-0909-11eb-811c-0a78092beb51"
}
Șablonul creează un Serviciul Amazon de stocare simplă Găleată (Amazon S3)
- Rulați următoarea comandă pentru a obține numele compartimentului S3 generat în pasul anterior:
aws cloudformation describe-stacks --stack-name s3-iam-config --query "Stacks[0].Outputs[?OutputKey=='S3BucketName'].OutputValue" --output text
Ieșirea ar trebui să arate astfel:
s3-iam-config-s3bucket-1p85zr5051d86
- Rulați următoarea comandă folosind rezultatul de la pasul anterior (actualizați numele găleții):
aws s3 cp templates/sm-notebook.yml s3://<bucket_name>/sm-notebook.yml
Ieșirea ar trebui să arate astfel:
upload: templates/sm-notebook.yml to s3://s3-iam-config-s3bucket-1p85zr5051d86/sm-notebook.yml
- Deschideți
parameters/service-catalog-params.json
fișier și actualizați S3BucketName
parametru la numele compartimentului de la pasul anterior. Actualizați UserIAMPrincipal
cu ARN-ul rolului IAM pe care îl utilizați pentru această demonstrație.
[ { "ParameterKey" : "NotebookInstanceType", "ParameterValue" : "ml.t2.medium" }, { "ParameterKey" : "S3IAMConfigStackName", "ParameterValue" : "s3-iam-config" }, { "ParameterKey" : "ServiceCatalogTemplateName", "ParameterValue" : "sm-notebook.yml" }, { "ParameterKey" : "S3BucketName", "ParameterValue" : "<input_your_bucket_name>" }, { "ParameterKey" : "UserIAMPrincipal", "ParameterValue" : "<input_your_iam_principal_arn>" }
]
- Implementați fișierul
service-catalog
Șablon CloudFormation:
aws cloudformation create-stack --stack-name service-catalog-config --template-body file://templates/service-catalog.yml --parameters file://parameters/service-catalog-params.json --capabilities CAPABILITY_NAMED_IAM
Ieșirea ar trebui să arate astfel:
{ "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/service-catalog-config/fb29c5e0-28a0-11ec-8337-123f746ae8a3"
}
Implementați resurse cu AWS SAM
Pentru a implementa resurse cu AWS SAM, parcurgeți următorii pași:
- Schimbați-vă directorul în
lambda
director:
- Construiți aplicația:
Ieșirea ar trebui să arate astfel:
Built Artifacts : .aws-sam/build
Built Template : .aws-sam/build/template.yaml Commands you can use next
=========================
[*] Invoke Function: sam local invoke
[*] Test Function in the Cloud: sam sync --stack-name {stack-name} --watch
[*] Deploy: sam deploy --guided
- Implementează aplicația:
- Răspundeți la întrebările din CLI așa cum se arată în următorul cod:
Configuring SAM deploy
====================== Looking for config file [samconfig.toml] : Found Reading default arguments : Success Setting default arguments for 'sam deploy' ========================================= Stack Name [sam-app]: sam-app AWS Region [us-east-1]: us-east-1 Parameter EventBridgeFunctionName [EventBridgeFunction]: EventBridgeFunction Parameter EventRuleName [SvcCatalogEventRule]: SvcCatalogEventRule Parameter RefreshFunctionName [RefreshURLFunction]: RefreshURLFunction #Shows you resources changes to be deployed and require a 'Y' to initiate deploy Confirm changes before deploy [y/N]: N #SAM needs permission to be able to create roles to connect to the resources in your template Allow SAM CLI IAM role creation [Y/n]: Y #Preserves the state of previously provisioned resources when an operation fails Disable rollback [y/N]: N EventBridgeFunction may not have authorization defined, Is this okay? [y/N]: Y RefreshURLFunction may not have authorization defined, Is this okay? [y/N]: Y Save arguments to configuration file [Y/n]: Y SAM configuration file [samconfig.toml]: samconfig.toml SAM configuration environment [default]: dev
Ieșirea ar trebui să arate astfel:
Looking for resources needed for deployment: Creating the required resources... Successfully created! Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-1f4i68wsmouhw A different default S3 bucket can be set in samconfig.toml Saved arguments to config file Running 'sam deploy' for future deployments will use the parameters saved above. The above parameters can be changed by modifying samconfig.toml Learn more about samconfig.toml syntax at https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html Uploading to sam-app/6f3e2f13cfdca08133238f77fc2c667b 9425988 / 9425988 (100.00%)
Uploading to sam-app/b153fd4be66b581361f7d46efae25f18 9425968 / 9425968 (100.00%) Deploying with following values =============================== Stack name : sam-app Region : us-east-1 Confirm changeset : False Disable rollback : False Deployment s3 bucket : aws-sam-cli-managed-default-samclisourcebucket-1f4i68wsmouhw Capabilities : ["CAPABILITY_IAM"] Parameter overrides : {"EventBridgeFunctionName": "EventBridgeFunction", "EventRuleName": "SvcCatalogEventRule", "RefreshFunctionName": "RefreshURLFunction"} Signing Profiles : {} Initiating deployment
=====================
Uploading to sam-app/c82cdea2bfbc2abc6520a97fce4c8a8b.template 6754 / 6754 (100.00%) Waiting for changeset to be created.. CloudFormation stack changeset
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Operation LogicalResourceId ResourceType Replacement -----------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Add EventBridgeFunctionHelloWorldPermissio AWS::Lambda::Permission N/A nProd + Add EventBridgeFunctionRole AWS::IAM::Role N/A + Add EventBridgeFunction AWS::Lambda::Function N/A + Add PermissionForEventsToInvokeLambda AWS::Lambda::Permission N/A + Add RefreshURLFunctionHelloWorldPermission AWS::Lambda::Permission N/A Prod + Add RefreshURLFunctionRole AWS::IAM::Role N/A + Add RefreshURLFunction AWS::Lambda::Function N/A + Add ServerlessRestApiDeploymentb762875163 AWS::ApiGateway::Deployment N/A + Add ServerlessRestApiProdStage AWS::ApiGateway::Stage N/A + Add ServerlessRestApi AWS::ApiGateway::RestApi N/A + Add SvcCatalogEventRule AWS::Events::Rule N/A ----------------------------------------------------------------------------------------------------------------------------------------------------------------- Changeset created successfully. arn:aws:cloudformation:us-east-1:123456789012:changeSet/samcli-deploy1641934511/763fe89c-9c6a-4cef-a1a6-90986d7decfd 2022-01-11 15:55:22 - Waiting for stack create/update to complete CloudFormation events from stack operations
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus ResourceType LogicalResourceId ResourceStatusReason -----------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE_IN_PROGRESS AWS::IAM::Role RefreshURLFunctionRole - CREATE_IN_PROGRESS AWS::IAM::Role EventBridgeFunctionRole - CREATE_IN_PROGRESS AWS::IAM::Role EventBridgeFunctionRole Resource creation Initiated CREATE_IN_PROGRESS AWS::IAM::Role RefreshURLFunctionRole Resource creation Initiated CREATE_COMPLETE AWS::IAM::Role EventBridgeFunctionRole - CREATE_IN_PROGRESS AWS::Lambda::Function EventBridgeFunction - CREATE_IN_PROGRESS AWS::Lambda::Function EventBridgeFunction Resource creation Initiated CREATE_COMPLETE AWS::IAM::Role RefreshURLFunctionRole - CREATE_COMPLETE AWS::Lambda::Function EventBridgeFunction - CREATE_IN_PROGRESS AWS::Lambda::Function RefreshURLFunction - CREATE_IN_PROGRESS AWS::Lambda::Function RefreshURLFunction Resource creation Initiated CREATE_IN_PROGRESS AWS::Events::Rule SvcCatalogEventRule - CREATE_IN_PROGRESS AWS::Events::Rule SvcCatalogEventRule Resource creation Initiated CREATE_COMPLETE AWS::Lambda::Function RefreshURLFunction - CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi - CREATE_COMPLETE AWS::ApiGateway::RestApi ServerlessRestApi - CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi Resource creation Initiated CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeploymentb762875163 - CREATE_IN_PROGRESS AWS::Lambda::Permission EventBridgeFunctionHelloWorldPermissio - nProd CREATE_IN_PROGRESS AWS::Lambda::Permission RefreshURLFunctionHelloWorldPermission Resource creation Initiated Prod CREATE_IN_PROGRESS AWS::Lambda::Permission EventBridgeFunctionHelloWorldPermissio Resource creation Initiated nProd CREATE_IN_PROGRESS AWS::Lambda::Permission RefreshURLFunctionHelloWorldPermission - Prod CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeploymentb762875163 Resource creation Initiated CREATE_COMPLETE AWS::ApiGateway::Deployment ServerlessRestApiDeploymentb762875163 - CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage - CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage Resource creation Initiated CREATE_COMPLETE AWS::Lambda::Permission RefreshURLFunctionHelloWorldPermission - Prod CREATE_COMPLETE AWS::Lambda::Permission EventBridgeFunctionHelloWorldPermissio - nProd CREATE_COMPLETE AWS::ApiGateway::Stage ServerlessRestApiProdStage - CREATE_COMPLETE AWS::Events::Rule SvcCatalogEventRule - CREATE_IN_PROGRESS AWS::Lambda::Permission PermissionForEventsToInvokeLambda - CREATE_IN_PROGRESS AWS::Lambda::Permission PermissionForEventsToInvokeLambda Resource creation Initiated CREATE_COMPLETE AWS::Lambda::Permission PermissionForEventsToInvokeLambda - CREATE_COMPLETE AWS::CloudFormation::Stack sam-app - ----------------------------------------------------------------------------------------------------------------------------------------------------------------- CloudFormation outputs from deployed stack
------------------------------------------------------------------------------------------------------------------------------------------------------------------
Outputs ------------------------------------------------------------------------------------------------------------------------------------------------------------------
Key RefreshURLFunctionIamRole Description Implicit IAM Role created for Hello World function Value arn:aws:lambda:us-east-1:123456789012:function:RefreshURLFunction Key RefreshURLFunctionAPI Description API Gateway endpoint URL for Prod stage for Hello World function Value https://m94bjaurjb.execute-api.us-east-1.amazonaws.com/Prod/refreshurl/ Key RefreshURLFunction Description Hello World Lambda Function ARN Value arn:aws:lambda:us-east-1:123456789012:function:RefreshURLFunction ------------------------------------------------------------------------------------------------------------------------------------------------------------------ Successfully created/updated stack - sam-app in us-east-1
Testați soluția
Acum că ați implementat soluția, să testăm fluxul de lucru.
- Pe consola AWS Service Catalog, sub Administrare în panoul de navigare, alegeți portofoliile.
- Alegeți caietul dvs. SageMaker.
- Alege Lansați produsul.
- În partea de jos a paginii, alegeți Lansați produsul.
Ar trebui să vedeți o pagină similară cu următoarea captură de ecran.
- Așteptați câteva momente pentru ca starea să se afișeze ca
Available
.
- Deschideți terminalul și rulați următoarea comandă pentru a obține adresa URL presemnată din Parameter Store:
aws ssm get-parameter --name "/SageMaker/Notebooks/Demo-User-Notebook" --query Parameter.Value
Ieșirea ar trebui să arate astfel:
"https://demo-user-notebook.notebook.us-east-1.sagemaker.aws?authToken=eyJhbGciOiJIUzI1NiJ9.eyJmYXNDcmVkZW50aWFscyI6IkFZQURlSlVvLzJjeEcwQ0xtNHBjTTZFOGM1SUFYd0FCQUJWaGQzTXRZM0o1Y0hSdkxYQjFZbXhwWXkxclpYa0FSRUV3U0ZSdU1rNXJZMUpyWnpWWVlsZFBRbUowTmtadVpGcHZlRlJXUW05SVlWaHdiazFJY25WRWVrTmtlVWRUVUZsak56UnhObWQzVTJGS1dYUm5hVk40VVQwOUFBRUFCMkYzY3kxcmJYTUFTMkZ5YmpwaGQzTTZhMjF6T25WekxXVmhjM1F0TVRvM05qUTNNRGM1TWpRME1UVTZhMlY1TDJJM01ETTNNRE5oTFdVMU5HTXROR1JtWWkxaE1HRTFMVGMyTnpNek1XWXlORGsxT1FDNEFRSUJBSGhlY3J4TGdEdDJaWmRKYk5nd3R4RHJpWmtZQnZUR1cwZWZCWVhaVW1VTTFBRXNiUlBXblloT3hjUWhPUE9jR0FaZUFBQUFmakI4QmdrcWhraUc5dzBCQndhZ2J6QnRBZ0VBTUdnR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTUFnMjM1NzZRT1l6azgyc29BZ0VRZ0RzejlwVHd4Q2ZZUHd6SGJvZERIaElRa1BRWjdUUXRxZ2dEaVpkTDBtMnIxaW1jVHp5czJHc0t6T3d2Z2g1cGNSSytVS2ZxTXlnTmVhaHVVd0lBQUFBQURBQUFFQUFBQUFBQUFBQUFBQUFBQUFET3ZoZFMvb01sTE4xZ3hQSFkybklQLy8vLy93QUFBQUVBQUFBQUFBQUFBQUFBQUFFQUFBTmZFc2JYV1RDWXorV0o0S3BwSXhEMkpkMVFzUnZFbW9lS21hZDhvSmNSN0tRMi9CQWd3TTA3YUFOOEN1WE8yc2lLUnpZdjI1YmlLOFYzUDM2d1Fjc3RoS085Ui91TFFzNWk4RytHc3BZSnlNamRsbWdWYTFEd2FZQmd0TUMwcmJMRjZSWXJhcFJtMFArbDVIQWg3bWNyeU9lejZWRVlYTmdJY2FXR0tjZDFwRjQ5bXBLTzNyQW5BSGlCdEVaNCtlSVFYVkJwMmQyV2c4TEFqR0RRYVNyclVBOUhJa3pvaloybm5iVHluY3pLWXlNVjA3Ui8wZmVTZU9jTTBubC9IRHdjWUdyc1RCcDgzM1RVWCtkOGRNRXI4amtpQVAwUTFQRkNrU2h5WS9CU05IalZtWThxd094N05jV3g1ZVpSenl3cm0vWXNZOW5paEt5cWRMaGNIQUhDbXZhWW8yb2lMZ3BGak51WG5udlh1U1UxcmFlRVZMNUlKR1loMVAzRWZnR3huNmlsUTJmVGllQytQdWNmT3dsZWwrSnR5SWNmbVRTeFB0bnE1YW1mVjEycml0Skx5a09WMklEc0YzSEl6RW11SmhYZTBqKzM1dWlITW5BVkFZVm5RbithdWh1K3lVcUNKeWVWU1o2ZWVsYmIwd2tYUGNpOXBkazFMbTFLNUpZcFJuMFoyS1hvSnBxNm52b3pPWkdvNG9jbmVRQWhKODRiYjR6RkdGZ1NOaTdQWEFuMnpDTkZ1S2w0eU9KVldiRDRXMGZGSFc1OE5iUTE5amc5Zlp0czlkVmxKclowSmVrYTJhZi9TaUpoeWdvcDBwQ0pBS0pZZkErVEhTQmdCUTFNUWpyUXV5U25jbnQ4NU5XUW1uVG9PUGJ4bVlyN0JRMllpQlJsekdxSDNuQ0pXN2x4YmNzYUV1c1dFMXB3K0RJc2lLMEV1YVV6anBFWFV0NEt4Zm82T3B3b28vdVcyV0dlSmNQVHk4TkNRYWZlUU1VbXgwaDQ3aDF0UHNIY0hBUjltKzU2c3BzMnJETjl4ZTFUMVdHVDg4a3FFMW5YYzRQeUZNdTVuYXB0UEdUU1B0akpZWDRKKzRsSzlJZzZCNG9qRTNmVEEzUVllSTd0dU9UZG9Vd2R6SkJ4L1NvSjNxU0ZUMWRDZXFDeUcyWUN5cjN0TmFzZlpYNFBBWmU4b1M1QVZTeExkVlVqUkpYcW1DM1ZkNUJPRlFySHpReTZjTkFLNFVOY2tBanh3bUgwbFlNdlFtc3lTODRzcCtLUGdpbXl3eWNDdk5tYWQ1bVltRHRZYVpMU3JCVUZIVzlDS2tTS2pqWWtBWnZ3MXRnS3h5OE9wNjZDRHY3aEZObzNDUWQ3MGpnV0wyamdnU1RIckJ6blJwK2wxQ1VscnNsblNzaGluTDcwbnp4eU02b1NBbm1FdFVscG9yeG1iWGRUbUxld244R1lQS1ZvT0syd1pobXk0TVQzc2xxRlU1enVTU2tBQnp5eURZb3djR3JxemlBTXNDcEZONVhRVk9HNHkzNnlZS3pTU0FVTEppRCtOZFRLeWxJbUFHY3daUUl3TXpoZ25hWitia1h5VmErTWUrYmwxUHBrUXcwMWxMUDZNcExnTGRPbkVKb0RRM0xLc2pLZHlidWx4cmlNK011SEFqRUF3V00zdXpjemZyY1ZWOGNwUzdlUDlBRXluNks5NkNQNFBiVCtYK1VVZERqYXZkR1hrenY3TklkWG4xem9pU0dpIiwiY2lwaGVyVGV4dCI6IkFRSUJBSGhlY3J4TGdEdDJaWmRKYk5nd3R4RHJpWmtZQnZUR1cwZWZCWVhaVW1VTTFBRVRlWjBib1lRWDZSazJ1dzdNREJZY0FBQUFvakNCbndZSktvWklodmNOQVFjR29JR1JNSUdPQWdFQU1JR0lCZ2txaGtpRzl3MEJCd0V3SGdZSllJWklBV1VEQkFFdU1CRUVERjVkR1VSbkt5ZlA4S2dKTVFJQkVJQmJyTkJkSkZEOWhySytrajEvTDRieXMxMlFmR2dxM1pSTVlGa2lwNjJXZGZ2aUhvdkswQ3pKY0VtSUE4akY5cktPRm5ZblFoeHpHdmhxZy84VjU4RjUxbWFKUkJIY0RlUzdjSGRpSkdhOW1MbmZuVzFwQVhoaUp1WlRCdz09Iiwid29ya3NwYWNlTmFtZSI6ImRlbW8tdXNlci1ub3RlYm9vayIsIndvcmtzcGFjZURvbWFpbk5hbWUiOiJkZW1vLXVzZXItbm90ZWJvb2siLCJzdWIiOiIxOTU4ODk2NzE2OTAiLCJleHAiOjE2MzgxNDAyMTQsImlhdCI6MTYzODEzODQxNH0.duv90DKJDan6ZOI_uwgP3sQEtManyMCD61tnhZtI-mY"
Regula EventBridge
EventBridge este configurat cu o regulă de eveniment pentru a procesa un răspuns API pentru API-ul AWS Service Catalog. Această regulă este configurată pentru a trece starea instanței notebook-ului, astfel încât să puteți utiliza Lambda pentru a returna un răspuns URL presemnat ca acțiune declanșată. Regula evenimentului este configurată după cum urmează:
{ "detail-type": ["AWS API Call via CloudTrail"], "detail": { "eventSource": ["servicecatalog.amazonaws.com"], "eventName": ["ProvisionProduct"] }
}
Următoarea captură de ecran a consolei EventBridge arată regula dvs. de eveniment.
AWS CloudTrail API-ul este monitorizat folosind sursa de evenimente pentru servicecatalog.amazonaws.com
. Numele evenimentului monitorizat este ProvisionProduct
. Monitorizarea acestui eveniment vă permite să luați măsuri eficiente ca răspuns la AWS Service Catalog care raportează starea de livrare cu succes a instanței de notebook. Când un ProvisionProduct
are loc un eveniment, o funcție Lambda numită DemoEventBridgeFunction
este invocat, care returnează utilizatorului final un URL presemnat.
Funcție Lambda pentru returnarea adreselor URL ale instanțelor notebook-uri presemnate
Pentru a asigura accesul securizat la blocnotesurile solicitate de utilizator prin AWS Service Catalog, o adresă URL presemnată este creată și returnată utilizatorului. Aceasta oferă o metodă sigură de accesare a instanței de notebook și de a efectua funcții critice pentru afaceri. În acest scop, folosim EventBridgeServiceCatalogFunction funcție, care folosește a Chelner pentru ca starea instanței de notebook să devină disponibilă. Ospătarii oferă un mijloc de a interoga un serviciu și de a suspenda executarea unei sarcini până când este îndeplinită o anumită condiție. Când este gata, funcția generează un URL presemnat. În cele din urmă, funcția creează un parametru SSM cu adresa URL presemnată generată. Parametrul SSM utilizează următorul model: /SageMaker/Notebooks/%s-Notebook"%user_name/
. Acest lucru ne permite să creăm un spațiu de nume comun pentru toți parametrii SSM pentru notebook-ul SageMaker, păstrându-i în același timp unici pe baza user_name
.
Adresele URL presemnate au o expirare definită. Funcția Lambda implementează notebook-uri cu o expirare a sesiunii de 12 ore. Din acest motiv, dezvoltatorii trebuie să genereze o nouă adresă URL presemnată atunci când URL-ul lor semnat existent expiră. The Funcția ReîmprospătareURL realizează acest lucru permițând utilizatorilor să invoce funcția apelând API Gateway. Dezvoltatorii pot invoca această funcție și pot transmite numele notebook-ului lor, iar acesta returnează o adresă URL presemnată. Cand RefreshURLFunction
este finalizată, un utilizator poate efectua un apel către Parameter Store, poate obține noua adresă URL presemnată și apoi poate accesa blocnotesul.
- Obţineţi
RefreshURLFunction
Adresa URL API Gateway cu următorul cod:
aws cloudformation describe-stacks --stack-name sam-app --query "Stacks[0].Outputs[?OutputKey=='RefreshURLFunctionAPI'].OutputValue" --output text --region us-east-1
Ieșirea ar trebui să arate astfel:
https://8mnr3ksi0d.execute-api.us-east-1.amazonaws.com/Prod/refreshurl/
- Invocați funcția
RefreshURLFunction
apelând API Gateway. Actualizați input_url
cu URL-ul de la pasul anterior:
curl -X POST <input_url> -d '{"notebook_user_name": "Demo-User"}'
Ieșirea ar trebui să arate astfel:
{"PreSignedURL": "https://demo-user-notebook-dctz.notebook.us-east-1.sagemaker.aws?authToken=eyJhbGciOiJIUzI1NiJ9.eyJmYXNDcmVkZW50aWFscyI6IkFZQURlRGw3R2E2OWZ3SmhjSlZKcDB1VjR2b0FYd0FCQUJWaGQzTXRZM0o1Y0hSdkxYQjFZbXhwWXkxclpYa0FSRUZzYVcxNVNsZGtXRXhCZGpVNGRIRkVTalo0V25SSk5WWTVUVEZHZFZaTVZtVldWRzQ0Tms1UGRWaEpSVFI2UTBwdGVFZDFWbFUxUzNoc1pYSXJia05YWnowOUFBRUFCMkYzY3kxcmJYTUFTMkZ5YmpwaGQzTTZhMjF6T25WekxXVmhjM1F0TVRvM05qUTNNRGM1TWpRME1UVTZhMlY1TDJJM01ETTNNRE5oTFdVMU5HTXROR1JtWWkxaE1HRTFMVGMyTnpNek1XWXlORGsxT1FDNEFRSUJBSGhlY3J4TGdEdDJaWmRKYk5nd3R4RHJpWmtZQnZUR1cwZWZCWVhaVW1VTTFBRjY1ZFVPdW5vQlY2MVdrTnM2OUVsdUFBQUFmakI4QmdrcWhraUc5dzBCQndhZ2J6QnRBZ0VBTUdnR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTVhsY1gyeW5WMVQxNkdBRHlBZ0VRZ0RzUEVSVllMRVMzN1FVZklvVTZjd3RZdGI4NkIrT212aVF3cm5BOFVDSnZtMjRxYXJORllaOGgzRGlnSy8wVVBSR3hTeFpoaFhWSTA0Q1RlUUlBQUFBQURBQUFFQUFBQUFBQUFBQUFBQUFBQUFBcUEvUnVZOTk2alBLV09zaFNqZS9GLy8vLy93QUFBQUVBQUFBQUFBQUFBQUFBQUFFQUFBTlhGZFYwR1FHMXZpN2drQkhtOGtmWlBUL0dxcnhOamFSWkU0Tis3ZTJocEI0YXUxS0ozQ2ZnRUMrcHR3dk9JdjQwVGYrdnNWNUt5MjYyNGYvOVhrYmVZQklqdnlLV1JJR0ZyS2dxditVTXdJcE8ydDFIbWcvSmFhdEpGdFhudlJodVcwMG9ldVBLS3ZFeGRKQ3ppYkRkT3J3SG5IMFJqWEhTc2tydGxsTDM2Mll0a3k0Z1cwV2xGOUt3Zm1xb2FjVzZZRTZhV0RUZU9oQWprZXFkQ1FoVi9KRWYwaTA1Q1VxU0k1REZzSC8yS2grZHJxS0tBSVMyTjFRYnNSZ3VGNzFFcnBCM3BoV25PSTFnd3BGL3VNMCs5MHRsTGVCeG5ncElqT1NEY1pkbHlwQmpNZkVadUNYWGU4ZTJGRGQ0bGVENFdOZDdzc0F4OHFQWmV5eWI3WWo2L0FxaUtESmdLOStScS9BVGF6NkRFNFNyL3BaWmpRRFFab1oyV1ZCa2VVWHR2U1piVUd4aXJXRG0rVUUxVk5sbG85TmhwSEhhR1dIZEJPU0w5SUFUWWZDVjV6enVURHNDS2l1dVBQTmFVZGhvSUVuL2c1UXhtOFJvZUlVVUJRcUVvbms3T3d1QzJZOEM2QUowclVxL055T3R5NmF4TWY2VEdYcTFsTHB4WG9wMjlXT3lzR3daQSs4Mmo3em5SZEo2RTZTU005TnJYRi95OWxRS3dBTFBaK3FBNmszSEFvdDg5UlZYSGVMTFQ3TklwazVYVnZlRXY5S3N2MUp1Uk1FVVJEZjI1bnZtOXRmVnp0MUN0R0Y1RVBQNEpid2d5RnZ4RDlnRkVPTUM5dk1rdWloT3JnM3JaaDNwRjd1RDRsVVptVUtTRXV6ZVVmRFd0eEhjVHZoeUxFVmZuczhpcjl6SnFacGxpNVdYdjF3bTQ5WWxJNGlSM1FiamtZM0JybUFsOFBzZkRjYmZJUmVBNmkvQjVNeHFOb3RvU0Y0MHA1OFpJTGZPNmNNWURlVHpzT2dMbENmYXIwT3JMK1lRVk55MU5ETUF3cGRWaXlNeWI1RHl2SzlOV3ZOOUt2c2lMTklrV1IvU2s5ekx1RjBPd3F0aE5GWjhkbWkvMzRzc2pRMUFVR1BMR2ZXbUl1ZmlqRnhrRytnL1lKMjNSa1pIVmRvb1J4TUt3Zmk5OXQvUS96QmI2OUgyQlljbFZwUVl0RGV4Z3ZGWTg2TGpUMm5sSjkya09ad1duWW9OMWpMenIrVTVWQkJKakpDT09ENVA0MXBWckdHN1R4Nlh4UlFscGRqQ3E5ZFhXQlJiRDh6d0JDZ2VMY254SFlZTjUzR2hON2U3S3QyUmZyak5aREtSanUvTWNZSXRSTTVLU2ZaNWFNZ2NJUXY0a0tLNUppVll6OEdaY2VUSE5TT21Zb1FNeG1xMnNOSGJDZzZpUFM4KytvUkErdFhGY1JWMFkxSG9qZlVWS2NzREJjZmFQRVo0TENSZENvZnYrWFVWaHFSNzlCZGpyYW92Wmo1TitqZjFxdHdWZU9mVWJBQm5NR1VDTUN6UU4xMThWMTFZcXcwSWFhbmY0NUtIcjhnUC9MaVZHLzVRTy9yemREbzdZbkZEMmtzM3ZKbFQxVWE5N3kxY25nSXhBS2FxNEJsQ3R4UUc3b2Yxc1BaWld3K2NCalgzcGdIMWhXMHpYOU1zVzJOYXFCSklpUkp1VTJVaUU0cVdDVnh4eVE9PSIsImNpcGhlclRleHQiOiJBUUlCQUhoZWNyeExnRHQyWlpkSmJOZ3d0eERyaVprWUJ2VEdXMGVmQllYWlVtVU0xQUhyWlZxanJHYWVlMUY5c016d2pmM1pBQUFBb2pDQm53WUpLb1pJaHZjTkFRY0dvSUdSTUlHT0FnRUFNSUdJQmdrcWhraUc5dzBCQndFd0hnWUpZSVpJQVdVREJBRXVNQkVFRFBGVFJFbXQ2SmQ2VWoxMExnSUJFSUJibHBFOWtORGxpd21Yb2ltaEFiTC8xNmpYTVRhcDYvNnpSRlFLbjNHWE9mRlVRcUx6VEVBSUQvY095bDlMYU1NdzBRaHBjSWhERmpEL1U1R29sQmUrSHJ4QnJuRk1SMjNrWVR1K2tXUFZVYUcwRExPanl1YVhYR3VDOHc9PSIsIndvcmtzcGFjZU5hbWUiOiJkZW1vLXVzZXItam9lLW5vdGVib29rIiwid29ya3NwYWNlRG9tYWluTmFtZSI6ImRlbW8tdXNlci1qb2Utbm90ZWJvb2steXVvYyIsInN1YiI6IjE5NTg4OTY3MTY5MCIsImV4cCI6MTY0MDc0NDM1OCwiaWF0IjoxNjQwNzQwNzU4fQ.WGFEzQhC3lvA9IguA2tbCS6Us9mhRIV_6LiuRTAytSo"}%
- Deschideți un browser și navigați la
PreSignedURL
de la pasul anterior.
Pagina web ar trebui să arate ca următoarea captură de ecran.
Concluzie
În această postare, am demonstrat cum să implementăm componentele de infrastructură pentru un mediu de instanță de notebook SageMaker folosind AWS CloudFormation. Apoi am ilustrat cum să folosiți EventBridge pentru a returna starea instanței de notebook din API-ul AWS Service Catalog. În cele din urmă, am arătat cum să utilizați o funcție Lambda pentru a returna URL-ul instanței notebook-ului presemnat pentru accesarea resursei livrate. Pentru mai multe informații, consultați Ghid pentru dezvoltatori Amazon SageMaker. Vă mulțumim pentru citit!
Despre Autori
Joe Keating este arhitect senior de livrare pentru clienți în servicii profesionale la Amazon Web Services. El lucrează cu clienții AWS pentru a proiecta și implementa o varietate de soluții în AWS Cloud. Lui Joe îi place să gătească cu un pahar sau două de vin și să ajungă la mediocritate pe terenul de golf.
Matt Hedges este arhitect de aplicații cloud la Amazon Web Services. El lucrează îndeaproape cu clienții pentru a alinia nevoile de tehnologie cu factorii de afaceri pentru a-și livra aplicațiile pe AWS. Cu accent pe migrare și modernizare, Matt lucrează cu clienții întreprinderi din întreaga lume pentru a iniția schimbări care deblochează întregul potențial al cloud-ului. Lui Matt îi place să petreacă timpul cu familia, să cânte la instrumente muzicale, să gătească, să joace jocuri video, să repare mașini vechi și să învețe lucruri noi.
Virginia Chu este arhitect senior DevSecOps în servicii profesionale la Amazon Web Services. Ea lucrează cu clienți la scară întreprinzătoare din întreaga lume pentru a proiecta și implementa o varietate de soluții în AWS Cloud.