View a markdown version of this page

Partes de una CloudFormation plantilla para AWS PIEZAS - AWS PIEZAS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Partes de una CloudFormation plantilla para AWS PIEZAS

Una CloudFormation plantilla tiene 1 o más secciones, cada una de las cuales tiene un propósito específico. CloudFormation define el formato, la sintaxis y el lenguaje estándar de una plantilla. Para obtener más información, consulte Trabajar con CloudFormation plantillas en la Guía del AWS CloudFormation usuario.

CloudFormation las plantillas son altamente personalizables y, por lo tanto, sus formatos pueden variar. Para comprender las partes necesarias de una CloudFormation plantilla para crear un clúster de AWS PCS, le recomendamos que examine la plantilla de ejemplo que le proporcionamos para crear un clúster de muestra. En este tema se explican brevemente las secciones de esa plantilla de ejemplo.

importante

Los ejemplos de código de este tema no están completos. La presencia de puntos suspensivos ([...]) indica que hay código adicional que no se muestra. Para descargar la YAML-formatted CloudFormation plantilla completa, consulteCloudFormation plantillas para crear una muestra AWS clúster PCS.

Encabezado

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: AWS Parallel Computing Service "getting started" cluster

AWSTemplateFormatVersionidentifica la versión del formato de plantilla a la que se ajusta la plantilla. Para obtener más información, consulte la sintaxis de la versión del formato de CloudFormation plantilla en la Guía del AWS CloudFormation usuario.

Transformespecifica una macro que se CloudFormation utiliza para procesar la plantilla. Para obtener más información, consulte la sección Transformación de CloudFormation plantillas de la Guía del AWS CloudFormation usuario. La AWS::Serverless-2016-10-31 transformación permite CloudFormation procesar una plantilla escrita en la sintaxis AWS Serverless Application Model (AWS SAM). Para obtener más información, consulte la AWS::Serverless transformación en la Guía AWS CloudFormation del usuario.

Metadatos

### Stack metadata Metadata: AWS::CloudFormation::Interface: ParameterGroups: - Label: default: PCS Cluster configuration Parameters: - SlurmVersion - ManagedAccounting - AccountingPolicyEnforcement - Label: default: PCS ComputeNodeGroups configuration Parameters: - NodeArchitecture - KeyName - ClientIpCidr - Label: default: HPC Recipes configuration Parameters: - HpcRecipesS3Bucket - HpcRecipesBranch

La metadata sección de una CloudFormation plantilla proporciona información sobre la propia plantilla. La plantilla de ejemplo crea un clúster de computación de alto rendimiento (HPC) completo que utiliza AWS PCS. La sección de metadatos de la plantilla de ejemplo declara los parámetros que controlan la forma en que CloudFormation se lanza (aprovisiona) la pila correspondiente. Hay parámetros que controlan la elección de la arquitectura (NodeArchitecture), la versión de Slurm (SlurmVersion) y los controles de acceso (KeyNameyClientIpCidr).

Parameters

La Parameters sección define los parámetros personalizados de la plantilla. CloudFormation usa estas definiciones de parámetros para crear y validar el formulario con el que interactúas cuando lanzas una pila desde esta plantilla.

Parameters: NodeArchitecture: Type: String Default: x86 AllowedValues: - x86 - Graviton Description: Processor architecture for the login and compute node instances SlurmVersion: Type: String Default: 25.11 Description: Version of Slurm to use AllowedValues: - 25.05 - 25.11 ManagedAccounting: Type: String Default: 'disabled' AllowedValues: - 'enabled' - 'disabled' Description: Monitor cluster usage, manage access control, and enforce resource limits with Slurm accounting. AccountingPolicyEnforcement: Description: Specify which Slurm accounting policies to enforce Type: String Default: none AllowedValues: - none - 'associations,limits,safe' KeyName: Description: SSH keypair to log in to the head node Type: AWS::EC2::KeyPair::KeyName AllowedPattern: ".+" # Required ClientIpCidr: Description: IP(s) allowed to access the login node over SSH. We recommend that you restrict it with your own IP/subnet (x.x.x.x/32 for your own ip or x.x.x.x/24 for range. Replace x.x.x.x with your own PUBLIC IP. You can get your public IP using tools such as https://ifconfig.co/) Default: 127.0.0.1/32 Type: String AllowedPattern: (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2}) ConstraintDescription: Value must be a valid IP or network range of the form x.x.x.x/x. HpcRecipesS3Bucket: Type: String Default: aws-hpc-recipes Description: HPC Recipes for AWS S3 bucket AllowedValues: - aws-hpc-recipes - aws-hpc-recipes-dev HpcRecipesBranch: Type: String Default: main Description: HPC Recipes for AWS release branch AllowedPattern: '^(?!.*/\.git$)(?!.*/\.)(?!.*\\.\.)[a-zA-Z0-9-_\.]+$'

