Ejemplo de componentes de AWS CloudFormation - AWS Proton

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 componentes de AWS CloudFormation

A continuación, se muestra un ejemplo completo de un componente definido directamente de AWS Proton y de cómo se puede utilizar en un servicio de AWS Proton. 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 abarca la creación de varios archivos obligatorios de infraestructuras como código (IaC) de AWS CloudFormation y la creación de un rol de AWS Identity and Access Management (IAM) obligatorio. El ejemplo agrupa los pasos según los roles de las personas propietarias.

Pasos de administrador

Para permitir a los desarrolladores utilizar componentes con un servicio
  1. Cree un rol de AWS Identity and Access Management (IAM) que reduzca los recursos que pueden aprovisionar los componentes definidos directamente que se ejecutan en el entorno. AWS Proton asume este rol más adelante para aprovisionar componentes directamente definidos en el entorno.

    Para este ejemplo, utilice la siguiente política:

    ejemplo Rol de componente definido directamente
    { "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" } } } ] }
  2. Proporcione el rol que creó en el paso anterior al crear o actualizar el entorno. En la consola de AWS Proton, especifique un Rol de componente en la página Configurar entorno. Si utiliza la API de AWS Proton o la AWS CLI, especifique el componentRoleArn de las acciones de la API CreateEnvironment o UpdateEnvironment.

  3. 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.

    ejemplo archivo de IaC de servicio de CloudFormation 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: # ...
  4. 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 consola de AWS Proton, al crear una versión de plantilla de servicio, en Orígenes de componentes compatibles, elija Definición directa. Si utiliza la API de AWS Proton o la AWS CLI, especifique DIRECTLY_DEFINED en el parámetro supportedComponentSources de las acciones de la API CreateServiceTemplateVersion o UpdateServiceTemplateVersion.

    • 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.

  5. Publique la nueva versión secundaria de la plantilla de servicio. Para obtener más información, consulte Registro y publicación de plantillas.

  6. 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

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.

  2. 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.

    ejemplo archivo de IaC de componente de CloudFormation
    # 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
  3. Si utiliza la API de AWS Proton o la AWS CLI, escriba un archivo de manifiesto para el componente.

    ejemplo manifiesto de componentes definidos directamente
    infrastructure: templates: - file: "cloudformation.yaml" rendering_engine: jinja template_language: cloudformation
  4. Cree un componente definido directamente. AWS Proton asume el rol de componente que el administrador definió para aprovisionar el componente.

    En la consola de AWS Proton, en la página Componentes, 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 AWS 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 utiliza la API de AWS Proton o la AWS CLI, utilice la acción de la API CreateComponent. 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 estos dos elementos es única en su cuenta de AWS, y AWS Proton puede determinar el entorno a partir de la instancia de servicio.

  5. Actualice la instancia de servicio para volver a implementarla. AWS Proton utiliza las salidas del componente en la plantilla de instancia de servicio representada para permitir que la aplicación utilice el bucket de Amazon S3 que el componente aprovisionó.