Como implantar artefatos no Amazon S3 em uma conta diferente da AWS usando o CodePipeline?

11 minuto de leitura
0

Quero implantar artefatos em um bucket do Amazon Simple Storage Service (Amazon S3) em uma conta diferente. Também quero definir a conta de destino como proprietária do objeto. Existe uma maneira de fazer isso usando o AWS CodePipeline com um provedor de ações de implantação do Amazon S3?

Resolução

Observação: o procedimento de exemplo a seguir pressupõe o seguinte:

  • Você tem duas contas: uma conta de desenvolvimento e uma conta de produção.
  • O bucket de entrada na conta de desenvolvimento é denominado codepipeline-input-bucket (com versionamento ativado).
  • O bucket de artefatos padrão na conta de desenvolvimento é denominado codepipeline-us-east-1-0123456789.
  • O bucket de saída na conta de produção é denominado codepipeline-output-bucket.
  • Você está implantando artefatos da conta de desenvolvimento em um bucket do S3 na conta de produção.
  • Você está assumindo um perfil entre contas criada na conta de produção para implantar os artefatos. O perfil torna a conta de produção a proprietária do objeto em vez da conta de desenvolvimento. Para fornecer ao proprietário do bucket na conta de produção acesso aos objetos pertencentes à conta de desenvolvimento, consulte o artigo a seguir: Como implantar artefatos no Amazon S3 em uma conta diferente da AWS usando o CodePipeline e uma ACL predefinida?

Crie uma chave do AWS KMS para usar com o CodePipeline na conta de desenvolvimento

Importante: você deve usar a chave gerenciada pelo cliente do AWS Key Management Service (AWS KMS) para implantações entre contas. Se a chave não estiver configurada, o CodePipeline criptografará os objetos com criptografia padrão, que não pode ser descriptografada pelo perfil na conta de destino.

1.    Abra o console do AWS KMS na conta de desenvolvimento.

2.    No painel de navegação, selecione Chaves gerenciadas pelo cliente.

3.    Selecione Criar chave.

4.    Em Tipo de chave, escolha Chave simétrica.

5.    Expanda Opções avançadas.

6.    Em Origem do material de chave, selecione KMS. Em seguida, escolha Avançar.

7.    Em Alias, insira o alias da sua chave. Por exemplo: s3deploykey.

8.    Selecione Avançar. A página Definir permissões administrativas de chave será aberta.

9.    Na seção Administradores de chaves, selecione um usuário ou perfil do AWS Identity and Access Management (IAM) como administrador de chaves.

  1. Escolha Avançar. A página Definir permissões de uso de chave será aberta.

11.    Na seção Outras contas da AWS, selecione Adicionar outra conta da AWS.

12.    Na caixa de texto exibida, adicione o ID da conta de produção. Em seguida, escolha Avançar.

Observação: você também pode selecionar um perfil de serviço existente na seção Esta conta. Se você selecionar um perfil de serviço existente, ignore as etapas na seção Atualizar a política de uso do KMS na seção conta de desenvolvimento.

13.    Analise a política de chave. Em seguida, selecione Concluir.

Crie um CodePipeline na conta de desenvolvimento

1.    Abra o console do CodePipeline. Em seguida, selecione Criar pipeline.

2.    Em Nome do pipeline, insira um nome para o pipeline. Por exemplo: crossaccountdeploy.

Observação: a caixa de texto Nome do perfil é preenchida automaticamente com o nome do perfil de serviço AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy. Você também pode escolher outro perfil de serviço existente com acesso à chave do KMS.

3.    Expanda a seção Configurações avançadas.

4.    Em Armazenamento de artefatos, selecione Local padrão.
Observação: você pode selecionar Local personalizado se isso for necessário para seu caso de uso.

5.    Em Chave de criptografia, selecione Chave gerenciada pelo cliente.

6.    Para a Chave gerenciada pelo cliente do KMS, selecione o alias da chave na lista (s3deploykey, para este exemplo). Em seguida, escolha Avançar. A página Adicionar estágio de origem será aberta.

  1. Em Provedor de origem, selecione Amazon S3.

8.    Em Bucket, insira o nome do seu bucket S3 de entrada de desenvolvimento. Por exemplo: codepipeline-input-bucket.

Importante: o bucket de entrada deve ter o versionamento ativado para funcionar com o CodePipeline.

9.    Em Chave de objeto do S3, digite sample-website.zip.

Importante: para usar um exemplo de site da AWS em vez do seu próprio site, consulte o Tutorial: criar um pipeline que usa o Amazon S3 como provedor de implantação. Em seguida, pesquise por "exemplo de site estático" nos Pré-requisitos da seção 1: implantar arquivos estáticos do site no Amazon S3.

10.    Em Opções de detecção de alterações, selecione Amazon CloudWatch Events (recomendado). Em seguida, escolha Avançar.

11.    Na página Adicionar estágio de construção, selecione Ignorar estágio de construção. Em seguida, selecione Ignorar.

12.    Na página Adicionar estágio de implantação, em Provedor de implantação, selecione Amazon S3.