Mapeos

MappingsEn la sección se definen los pares clave-valor que especifican los valores en función de determinadas condiciones o dependencias.

Mappings: Architecture: AmiArchParameter: Graviton: arm64 x86: x86_64 LoginNodeInstances: Graviton: c7g.xlarge x86: c6i.xlarge ComputeNodeInstances: Graviton: c7g.xlarge x86: c6i.xlarge

Recursos

La Resources sección declara los AWS recursos que se van a aprovisionar y configurar como parte de la pila.

Resources: [...]

La plantilla aprovisiona la infraestructura de clústeres de muestra en capas. Comienza con la configuración Networking de la VPC. El almacenamiento lo proporcionan dos sistemas: EfsStorage para el almacenamiento compartido y FSxLStorage para el almacenamiento de alto rendimiento. El clúster principal se establece mediantePCSCluster.

Networking: Type: AWS::CloudFormation::Stack Properties: Parameters: ProvisionSubnetsC: "False" TemplateURL: !Sub 'https://${HpcRecipesS3Bucket}.s3.amazonaws.com/${HpcRecipesBranch}/recipes/net/hpc_large_scale/assets/main.yaml' EfsStorage: Type: AWS::CloudFormation::Stack Properties: Parameters: SubnetIds: !GetAtt [ Networking, Outputs.DefaultPrivateSubnet ] SubnetCount: 1 VpcId: !GetAtt [ Networking, Outputs.VPC ] TemplateURL: !Sub 'https://${HpcRecipesS3Bucket}.s3.amazonaws.com/${HpcRecipesBranch}/recipes/storage/efs_simple/assets/main.yaml' FSxLStorage: Type: AWS::CloudFormation::Stack Properties: Parameters: PerUnitStorageThroughput: 125 SubnetId: !GetAtt [ Networking, Outputs.DefaultPrivateSubnet ] VpcId: !GetAtt [ Networking, Outputs.VPC ] TemplateURL: !Sub 'https://${HpcRecipesS3Bucket}.s3.amazonaws.com/${HpcRecipesBranch}/recipes/storage/fsx_lustre/assets/persistent.yaml' [...] # Cluster PCSCluster: Type: AWS::PCS::Cluster Properties: Name: !Sub '${AWS::StackName}' Size: SMALL Scheduler: Type: SLURM Version: !Ref SlurmVersion Networking: SubnetIds: - !GetAtt [ Networking, Outputs.DefaultPrivateSubnet ] SecurityGroupIds: - !GetAtt [ PCSSecurityGroup, Outputs.ClusterSecurityGroupId ]

Para los recursos de procesamiento, la plantilla crea dos grupos de nodos: PCSNodeGroupLogin para un único nodo de inicio de sesión y PCSNodeGroupCompute para un máximo de cuatro nodos de procesamiento. Estos grupos de nodos son compatibles con los permisos y, PCSInstanceProfile por PCSLaunchTemplate ejemplo, con las configuraciones.

