Exemplo de componente do AWS CloudFormation - AWS Proton

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Exemplo de componente do AWS CloudFormation

Aqui está um exemplo completo de um componente definido diretamente do AWS Proton e como você pode usá-lo em um serviço do AWS Proton. O componente diretamente definido provisiona um bucket do Amazon Simple Storage Service (Amazon S3) e uma política de acesso relacionada. A instância de serviço pode se referir a esse bucket e usá-lo. O nome do bucket é baseado nos nomes do ambiente, serviço, instância de serviço e componente, o que significa que o bucket é acoplado a uma instância específica do modelo de componente que estende uma instância de serviço específica. Os desenvolvedores podem criar vários componentes com base nesse modelo de componente para provisionar buckets do Amazon S3 para diferentes instâncias de serviço e necessidades funcionais.

O exemplo abrange a criação dos vários arquivos de infraestrutura como código (IaC) do AWS CloudFormation necessários e a criação de um perfil do IAM do AWS Identity and Access Management necessário. O exemplo agrupa etapas de acordo com os perfis das pessoas proprietárias.

Etapas do administrador

Para permitir que os desenvolvedores usem componentes com um serviço
  1. Crie um perfil do (IAM) do AWS Identity and Access Management que defina os recursos que os componentes diretamente definidos em execução em seu ambiente podem provisionar. O AWS Protonassume esse perfil posteriormente para provisionar componentes diretamente definidos no ambiente.

    Para este exemplo, use a seguinte política:

    exemplo perfil de componente diretamente definido
    { "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. Forneça o perfil que você criou na etapa anterior ao criar ou atualizar o ambiente. No console do AWS Proton, especifique um perfil de componente na página Configurar ambiente. Se você estiver usando a AWS Proton API ou o AWS CLI, especifique o componentRoleArn das ações da API CreateEnvironment ou UpdateEnvironment.

  3. Crie um modelo de serviço que se refira a um componente diretamente definido anexado à instância de serviço.

    O exemplo mostra como escrever um modelo de serviço robusto que não falha se um componente não estiver anexado à instância do serviço.

    exemplo arquivo de serviço CloudFormation IaC usando um 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. Crie uma nova versão secundária do modelo de serviço que declare os componentes diretamente definidos como compatíveis.

    • Pacote de modelos no Amazon S3 – No console do AWS Proton, ao criar uma versão de modelo de serviço, para Fontes de componentes compatíveis, escolha Definido diretamente. Se você estiver usando a AWS Proton API ou o AWS CLI, especifique DIRECTLY_DEFINED no parâmetro supportedComponentSources das ações de API CreateServiceTemplateVersion ou UpdateServiceTemplateVersion.

    • Sincronização de modelos – Confirme uma alteração no repositório do pacote de modelos de serviço, onde você especifica DIRECTLY_DEFINED como um item supported_component_sources: no arquivo .template-registration.yaml no diretório da versão principal. Para obter mais informações sobre esse arquivo, consulte Como sincronizar modelos de serviço.

  5. Concede permissão para criar uma versão secundária do modelo de serviço. Para obter mais informações, consulte Registre e publique modelos.

  6. Certifique-se de permitir no proton:CreateComponent o perfil do IAM dos desenvolvedores que usam esse modelo de serviço.

Etapas do desenvolvedor

Para usar um componente definido diretamente com uma instância de serviço
  1. Crie um serviço que use a versão do modelo de serviço que o administrador criou com suporte a componentes. Como alternativa, atualize uma de suas instâncias de serviço existentes para usar a versão mais recente do modelo.

  2. Escreva um arquivo de modelo de componente IaC que provisione um bucket do Amazon S3 e uma política de acesso relacionada e exponha esses recursos como saídas.

    exemplo arquivo componente CloudFormation 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
  3. Se você estiver usando a AWS Proton API ou o AWS CLI, escreva um arquivo de manifesto para o componente.

    exemplo manifesto de componente definido diretamente
    infrastructure: templates: - file: "cloudformation.yaml" rendering_engine: jinja template_language: cloudformation
  4. Crie um componente definido diretamente. O AWS Proton assume o perfil do componente que o administrador definiu para provisionar o componente.

    No console do AWS Proton, na página Componentes, escolha Criar componente. Em Configurações do componente, insira o Nome do componente e opcionalmente uma Descrição do componente. Em Anexação de componente, escolha Anexar o componente a uma instância de serviço. Selecione seu ambiente, serviço e instância de serviço. Em Origem do componente, escolha e AWS CloudFormation, em seguida, escolha o arquivo IaC do componente.

    nota

    Você não precisa fornecer um manifesto — o console cria um para você.

    Se você estiver usando a AWS Proton API ou o AWS CLI, use a ação da API CreateComponent. Defina um componente name e opcionalmente description. Definir environmentName, serviceName, e serviceInstanceName. Defina templateSource e manifest para os caminhos dos arquivos que você criou.

    nota

    Especificar um nome de ambiente é opcional quando você especifica nomes de serviço e instância de serviço. A combinação desses dois é exclusiva em sua conta do AWS e o AWS Proton pode determinar o ambiente a partir da instância de serviço.

  5. Atualize sua instância de serviço para reimplantá-la. O AWS Proton usa saídas do seu componente no modelo de instância de serviço renderizado para permitir que seu aplicativo use o bucket do Amazon S3 que o componente provisionou.