13.    Em Região, selecione a região da AWS em que seu bucket S3 de saída de produção está. Por exemplo: Leste dos EUA (Virgínia do Norte).

Importante: se a região do bucket de saída de produção for diferente da região do seu pipeline, você também deverá verificar o se:

14.    Em Bucket, insira o nome do seu bucket S3 de saída de produção. Por exemplo: codepipeline-output-bucket.

15.    Marque a caixa de seleção Extrair arquivo antes de implantar.
Observação: se necessário, insira um caminho em Caminho de implantação.

16.    Selecione Avançar.

17.    Selecione Criar pipeline. O pipeline é executado, mas o estágio de origem falha. O seguinte erro aparece: "O objeto com a chave 'site-de-amostra.zip' não existe."

A seção Faça o upload do site de amostra para o bucket de entrada deste artigo descreve como resolver esse erro.

Atualize a política de uso do KMS na conta de desenvolvimento

Importante: ignore esta seção se você estiver usando um perfil de serviço existente do CodePipeline.

1.    Abra o console do AWS KMS na conta de desenvolvimento.

2.    Selecione o alias da sua chave (s3deploykey, para este exemplo).

3.    Na seção Usuários da chave, selecione Adicionar.

4.    Na caixa de pesquisa, insira o perfil de serviço AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy.

5.    Selecione Adicionar.

Configure um perfil entre contas na conta de produção

Crie uma política do IAM para o perfil que conceda permissões do Amazon S3 ao seu bucket S3 de saída de produção

1.    Abra o console do IAM na conta de produção.

2.    No painel de navegação, selecione Políticas. Em seguida, selecione Criar política.

3.    Selecione a guia JSON. Em seguida, insira a seguinte política no editor JSON:

Importante: substitua codepipeline-output-bucket pelo nome do seu bucket S3 de saída de produção.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Put*"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-output-bucket/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-output-bucket"
      ]
    }
  ]
}

4.    Selecione Política de revisão.

5.    Em Nome, insira um nome para a política. Por exemplo: outputbucketdeployaccess.

6.    Selecione Criar política.

Crie uma política do IAM para o perfil que conceda as permissões necessárias do KMS

1.    No console do IAM, selecione Criar política.

2.    Selecione a guia JSON. Em seguida, insira a seguinte política no editor JSON:

Observação: substitua o ARN da chave do KMS que você criou. Substitua codepipeline-us-east-1-0123456789 pelo nome do bucket de artefatos na conta de desenvolvimento.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:DescribeKey",
        "kms:GenerateDataKey*",
        "kms:Encrypt",
        "kms:ReEncrypt*",
        "kms:Decrypt"
      ],
      "Resource": [
        "arn:aws:kms:us-east-1:<dev-account-id>:key/<key id>"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-us-east-1-0123456789/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-us-east-1-0123456789"
      ]
    }
  ]
}

3.    Selecione Política de revisão.

4.    Em Nome, insira um nome para a política. Por exemplo: devkmss3access.

5.    Selecione Criar política.

**Crie um perfil entre contas que a conta de desenvolvimento possa assumir para implantar os artefatos **

1.    Abra o console do IAM na conta de produção.

2.    No painel de navegação, selecione Perfis. Em seguida, selecione Criar perfil.

3.    Selecione Outra conta da AWS.

4.    Em ID da conta, insira o ID da conta da AWS da conta de desenvolvimento.

5.    Selecione Avançar: permissões.

6.    Na lista de políticas, selecione outputbucketdeployaccess e devkmss3access.

7.    Selecione Avançar: etiquetas.

8.    (Opcional) Adicione etiquetas e selecione Próximo: revisão.

9.    Em Nome do perfil, insira prods3role.

10.    Selecione Criar perfil.

11.    Na lista de perfis, selecione prods3role.

12.    Escolha a Relação de confiança. Em seguida, selecione Editar Relações de confiança.

13.    No editor de Documentos de política, insira a seguinte política:

Importante: substitua dev-account-id pelo ID da conta da AWS da sua conta de desenvolvimento. Substitua AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy pelo nome do perfil de serviço do seu pipeline.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::<dev-account-id>:role/service-role/AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy"
        ]
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}

14.    Selecione Atualizar política de confiança.

Atualize a política de bucket para o bucket de artefatos do CodePipeline na conta de desenvolvimento

1.    Abra o console do Amazon S3 na conta de desenvolvimento.

2.    Na lista Nome do bucket, selecione o nome do seu bucket de artefatos em sua conta de desenvolvimento (neste exemplo, codepipeline-us-east-1-0123456789).

3.    Selecione Permissões. Em seguida, selecione Política do bucket.

4.    No editor de texto, atualize sua política existente para incluir as seguintes declarações de política:

Importante: para alinhar com a formatação JSON adequada, adicione uma vírgula após as instruções existentes. Substitua prod-account-id pelo ID da conta da AWS da sua conta de produção. Substitua codepipeline-us-east-1-0123456789 pelo nome do seu bucket de artefatos.