# Compute Node groups PCSInstanceProfile: Type: AWS::CloudFormation::Stack Properties: Parameters: # We have to regionalize this in case CX use the template in more than one region. Otherwise, # the create action will fail since instance-role-${AWS::StackName} already exists! RoleName: !Sub '${AWS::StackName}-${AWS::Region}' TemplateURL: !Sub 'https://${HpcRecipesS3Bucket}.s3.amazonaws.com/${HpcRecipesBranch}/recipes/pcs/getting_started/assets/pcs-iip-minimal.yaml' PCSLaunchTemplate: Type: AWS::CloudFormation::Stack Properties: Parameters: VpcDefaultSecurityGroupId: !GetAtt [ Networking, Outputs.SecurityGroup ] ClusterSecurityGroupId: !GetAtt [ PCSSecurityGroup, Outputs.ClusterSecurityGroupId ] SshSecurityGroupId: !GetAtt [ PCSSecurityGroup, Outputs.InboundSshSecurityGroupId ] EfsFilesystemSecurityGroupId: !GetAtt [ EfsStorage, Outputs.SecurityGroupId ] FSxLustreFilesystemSecurityGroupId: !GetAtt [ FSxLStorage, Outputs.FSxLustreSecurityGroupId ] SshKeyName: !Ref KeyName TemplateURL: !Sub 'https://${HpcRecipesS3Bucket}.s3.amazonaws.com/${HpcRecipesBranch}/recipes/pcs/getting_started/assets/cfn-pcs-lt-efs-fsxl.yaml' # Compute Node groups - Login Nodes PCSNodeGroupLogin: Type: AWS::PCS::ComputeNodeGroup Properties: ClusterId: !GetAtt [PCSCluster, Id] Name: login ScalingConfiguration: MinInstanceCount: 1 MaxInstanceCount: 1 IamInstanceProfileArn: !GetAtt [ PCSInstanceProfile, Outputs.InstanceProfileArn ] CustomLaunchTemplate: TemplateId: !GetAtt [ PCSLaunchTemplate, Outputs.LoginLaunchTemplateId ] Version: 1 SubnetIds: - !GetAtt [ Networking, Outputs.DefaultPublicSubnet ] AmiId: !GetAtt [PcsSampleAmi, AmiId] InstanceConfigs: - InstanceType: !FindInMap [ Architecture, LoginNodeInstances, !Ref NodeArchitecture ] # Compute Node groups - Compute Nodes PCSNodeGroupCompute: Type: AWS::PCS::ComputeNodeGroup Properties: ClusterId: !GetAtt [PCSCluster, Id] Name: compute-1 ScalingConfiguration: MinInstanceCount: 0 MaxInstanceCount: 4 IamInstanceProfileArn: !GetAtt [ PCSInstanceProfile, Outputs.InstanceProfileArn ] CustomLaunchTemplate: TemplateId: !GetAtt [ PCSLaunchTemplate, Outputs.ComputeLaunchTemplateId ] Version: 1 SubnetIds: - !GetAtt [ Networking, Outputs.DefaultPrivateSubnet ] AmiId: !GetAtt [PcsSampleAmi, AmiId] InstanceConfigs: - InstanceType: !FindInMap [ Architecture, ComputeNodeInstances, !Ref NodeArchitecture ]

Ambos grupos de nodos incluyen un NodeLifecycleActions bloque que monta el almacenamiento compartido y reenvía los registros de nodos a Amazon CloudWatch Logs en ese momento. nodeBootstrapped Esto reemplaza el enfoque anterior de montar los sistemas de archivos mediante datos de usuario de plantillas de lanzamiento. Amazon EFS se monta en /home los directorios principales de los usuarios y FSx for Lustre se monta allí para un almacenamiento desde cero de alto rendimiento/shared. Una cuarta acción reenvía los registros de acciones del ciclo de vida de los nodos a Amazon Logs. CloudWatch Las acciones de montaje y directorio se utilizan EVERY_BOOT para ejecutarse cada vez que se reinicia y mantener el almacenamiento disponible, mientras que se configure-cloudwatch-logs utilizan FIRST_BOOT_ONLY porque la configuración del CloudWatch agente persiste una vez que se reinicia y no es necesario volver a aplicarlas. Para obtener más información sobre las acciones del ciclo de vida de los nodos, consulte. Acciones del ciclo de vida del nodo Para obtener más información sobre los scripts que se AWS mantienen, consulteAWS-guiones mantenidos.

