

Aviso de fin del soporte: el 7 de octubre de 2026 AWS finalizará el soporte para AWS Proton. Después del 7 de octubre de 2026, ya no podrás acceder a la AWS Proton consola ni a AWS Proton los recursos. La infraestructura implementada permanecerá intacta. Para obtener más información, consulte la [Guía AWS Proton de obsolescencia y migración del servicio](https://docs.aws.amazon.com/proton/latest/userguide/proton-end-of-support.html).

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.

# Ejemplo de componente CloudFormation
<a name="ag-components-example-cfn"></a>

A continuación, se muestra un ejemplo completo de un componente definido AWS Proton directamente y de cómo se puede utilizar en un AWS Proton servicio. El componente aprovisiona un bucket de Amazon Simple Storage Service (Amazon S3) y una política de acceso relacionada. La instancia de servicio puede hacer referencia a este bucket y utilizarlo. El nombre del bucket se basa en los nombres del entorno, el servicio, la instancia de servicio y el componente, lo que significa que el bucket está asociado a una instancia específica de la plantilla del componente que amplía una instancia de servicio específica. Los desarrolladores pueden crear varios componentes en función de esta plantilla de componentes para aprovisionar buckets de Amazon S3 para distintas instancias de servicio y necesidades funcionales.

El ejemplo describe la creación de las distintas CloudFormation infraestructuras necesarias en forma de archivos de código (IaC) y la creación de un rol obligatorio AWS Identity and Access Management (IAM). El ejemplo agrupa los pasos según los roles de las personas propietarias.

## Pasos de administrador
<a name="ag-components-example-cfn.admin"></a>

**Para permitir a los desarrolladores utilizar componentes con un servicio**

1. Cree una función AWS Identity and Access Management (IAM) que abarque los recursos que pueden aprovisionar los componentes definidos directamente que se ejecutan en su entorno. AWS Proton asume esta función más adelante para aprovisionar componentes directamente definidos en el entorno.

   Para este ejemplo, utilice la siguiente política:  
**Example Rol de componente definido directamente**  

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "cloudformation:CancelUpdateStack",
           "cloudformation:CreateChangeSet",
           "cloudformation:DeleteChangeSet",
           "cloudformation:DescribeStacks",
           "cloudformation:ContinueUpdateRollback",
           "cloudformation:DetectStackResourceDrift",
           "cloudformation:DescribeStackResourceDrifts",
           "cloudformation:DescribeStackEvents",
           "cloudformation:CreateStack",
           "cloudformation:DeleteStack",
           "cloudformation:UpdateStack",
           "cloudformation:DescribeChangeSet",
           "cloudformation:ExecuteChangeSet",
           "cloudformation:ListChangeSets",
           "cloudformation:ListStackResources"
         ],
         "Resource": "arn:aws:cloudformation:*:123456789012:stack/AWSProton-*"
       },
       {
         "Effect": "Allow",
         "Action": [
           "s3:CreateBucket",
           "s3:DeleteBucket",
           "s3:GetBucket*",
           "iam:CreatePolicy",
           "iam:DeletePolicy",
           "iam:GetPolicy",
           "iam:ListPolicyVersions",
           "iam:DeletePolicyVersion"
         ],
         "Resource": "*",
         "Condition": {
           "ForAnyValue:StringEquals": {
             "aws:CalledVia": "cloudformation.amazonaws.com"
           }
         }
       }
     ]
   }
   ```

------

1. Proporcione el rol que creó en el paso anterior al crear o actualizar el entorno. En la AWS Proton consola, especifique una **función de componente** en la página de **configuración del entorno**. Si utilizas la AWS Proton API o AWS CLI, especifica la [CreateEnvironment](https://docs.aws.amazon.com/proton/latest/APIReference/API_CreateEnvironment.html)o las acciones `componentRoleArn` de la [UpdateEnvironment](https://docs.aws.amazon.com/proton/latest/APIReference/API_UpdateEnvironment.html)API.

1. Cree una plantilla de servicio que haga referencia a un componente definido directamente conectado a la instancia de servicio.

   El ejemplo muestra cómo escribir una plantilla de servicio sólida que no se rompa si un componente no estuviera conectado a la instancia de servicio.  
**Example CloudFormation repare el archivo IaC mediante un componente**  

   ```
   # service/instance_infrastructure/cloudformation.yaml
   
   Resources: 
     TaskDefinition:
       Type: AWS::ECS::TaskDefinition
       Properties:
         TaskRoleArn: !Ref TaskRole
         ContainerDefinitions:
           - Name: '{{service_instance.name}}'
             # ...
             {% if service_instance.components.default.outputs | length > 0 %}
             Environment:
               {{ service_instance.components.default.outputs |
                   proton_cfn_ecs_task_definition_formatted_env_vars }}
             {% endif %}
   
     # ...
   
     TaskRole:
       Type: AWS::IAM::Role
       Properties:
         # ...
         ManagedPolicyArns:
           - !Ref BaseTaskRoleManagedPolicy
           {{ service_instance.components.default.outputs
               | proton_cfn_iam_policy_arns }}
   
     # Basic permissions for the task
     BaseTaskRoleManagedPolicy:
       Type: AWS::IAM::ManagedPolicy
       Properties:
         # ...
   ```

1. Cree una nueva versión secundaria de la plantilla de servicio que declare compatibles los componentes definidos directamente.
   + **Paquete de plantillas en Amazon S3**: en la AWS Proton consola, al crear una versión de plantilla de servicio, en **Fuentes de componentes compatibles**, elija **Directly defined**. Si utiliza la AWS Proton API o AWS CLI, especifique `DIRECTLY_DEFINED` en el `supportedComponentSources` parámetro de la [CreateServiceTemplateVersion](https://docs.aws.amazon.com/proton/latest/APIReference/API_CreateServiceTemplateVersion.html)o las acciones de la [UpdateServiceTemplateVersion](https://docs.aws.amazon.com/proton/latest/APIReference/API_UpdateServiceTemplateVersion.html)API.
   + **Sincronización de plantillas**: confirme un cambio en el repositorio del paquete de plantillas de servicio, donde especifique `DIRECTLY_DEFINED` como elemento de `supported_component_sources:` en el archivo `.template-registration.yaml` del directorio de versiones principales. Para obtener más información acerca de este archivo, consulte [Sincronización de plantillas de servicio](create-template-sync.md#create-template-sync-service-templates).

1. Publique la nueva versión secundaria de la plantilla de servicio. Para obtener más información, consulte [Registro y publicación de plantillas](template-create.md).

1. Asegúrese de permitir el permiso `proton:CreateComponent` en el rol de IAM de los desarrolladores que utilicen esta plantilla de servicio.

## Pasos para desarrolladores
<a name="ag-components-example-cfn.dev"></a>

**Para utilizar un componente definido directamente con una instancia de servicio**

1. Cree un servicio que utilice la versión de la plantilla de servicio que el administrador creó con la ayuda de los componentes. Como alternativa, actualice una de sus instancias de servicio existentes para utilizar la última versión de la plantilla.

1. Escriba un archivo de plantilla de IaC de componentes que aprovisione un bucket de Amazon S3 y una política de acceso relacionada y exponga estos recursos como salidas.  
**Example componente ( CloudFormation archivo iAC)**  

   ```
   # cloudformation.yaml
   
   # A component that defines an S3 bucket and a policy for accessing the bucket.
   Resources:
     S3Bucket:
       Type: AWS::S3::Bucket
       Properties:
         BucketName: '{{environment.name}}-{{service.name}}-{{service_instance.name}}-{{component.name}}'
     S3BucketAccessPolicy:
       Type: AWS::IAM::ManagedPolicy
       Properties:
         PolicyDocument:
           Version: "2012-10-17"		 	 	 
           Statement:
             - Effect: Allow
               Action:
                 - 's3:Get*'
                 - 's3:List*'
                 - 's3:PutObject'
               Resource: !GetAtt S3Bucket.Arn
   Outputs:
     BucketName:
       Description: "Bucket to access"
       Value: !GetAtt S3Bucket.Arn
     BucketAccessPolicyArn:
       Value: !Ref S3BucketAccessPolicy
   ```

1. Si utilizas la AWS Proton API o AWS CLI, escribe un archivo de manifiesto para el componente.  
**Example manifiesto de componentes definidos directamente**  

   ```
   infrastructure:
     templates:
       - file: "cloudformation.yaml"
         rendering_engine: jinja
         template_language: cloudformation
   ```

1. Cree un componente definido directamente. AWS Proton asume la función de componente que el administrador definió para aprovisionar el componente.

   En la AWS Proton consola, en la página [Componentes](https://console.aws.amazon.com//proton/#/components), elija **Crear componente**. En **Configuración de componentes**, introduzca un **Nombre del componente** y una **Descripción del componente** opcional. En **Conexión de componentes**, elija **Conectar el componente a una instancia de servicio.** Seleccione el entorno, el servicio y la instancia de servicio. En **Origen del componente**, elija **CloudFormation** y, a continuación, elija el archivo de IaC del componente.
**nota**  
No es necesario proporcionar un manifiesto, ya que la consola lo crea automáticamente.

   Si usas la AWS Proton API o AWS CLI, usa la acción de la [CreateComponent](https://docs.aws.amazon.com/proton/latest/APIReference/API_CreateComponent.html)API. Establezca el `name` del componente y una `description` opcional. Establezca `environmentName`, `serviceName` y `serviceInstanceName`. Establezca `templateSource` y `manifest` para las rutas de los archivos que ha creado.
**nota**  
La especificación de un nombre de entorno es opcional cuando se especifican los nombres de los servicios y de las instancias de servicio. La combinación de estas dos es única en tu AWS cuenta y AWS Proton puede determinar el entorno a partir de la instancia de servicio.

1. Actualice la instancia de servicio para volver a implementarla. AWS Proton utiliza los resultados de su componente en la plantilla de instancia de servicio renderizada para permitir que su aplicación utilice el bucket de Amazon S3 que el componente aprovisionó.