{
    "Sid": "",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::<prod-account-id>:root"
    },
    "Action": [
        "s3:Get*",
        "s3:Put*"
    ],
    "Resource": "arn:aws:s3:::codepipeline-us-east-1-0123456789/*"
},
{
    "Sid": "",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::<prod-account-id>:root"
    },
    "Action": "s3:ListBucket",
    "Resource": "arn:aws:s3:::codepipeline-us-east-1-0123456789"
}

5.    Selecione Salvar.

Anexe uma política ao seu perfil de serviço do CodePipeline na conta de desenvolvimento que permita que ele assuma o perfil entre contas que foi criado

1.    Abra o console do IAM na conta de desenvolvimento.

2.    No painel de navegação, selecione Políticas. Em seguida, selecione Criar política.

3.    Selecione a guia JSON. Em seguida, insira a seguinte política no editor JSON:

Importante: substitua prod-account-id pelo ID da conta da AWS da sua conta de produção.

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": [
      "arn:aws:iam::<prod-account-id>:role/prods3role"
    ]
  }
}

4.    Selecione Política de revisão.

5.    Em Nome, insira assumeprods3role.

6.    Selecione Criar política.

7.    No painel de navegação, selecione Perfis. Em seguida, selecione o nome do perfil de serviço para seu pipeline (neste exemplo, AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy).

8.    Selecione Anexar políticas. Em seguida, selecione assumeprods3role.

9.    Escolha Anexar política.

Atualize seu pipeline para usar o perfil entre contas na conta de desenvolvimento

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), verifique se está usando a versão mais recente da AWS CLI.

1.    Recupere a definição do pipeline em um arquivo chamado codepipeline.json executando o seguinte comando da AWS CLI:

Importante: substitua crossaccountdeploy pelo nome do seu pipeline.

aws codepipeline get-pipeline --name crossaccountdeploy > codepipeline.json

2.    Adicione o ARN do perfil IAM entre contas (roleArn) à seção de ação de implantação do arquivo codepipeline.json. Para obter mais informações, consulte Referência de estrutura de pipeline do CodePipeline no guia do usuário do CodePipeline.

**Exemplo de roleArn do IAM entre contas **

"roleArn": "arn:aws:iam::your-prod-account id:role/prods3role",

Exemplo de ação de implantação que inclui um ARN de perfil do IAM entre contas

Importante: substitua o valor prod-account-id pelo ID da conta da AWS da sua conta de produção.

{
  "name": "Deploy",
  "actions": [
    {
      "name": "Deploy",
      "actionTypeId": {
        "category": "Deploy",
        "owner": "AWS",
        "provider": "S3",
        "version": "1"
      },
      "runOrder": 1,
      "configuration": {
        "BucketName": "codepipeline-output-bucket",
        "Extract": "true"
      },
      "outputArtifacts": [],
      "inputArtifacts": [
        {
          "name": "SourceArtifact"
        }
      ],
      "roleArn": "arn:aws:iam::<prod-account-id>:role/prods3role",
      "region": "us-east-1",
      "namespace": "DeployVariables"
    }
  ]
}

3.    Remova a seção de metadados no final do arquivo codepipeline.json.

Importante: certifique-se de remover também a vírgula que antecede seção de metadados.

**Exemplo de seção de metadados **

"metadata": {
    "pipelineArn": "arn:aws:codepipeline:us-east-1:<dev-account-id>:crossaccountdeploy",
    "created": 1587527378.629,
    "updated": 1587534327.983
}

4.    Atualize o pipeline executando o seguinte comando:

aws codepipeline update-pipeline --cli-input-json file://codepipeline.json

Faça o upload do site de amostra para o bucket de entrada

1.    Abra o console do Amazon S3 na conta de desenvolvimento.

2.    Na lista Nome do bucket, selecione seu bucket S3 de entrada de desenvolvimento. Por exemplo: codepipeline-input-bucket.

3.    Selecione Fazer upload. Em seguida, selecione Adicionar arquivos.

4.    Selecione o arquivo sample-website.zip baixado anteriormente.

5.    Selecione Fazer upload para executar o pipeline. Quando o pipeline é executado, o seguinte ocorre:

  • A ação de origem seleciona sample-website.zip do bucket S3 de entrada de desenvolvimento (codepipeline-input-bucket). Em seguida, a ação de origem coloca o arquivo zip como um artefato de origem dentro do bucket de artefatos na conta de desenvolvimento (codepipeline-us-east-1-0123456789).
  • Na ação de implantação, o perfil de serviço do CodePipeline (AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy) assume o perfil entre contas (prods3role) na conta de produção.
  • O CodePipeline usa o perfil entre contas (prods3role) para acessar a chave do KMS e o bucket de artefatos na conta de desenvolvimento. Em seguida, o CodePipeline implanta os arquivos extraídos no bucket S3 de saída de produção (codepipeline-output-bucket) na conta de produção.

Observação: a conta de produção é a proprietária dos objetos extraídos no bucket S3 de saída de produção (codepipeline-output-bucket).


AWS OFICIAL
AWS OFICIALAtualizada há 2 anos