NodeLifecycleActions: ScriptCachingPolicy: CACHE_ONCE Stages: NodeBootstrapped: # Forward node lifecycle action logs to CloudWatch Logs. Runs first so the # actions that follow have their output captured from the node's first boot. - Name: configure-cloudwatch-logs ScriptSource: ScriptLocation: !Sub 's3://aws-pcs-repo-${AWS::Region}/aws-pcs-node-lifecycle-scripts/configure-cloudwatch-logs-v1-latest.sh' OnError: CONTINUE ExecutionPolicy: FIRST_BOOT_ONLY # Mount EFS as the home-directory base at /home and create home dirs on first login. - Name: configure-efs-homes ScriptSource: ScriptLocation: !Sub 's3://aws-pcs-repo-${AWS::Region}/aws-pcs-node-lifecycle-scripts/configure-efs-homes-v1-latest.sh' Arguments: - '--efs-id' - !GetAtt [ EfsStorage, Outputs.EFSFilesystemId ] - '--home-base' - '/home' - '--options' - 'tls' OnError: CONTINUE ExecutionPolicy: EVERY_BOOT # Mount FSx for Lustre at /shared for high-performance shared scratch storage. - Name: mount-fsx-lustre ScriptSource: ScriptLocation: !Sub 's3://aws-pcs-repo-${AWS::Region}/aws-pcs-node-lifecycle-scripts/mount-fsx-lustre-v1-latest.sh' Arguments: - '--fsx-dns-name' - !GetAtt FSxLustreLookup.DNSName - '--mount-name' - !GetAtt FSxLustreLookup.MountName - '--mount-point' - '/shared' OnError: CONTINUE ExecutionPolicy: EVERY_BOOT # Set /shared to world-writable sticky mode (1777). Runs after mount-fsx-lustre # so it applies to the mounted file system, not an empty directory. - Name: set-shared-dir-mode ScriptSource: ScriptLocation: !Sub 'https://${HpcRecipesS3Bucket}.s3.us-east-1.amazonaws.com/${HpcRecipesBranch}/recipes/pcs-scripts/open_shared_dir/assets/set-shared-dir-mode-v1.0.0.sh' Arguments: - '--path' - '/shared' - '--mode' - '1777' OnError: CONTINUE ExecutionPolicy: EVERY_BOOT

La programación de los trabajos se gestiona de forma exhaustivaPCSQueueCompute.

PCSQueueCompute: Type: AWS::PCS::Queue Properties: ClusterId: !GetAtt [PCSCluster, Id] Name: demo ComputeNodeGroupConfigurations: - ComputeNodeGroupId: !GetAtt [PCSNodeGroupCompute, Id]

La selección de la AMI se realiza automáticamente a través de la función PcsAMILookupFn Lambda y los recursos relacionados.

PcsAMILookupRole: Type: AWS::IAM::Role [...] PcsAMILookupFn: Type: AWS::Lambda::Function Properties: Runtime: python3.12 Handler: index.handler Role: !GetAtt PcsAMILookupRole.Arn Code: [...] Timeout: 30 MemorySize: 128 # Example of using the custom resource to look up an AMI PcsSampleAmi: Type: Custom::AMILookup Properties: ServiceToken: !GetAtt PcsAMILookupFn.Arn OperatingSystem: 'amzn2' Architecture: !FindInMap [ Architecture, AmiArchParameter, !Ref NodeArchitecture ] SlurmVersion: !Ref SlurmVersion

Outputs

La plantilla genera las URL de identificación y administración de clústeres mediante ClusterIdPcsConsoleUrl, y. Ec2ConsoleUrl

Outputs: ClusterId: Description: The Id of the PCS cluster Value: !GetAtt [ PCSCluster, Id ] PcsConsoleUrl: Description: URL to access the cluster in the PCS console Value: !Sub - https://${ConsoleDomain}/pcs/home?region=${AWS::Region}#/clusters/${ClusterId} - { ConsoleDomain: !If [ GovCloud, 'console.amazonaws-us-gov.com', !If [ China, 'console.amazonaws.cn', !Sub '${AWS::Region}.console.aws.amazon.com']], ClusterId: !GetAtt [ PCSCluster, Id ] } Export: Name: !Sub ${AWS::StackName}-PcsConsoleUrl Ec2ConsoleUrl: Description: URL to access instance(s) in the login node group via Session Manager Value: !Sub - https://${ConsoleDomain}/ec2/home?region=${AWS::Region}#Instances:instanceState=running;tag:aws:pcs:compute-node-group-id=${NodeGroupLoginId} - { ConsoleDomain: !If [ GovCloud, 'console.amazonaws-us-gov.com', !If [ China, 'console.amazonaws.cn', !Sub '${AWS::Region}.console.aws.amazon.com']], NodeGroupLoginId: !GetAtt [ PCSNodeGroupLogin, Id ] } Export: Name: !Sub ${AWS::StackName}-Ec2ConsoleUrl