Para atualizar um pipeline de sondagem para usar a detecção de alterações baseada em eventos, consulte . - AWS CodePipeline

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

Para atualizar um pipeline de sondagem para usar a detecção de alterações baseada em eventos, consulte .

O AWS CodePipeline oferece suporte completo à entrega contínua, o qual inclui o início do pipeline sempre que houver uma alteração no código. Há duas maneiras de iniciar o pipeline após uma alteração no código: Recomendamos usar a detecção de alterações baseada em eventos para pipelines.

Use os procedimentos incluídos aqui para migrar (atualizar) seus pipelines de enquete para o método de detecção de alterações baseado em eventos do seu pipeline.

O método recomendado de detecção de alterações baseado em eventos para pipelines é determinado pela fonte do pipeline, como o CodeCommit. Nesse caso, por exemplo, o pipeline de pesquisa precisaria migrar para a detecção de alterações baseada em eventos com o EventBridge.

Como migrar os pipelines de votação

Para migrar os pipelines de sondagem, determine seus pipelines de sondagem e, em seguida, determine o método recomendado de detecção de alterações baseado em eventos:

  • Use as etapas Visualizar os pipelines de votação em sua conta para determinar seus canais de votação.

  • Na tabela, encontre o tipo de origem do pipeline e escolha o procedimento com a implementação que você deseja usar para migrar o pipeline de sondagem. Cada seção contém vários métodos de migração, como o uso da CLI ou. AWS CloudFormation

Como migrar pipelines para o método de detecção de alterações recomendado
Fonte do pipeline Método recomendado de detecção baseado em eventos Procedimentos de migração
AWS CodeCommit EventBridge (recomendado). Consulte Migre pipelines de pesquisa com uma fonte do CodeCommit.
Amazon S3 EventBridge e bucket habilitados para notificações de eventos (recomendado). Consulte Migre pipelines de votação com uma fonte S3 habilitada para eventos.
Amazon S3 EventBridge e uma AWS CloudTrail trilha. Consulte Migre pipelines de votação com uma fonte do S3 e uma trilha do CloudTrail.
GitHub versão 1 Conexões (recomendadas) Consulte Migre os pipelines de enquete de uma ação de origem do GitHub versão 1 para conexões.
GitHub versão 1 Webhooks Consulte Migre os pipelines de enquete de uma ação de origem do GitHub versão 1 para webhooks.
Importante

Para atualizações de configuração de ações de pipeline aplicáveis, como pipelines com uma ação do GitHub versão 1, você deve definir explicitamente PollForSourceChanges o parâmetro como false na configuração da sua ação Source para interromper a pesquisa de um pipeline. Como resultado, é possível configurar um pipeline de forma errada com detecção de alterações com base em eventos e sondagem, por exemplo, configurando uma regra do e também omitindo o parâmetro . Isso resulta em execuções de pipeline duplicadas, e o pipeline é contabilizado em relação ao limite no número total de pipelines de sondagem, que, por padrão é muito inferior aos pipelines com base em eventos. Para obter mais informações, consulte Cotas no AWS CodePipeline.

Visualizar os pipelines de votação em sua conta

Como primeira etapa, use um dos scripts a seguir para determinar quais pipelines em sua conta estão configurados para votação. Esses são os canais para migrar para a detecção de alterações baseada em eventos.

Visualizar pipelines de votação em sua conta (script)

Siga estas etapas para usar um script para determinar os pipelines em sua conta que estão usando enquetes.

  1. Abra o Mail e execute uma das seguintes ações:

    • Execute o comando a seguir para criar um novo script chamado PollingPipelinesExtractor.sh.

      vi PollingPipelinesExtractor.sh
    • Para usar um script python, execute o comando a seguir para criar um novo script python chamado PollingPipelinesExtractor.py.

      vi PollingPipelinesExtractor.py
  2. Copie o código a seguir no script PollingPipelinesExtractor. Faça um dos seguintes procedimentos:

    • Copie o código a seguir no script PollingPipelinesExtractor.sh.

      #!/bin/bash set +x POLLING_PIPELINES=() LAST_EXECUTED_DATES=() NEXT_TOKEN=null HAS_NEXT_TOKEN=true if [[ $# -eq 0 ]] ; then echo 'Please provide region name' exit 0 fi REGION=$1 while [ "$HAS_NEXT_TOKEN" != "false" ]; do if [ "$NEXT_TOKEN" != "null" ]; then LIST_PIPELINES_RESPONSE=$(aws codepipeline list-pipelines --region $REGION --next-token $NEXT_TOKEN) else LIST_PIPELINES_RESPONSE=$(aws codepipeline list-pipelines --region $REGION) fi LIST_PIPELINES=$(jq -r '.pipelines[].name' <<< "$LIST_PIPELINES_RESPONSE") NEXT_TOKEN=$(jq -r '.nextToken' <<< "$LIST_PIPELINES_RESPONSE") if [ "$NEXT_TOKEN" == "null" ]; then HAS_NEXT_TOKEN=false fi for pipline_name in $LIST_PIPELINES do PIPELINE=$(aws codepipeline get-pipeline --name $pipline_name --region $REGION) HAS_POLLABLE_ACTIONS=$(jq '.pipeline.stages[].actions[] | select(.actionTypeId.category == "Source") | select(.actionTypeId.owner == ("ThirdParty","AWS")) | select(.actionTypeId.provider == ("GitHub","S3","CodeCommit")) | select(.configuration.PollForSourceChanges == ("true",null))' <<< "$PIPELINE") if [ ! -z "$HAS_POLLABLE_ACTIONS" ]; then POLLING_PIPELINES+=("$pipline_name") PIPELINE_EXECUTIONS=$(aws codepipeline list-pipeline-executions --pipeline-name $pipline_name --region $REGION) LAST_EXECUTION=$(jq -r '.pipelineExecutionSummaries[0]' <<< "$PIPELINE_EXECUTIONS") if [ "$LAST_EXECUTION" != "null" ]; then LAST_EXECUTED_TIMESTAMP=$(jq -r '.startTime' <<< "$LAST_EXECUTION") LAST_EXECUTED_DATE="$(date -r ${LAST_EXECUTED_TIMESTAMP%.*})" else LAST_EXECUTED_DATE="Not executed in last year" fi LAST_EXECUTED_DATES+=("$LAST_EXECUTED_DATE") fi done done fileName=$REGION-$(date +%s) printf "| %-30s | %-30s |\n" "Polling Pipeline Name" "Last Executed Time" printf "| %-30s | %-30s |\n" "_____________________" "__________________" for i in "${!POLLING_PIPELINES[@]}"; do printf "| %-30s | %-30s |\n" "${POLLING_PIPELINES[i]}" "${LAST_EXECUTED_DATES[i]}" printf "${POLLING_PIPELINES[i]}," >> $fileName.csv done printf "\nSaving Polling Pipeline Names to file $fileName.csv."
    • Copie o código a seguir no script PollingPipelinesExtractor.py.

      import boto3 import sys import time import math hasNextToken = True nextToken = "" pollablePipelines = [] lastExecutedTimes = [] if len(sys.argv) == 1: raise Exception("Please provide region name.") session = boto3.Session(profile_name='default', region_name=sys.argv[1]) codepipeline = session.client('codepipeline') def is_pollable_action(action): actionTypeId = action['actionTypeId'] configuration = action['configuration'] return actionTypeId['owner'] in {"AWS", "ThirdParty"} and actionTypeId['provider'] in {"GitHub", "CodeCommit", "S3"} and ('PollForSourceChanges' not in configuration or configuration['PollForSourceChanges'] == 'true') def has_pollable_actions(pipeline): hasPollableAction = False pipelineDefinition = codepipeline.get_pipeline(name=pipeline['name'])['pipeline'] for action in pipelineDefinition['stages'][0]['actions']: hasPollableAction = is_pollable_action(action) if hasPollableAction: break return hasPollableAction def get_last_executed_time(pipelineName): pipelineExecutions=codepipeline.list_pipeline_executions(pipelineName=pipelineName)['pipelineExecutionSummaries'] if pipelineExecutions: return pipelineExecutions[0]['startTime'].strftime("%A %m/%d/%Y, %H:%M:%S") else: return "Not executed in last year" while hasNextToken: if nextToken=="": list_pipelines_response = codepipeline.list_pipelines() else: list_pipelines_response = codepipeline.list_pipelines(nextToken=nextToken) if 'nextToken' in list_pipelines_response: nextToken = list_pipelines_response['nextToken'] else: hasNextToken= False for pipeline in list_pipelines_response['pipelines']: if has_pollable_actions(pipeline): pollablePipelines.append(pipeline['name']) lastExecutedTimes.append(get_last_executed_time(pipeline['name'])) fileName="{region}-{timeNow}.csv".format(region=sys.argv[1],timeNow=math.trunc(time.time())) file = open(fileName, 'w') print ("{:<30} {:<30} {:<30}".format('Polling Pipeline Name', '|','Last Executed Time')) print ("{:<30} {:<30} {:<30}".format('_____________________', '|','__________________')) for i in range(len(pollablePipelines)): print("{:<30} {:<30} {:<30}".format(pollablePipelines[i], '|', lastExecutedTimes[i])) file.write("{pipeline},".format(pipeline=pollablePipelines[i])) file.close() print("\nSaving Polling Pipeline Names to file {fileName}".format(fileName=fileName))
  3. Para cada região em que você tem pipelines, você deve executar o script para essa região. Para executar o script, faça o seguinte:

    • Execute o comando a seguir para executar o script chamado PollingPipelinesExtractor.sh. Neste exemplo, a região é definida como us-west-2.

      ./PollingPipelinesExtractor.sh us-west-2
    • Para o script python, execute o comando a seguir para executar o script python chamado PollingPipelinesExtractor.py. Neste exemplo, a região é definida como us-west-2.

      python3 PollingPipelinesExtractor.py us-west-2

    No exemplo de saída do script a seguir, a Região us-west-2 retornou uma lista de pipelines de sondagem e mostra o horário da última execução de cada pipeline.

    % ./pollingPipelineExtractor.sh us-west-2 | Polling Pipeline Name | Last Executed Time | | _____________________ | __________________ | | myCodeBuildPipeline | Wed Mar 8 09:35:49 PST 2023 | | myCodeCommitPipeline | Mon Apr 24 22:32:32 PDT 2023 | | TestPipeline | Not executed in last year | Saving list of polling pipeline names to us-west-2-1682496174.csv...%

    Analise a saída do script e, para cada pipeline na lista, atualize a fonte de pesquisa para o método recomendado de detecção de alterações baseado em eventos.

    nota

    Seus pipelines de pesquisa são determinados pela configuração de ação do pipeline para o PollForSourceChanges parâmetro. Se a configuração da fonte do pipeline tiver o PollForSourceChanges parâmetro omitido, o CodePipeline usará como padrão pesquisar alterações na fonte em seu repositório. Esse comportamento será o mesmo quando o estiver incluído e definido como . Para obter mais informações, consulte os parâmetros de configuração da ação de origem do seu pipeline, como os parâmetros de configuração da ação de origem do Amazon S3 em. Ação de origem do Amazon S3

    Observe que esse script também gera um arquivo.csv contendo a lista de canais de pesquisa em sua conta e salva o arquivo.csv na pasta de trabalho atual.

Migre pipelines de pesquisa com uma fonte do CodeCommit

Você pode migrar seu pipeline de votação para usar o EventBridge para detectar alterações no seu repositório de origem do CodeCommit ou no seu bucket de origem do Amazon S3.

CodeCommit -- Para um pipeline com uma fonte do CodeCommit, modifique o pipeline para que a detecção de alterações seja automatizada por meio do EventBridge. Escolha um dos seguintes métodos para implementar a migração:

Migrar canais de votação (fonte do CodeCommit ou Amazon S3) (console)

Você pode usar o console do para atualizar seu pipeline para usar o para detectar alterações em seu repositório de origem do ou em seu bucket de origem do .

nota

Ao usar o console para editar um pipeline que tem um repositório de origem do ou um bucket de origem do , a regra e a função do IAM são criadas para você. Se usar a para editar o pipeline, você mesmo deverá criar a regra do e a função do IAM. Para obter mais informações, consulte CodeCommit ações de origem e EventBridge.

Siga essas etapas para editar um pipeline que conduz verificações periódicas. Se você deseja criar um pipeline, consulte Crie um pipeline em CodePipeline.

Para editar o estágio de origem do pipeline
  1. Faça login no console em AWS Management Consolehttp://console.aws.amazon.com/codesuite/codepipeline/home.

    Os nomes de todos os pipelines associados à sua conta da AWS são exibidos.

  2. Em Nome, selecione o nome do pipeline que você deseja editar. Isso abrirá um visão detalhada do pipeline, incluindo o estado de cada uma das ações em cada estágio do pipeline.

  3. Na página de detalhes do pipeline, selecione Editar.

  4. Em Edit stage (Editar estágio), selecione o ícone de edição na ação de origem.

  5. Expanda Change Detection Options (Opções de detecção de alterações) e selecione Use CloudWatch Events to automatically start my pipeline when a change occurs (recommended) (Usar o CloudWatch Events para iniciar automaticamente o pipeline quando ocorrer uma alteração (recomendado)).

    É exibida uma mensagem que mostra a regra do a ser criada para esse pipeline. Escolha Atualizar.

    Se estiver atualizando um pipeline que tem uma origem do , você verá a mensagem a seguir. Escolha Atualizar.

  6. Quando terminar de editar seu pipeline, selecione Salvar alterações do pipeline para voltar à página de resumo.

    Uma mensagem exibe o nome da regra do a ser criada para o pipeline. Escolha Save and continue.

  7. Para testar a ação, utilize a AWS CLI para confirmar uma mudança à origem especificada no estágio de origem do pipeline para que seja possível liberar uma alteração.

Migrar pipelines de pesquisa (fonte do CodeCommit) (CLI)

Siga essas etapas para fazer com que um pipeline que conduz sondagem (verificações periódicas) passe a utilizar uma regra do para iniciar o pipeline. Se você deseja criar um pipeline, consulte Crie um pipeline em CodePipeline.

Para criar um pipeline baseado em eventos com o , edite o parâmetro de seu pipeline e crie os seguintes recursos:

  • Eventos EventBridge

  • Função do IAM para permitir que esse evento inicie o pipeline

Editar o parâmetro PollForSourceChanges do pipeline
Importante

Ao criar um pipeline com esse método, o parâmetro PollForSourceChanges é padronizado como verdadeiro se não for explicitamente definido como falso. Ao adicionar a detecção de alterações baseada em eventos, é necessário adicionar o parâmetro a sua saída e defini-lo como falso para desativar a sondagem. Caso contrário, o pipeline inicia duas vezes para uma única alteração de origem. Para obter mais detalhes, consulte Configurações padrão do parâmetro PollForSourceChanges.

  1. Execute o get-pipeline comando para copiar a estrutura do pipeline em um arquivo JSON. Por exemplo, para um pipeline nomeado MyFirstPipeline, execute o seguinte comando:

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

    Este comando retorna nada, mas o arquivo que você criou deve aparecer no diretório onde você executou o comando.

  2. Abra o arquivo JSON em qualquer editor de texto plano e altere o PollForSourceChanges parâmetro false para editar o estágio de origem, como mostrado no exemplo a seguir.

    Por que estou fazendo essa alteração? A alteração deste parâmetro para false desativa as verificações periódicas para que você possa utilizar apenas a detecção de alterações baseada em eventos.

    "configuration": { "PollForSourceChanges": "false", "BranchName": "main", "RepositoryName": "MyTestRepo" },
  3. Se você estiver trabalhando com a estrutura do pipeline recuperada por meio do comando get-pipeline, remova as linhas metadata do arquivo JSON. Caso contrário, o comando update-pipeline não é capaz de utilizá-la. Remova as linhas "metadata": { }, "created", "pipelineARN" e os campos "updated".

    Por exemplo, remova as seguintes linhas da estrutura:

    "metadata": { "pipelineArn": "arn:aws:codepipeline:region:account-ID:pipeline-name", "created": "date", "updated": "date" },

    Salve o arquivo.

  4. Para aplicar suas alterações, execute o comando update-pipeline especificando o arquivo JSON do pipeline:

    Importante

    Não se esqueça de incluir file:// antes do nome de arquivo. Ele é obrigatório nesse comando.

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

    Este comando retorna toda a estrutura do pipeline editado.

    nota

    O comando update-pipeline interrompe o pipeline. Se uma revisão estiver sendo executada pelo pipeline quando você executar o comando update-pipeline, essa execução será interrompida. Você deve iniciar manualmente o pipeline para executar a revisão através do pipeline atualizado. Use o comando start-pipeline-execution para iniciar manualmente o pipeline.

Para criar uma regra do com como origem do evento e como destino
  1. Adicionar permissões para o usar o para chamar a regra. Para obter mais informações sobre como usar políticas baseadas em recursos para o , consulte o .

    1. Use o exemplo a seguir para criar a política de confiança que permite ao assumir a função de serviço. Nomeie a política de confiança trustpolicyforEB.json.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
    2. Use o comando a seguir para criar a função Role-for-MyRule e anexar a política de confiança.

      aws iam create-role --role-name Role-for-MyRule --assume-role-policy-document file://trustpolicyforEB.json
    3. Crie o JSON de política de permissões, conforme mostrado neste exemplo, para o pipeline denominado MyFirstPipeline. Nomeie a politica de permissões permissionspolicyforEB.json.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codepipeline:StartPipelineExecution" ], "Resource": [ "arn:aws:codepipeline:us-west-2:80398EXAMPLE:MyFirstPipeline" ] } ] }
    4. Use o comando a seguir para anexar a política de permissões CodePipeline-Permissions-Policy-for-EB à função Role-for-MyRule.

      Por que estou fazendo essa alteração? A adição dessa política à função cria permissões para .

      aws iam put-role-policy --role-name Role-for-MyRule --policy-name CodePipeline-Permissions-Policy-For-EB --policy-document file://permissionspolicyforEB.json
  2. Use o comando put-rule e inclua os parâmetros --name, --event-pattern e --role-arn.

    Por que estou fazendo essa alteração? Esse comando permite que o AWS CloudFormation crie o evento.

    O comando de exemplo a seguir cria uma regra chamada MyCodeCommitRepoRule.

    aws events put-rule --name "MyCodeCommitRepoRule" --event-pattern "{\"source\":[\"aws.codecommit\"],\"detail-type\":[\"CodeCommit Repository State Change\"],\"resources\":[\"repository-ARN\"],\"detail\":{\"referenceType\":[\"branch\"],\"referenceName\":[\"main\"]}}" --role-arn "arn:aws:iam::ACCOUNT_ID:role/Role-for-MyRule"
  3. Para adicionar o como destino, chame o comando e inclua os seguintes parâmetros:

    • O parâmetro --rule é usado com rule_name criado por meio de put-rule.

    • O parâmetro --targets é usado com o Id da lista do destino na lista de destinos e o ARN do pipeline de destino.

    O exemplo de comando a seguir especifica que, para a regra chamada MyCodeCommitRepoRule, o Id do destino é composto do número um, indicando que, em uma lista de destinos para a regra, esse é o destino 1. O exemplo de comando também especifica um exemplo ARN para o pipeline. O pipeline é iniciado quando uma alteração é feita no repositório.

    aws events put-targets --rule MyCodeCommitRepoRule --targets Id=1,Arn=arn:aws:codepipeline:us-west-2:80398EXAMPLE:TestPipeline

Migrar pipelines de pesquisa (fonte do CodeCommit) (modelo) AWS CloudFormation

Para criar um pipeline baseado em eventos do AWS CodeCommit, edite o parâmetro PollForSourceChanges de seu pipeline e adicione os seguintes recursos em seu modelo:

  • Regras do EventBridge

  • Uma função do IAM para a regra do CloudWatch Events

Ao utilizar o AWS CloudFormation para criar e gerenciar seus pipelines, o modelo inclui um conteúdo semelhante ao seguinte:

nota

A propriedade Configuration no estágio de origem denominado PollForSourceChanges. Se essa propriedade não estiver incluída em seu modelo, PollForSourceChanges será definido como true por padrão.

YAML
Resources: AppPipeline: Type: AWS::CodePipeline::Pipeline Properties: Name: codecommit-polling-pipeline RoleArn: !GetAtt CodePipelineServiceRole.Arn Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Version: 1 Provider: CodeCommit OutputArtifacts: - Name: SourceOutput Configuration: BranchName: !Ref BranchName RepositoryName: !Ref RepositoryName PollForSourceChanges: true RunOrder: 1
JSON
"Stages": [ { "Name": "Source", "Actions": [{ "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "AWS", "Version": 1, "Provider": "CodeCommit" }, "OutputArtifacts": [{ "Name": "SourceOutput" }], "Configuration": { "BranchName": { "Ref": "BranchName" }, "RepositoryName": { "Ref": "RepositoryName" }, "PollForSourceChanges": true }, "RunOrder": 1 }] },
Atualizar o modelo do do pipeline e criar a regra do
  1. No modelo, em Resources, use o recurso AWS::IAM::Role do AWS CloudFormation para configurar a função do IAM que habilita o evento a iniciar seu pipeline. Essa entrada cria uma função que utiliza duas políticas:

    • A primeira política permite que a função seja assumida.

    • A segunda política fornece permissões para iniciar o pipeline.

    Por que estou fazendo essa alteração? A adição do recurso AWS::IAM::Role possibilita que o crie permissões para . Esse recurso é adicionado à sua pilha do AWS CloudFormation.

    YAML
    EventRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - events.amazonaws.com Action: sts:AssumeRole Path: / Policies: - PolicyName: eb-pipeline-execution PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: codepipeline:StartPipelineExecution Resource: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ]
    JSON
    "EventRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "events.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "eb-pipeline-execution", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "codepipeline:StartPipelineExecution", "Resource": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ...
  2. No modelo, em Resources, utilize o recurso AWS::Events::Rule do para adicionar uma regra do . Esse padrão de evento cria um evento que monitora as alterações push no seu repositório. Quando o EventBridge detecta uma alteração no estado do repositório, a regra é StartPipelineExecution invocada em seu pipeline de destino.

    Por que estou fazendo essa alteração? A adição do recurso AWS::Events::Rule permite que o AWS CloudFormation crie o evento. Esse recurso é adicionado à sua pilha do AWS CloudFormation.

    YAML
    EventRule: Type: AWS::Events::Rule Properties: EventPattern: source: - aws.codecommit detail-type: - 'CodeCommit Repository State Change' resources: - !Join [ '', [ 'arn:aws:codecommit:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref RepositoryName ] ] detail: event: - referenceCreated - referenceUpdated referenceType: - branch referenceName: - main Targets: - Arn: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] RoleArn: !GetAtt EventRole.Arn Id: codepipeline-AppPipeline
    JSON
    "EventRule": { "Type": "AWS::Events::Rule", "Properties": { "EventPattern": { "source": [ "aws.codecommit" ], "detail-type": [ "CodeCommit Repository State Change" ], "resources": [ { "Fn::Join": [ "", [ "arn:aws:codecommit:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "RepositoryName" } ] ] } ], "detail": { "event": [ "referenceCreated", "referenceUpdated" ], "referenceType": [ "branch" ], "referenceName": [ "main" ] } }, "Targets": [ { "Arn": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] }, "RoleArn": { "Fn::GetAtt": [ "EventRole", "Arn" ] }, "Id": "codepipeline-AppPipeline" } ] } },
  3. Salve o modelo atualizado em seu computador local e abra o console do AWS CloudFormation.

  4. Selecione sua pilha e clique em Create Change Set for Current Stack (Criar conjunto de alterações para a pilha atual).

  5. Carregue o modelo e visualize as alterações listadas no AWS CloudFormation. Essas são as alterações a serem feitas na pilha. Seus novos recursos devem ser exibidos na lista.

  6. Escolha Executar.

Editar o parâmetro PollForSourceChanges do pipeline
Importante

Em muitos casos, o parâmetro PollForSourceChanges é padronizado como verdadeiro ao criar um pipeline. Ao adicionar a detecção de alterações baseada em eventos, é necessário adicionar o parâmetro a sua saída e defini-lo como falso para desativar a sondagem. Caso contrário, o pipeline inicia duas vezes para uma única alteração de origem. Para obter mais detalhes, consulte Configurações padrão do parâmetro PollForSourceChanges.

  • No modelo, altere PollForSourceChanges para false. Se você não incluir PollForSourceChanges na sua definição de pipeline, adicione-o e configure para false.

    Por que estou fazendo essa alteração? A alteração deste parâmetro para false desativa as verificações periódicas para que você possa utilizar apenas a detecção de alterações baseada em eventos.

    YAML
    Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Version: 1 Provider: CodeCommit OutputArtifacts: - Name: SourceOutput Configuration: BranchName: !Ref BranchName RepositoryName: !Ref RepositoryName PollForSourceChanges: false RunOrder: 1
    JSON
    { "Name": "Source", "Actions": [ { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "AWS", "Version": 1, "Provider": "CodeCommit" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "BranchName": { "Ref": "BranchName" }, "RepositoryName": { "Ref": "RepositoryName" }, "PollForSourceChanges": false }, "RunOrder": 1 } ] },

Ao criar esses recursos com o AWS CloudFormation, o pipeline é acionado quando os arquivos presentes no repositório são criados ou atualizados. Aqui está o trecho do modelo final:

YAML
Resources: EventRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - events.amazonaws.com Action: sts:AssumeRole Path: / Policies: - PolicyName: eb-pipeline-execution PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: codepipeline:StartPipelineExecution Resource: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] EventRule: Type: AWS::Events::Rule Properties: EventPattern: source: - aws.codecommit detail-type: - 'CodeCommit Repository State Change' resources: - !Join [ '', [ 'arn:aws:codecommit:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref RepositoryName ] ] detail: event: - referenceCreated - referenceUpdated referenceType: - branch referenceName: - main Targets: - Arn: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] RoleArn: !GetAtt EventRole.Arn Id: codepipeline-AppPipeline AppPipeline: Type: AWS::CodePipeline::Pipeline Properties: Name: codecommit-events-pipeline RoleArn: !GetAtt CodePipelineServiceRole.Arn Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Version: 1 Provider: CodeCommit OutputArtifacts: - Name: SourceOutput Configuration: BranchName: !Ref BranchName RepositoryName: !Ref RepositoryName PollForSourceChanges: false RunOrder: 1 ...
JSON
"Resources": { ... "EventRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "events.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "eb-pipeline-execution", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "codepipeline:StartPipelineExecution", "Resource": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] } } ] } } ] } }, "EventRule": { "Type": "AWS::Events::Rule", "Properties": { "EventPattern": { "source": [ "aws.codecommit" ], "detail-type": [ "CodeCommit Repository State Change" ], "resources": [ { "Fn::Join": [ "", [ "arn:aws:codecommit:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "RepositoryName" } ] ] } ], "detail": { "event": [ "referenceCreated", "referenceUpdated" ], "referenceType": [ "branch" ], "referenceName": [ "main" ] } }, "Targets": [ { "Arn": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] }, "RoleArn": { "Fn::GetAtt": [ "EventRole", "Arn" ] }, "Id": "codepipeline-AppPipeline" } ] } }, "AppPipeline": { "Type": "AWS::CodePipeline::Pipeline", "Properties": { "Name": "codecommit-events-pipeline", "RoleArn": { "Fn::GetAtt": [ "CodePipelineServiceRole", "Arn" ] }, "Stages": [ { "Name": "Source", "Actions": [ { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "AWS", "Version": 1, "Provider": "CodeCommit" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "BranchName": { "Ref": "BranchName" }, "RepositoryName": { "Ref": "RepositoryName" }, "PollForSourceChanges": false }, "RunOrder": 1 } ] }, ...

Migre pipelines de votação com uma fonte S3 habilitada para eventos

Para um pipeline com uma fonte do Amazon S3, modifique o pipeline para que a detecção de alterações seja automatizada por meio do EventBridge e com um bucket de origem habilitado para notificações de eventos. Esse é o método recomendado se você estiver usando a CLI ou AWS CloudFormation para migrar seu pipeline.

nota

Isso inclui o uso de um bucket habilitado para notificações de eventos, onde você não precisa criar uma trilha separada do CloudTrail. Se você estiver usando o console, uma regra de evento e uma trilha do CloudTrail estão configuradas para você. Para a etapa líquida, consulte Migre pipelines de votação com uma fonte do S3 e uma trilha do CloudTrail.

Migre pipelines de pesquisa com uma fonte S3 habilitada para eventos (CLI)

Siga essas etapas para fazer com que um pipeline que conduz sondagem (verificações periódicas) passe a utilizar um evento no . Se você deseja criar um pipeline, consulte Crie um pipeline em CodePipeline.

Para criar um pipeline baseado em eventos com o , edite o parâmetro de seu pipeline e crie os seguintes recursos:

  • Regra de evento do EventBridge

  • Função do IAM para permitir que o evento do inicie o pipeline

Para criar uma regra do com o como origem do evento e o como o destino e aplicar as políticas de permissões
  1. Conceda ao as permissões necessárias para usar o para invocar a regra. Para obter mais informações sobre como usar políticas baseadas em recursos para o , consulte o .

    1. Use o exemplo a seguir para criar a política de confiança que permita ao assumir a função de serviço. Chame-o de trustpolicyforEB.json.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
    2. Use o comando a seguir para criar a função Role-for-MyRule e anexar a política de confiança.

      Por que estou fazendo essa alteração? A adição dessa política de confiança à função cria permissões para .

      aws iam create-role --role-name Role-for-MyRule --assume-role-policy-document file://trustpolicyforEB.json
    3. Crie o JSON da política de permissões, conforme mostrado aqui para o pipeline chamado MyFirstPipeline. Nomeie a politica de permissões permissionspolicyforEB.json.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codepipeline:StartPipelineExecution" ], "Resource": [ "arn:aws:codepipeline:us-west-2:80398EXAMPLE:MyFirstPipeline" ] } ] }
    4. Use o comando a seguir para anexar a nova política de permissões CodePipeline-Permissions-Policy-for-EB à função Role-for-MyRule criada.

      aws iam put-role-policy --role-name Role-for-MyRule --policy-name CodePipeline-Permissions-Policy-For-EB --policy-document file://permissionspolicyforEB.json
  2. Use o comando put-rule e inclua os parâmetros --name, --event-pattern e --role-arn.

    O exemplo de comando a seguir cria uma regra chamada EnabledS3SourceRule.

    aws events put-rule --name "EnabledS3SourceRule" --event-pattern "{\"source\":[\"aws.s3\"],\"detail-type\":[\"Object Created\"],\"detail\":{\"bucket\":{\"name\":[\"my-bucket\"]}}}" --role-arn "arn:aws:iam::ACCOUNT_ID:role/Role-for-MyRule"
  3. Para adicionar o put-targets como destino, use o comando --rule e inclua os parâmetros e .

    O comando a seguir especifica que, para a regra denominada EnabledS3SourceRule, o Id do destino é composto do número um, indicando que, em uma lista de destinos para a regra, esse é o destino 1. O comando também especifica um ARN de exemplo para o pipeline. O pipeline é iniciado quando uma alteração é feita no repositório.

    aws events put-targets --rule EnabledS3SourceRule --targets Id=codepipeline-AppPipeline,Arn=arn:aws:codepipeline:us-west-2:80398EXAMPLE:TestPipeline
Editar o parâmetro PollForSourceChanges do pipeline
Importante

Ao criar um pipeline com esse método, o parâmetro PollForSourceChanges é padronizado como verdadeiro se não for explicitamente definido como falso. Ao adicionar a detecção de alterações baseada em eventos, é necessário adicionar o parâmetro a sua saída e defini-lo como falso para desativar a sondagem. Caso contrário, o pipeline inicia duas vezes para uma única alteração de origem. Para obter mais detalhes, consulte Configurações padrão do parâmetro PollForSourceChanges.

  1. Execute o get-pipeline comando para copiar a estrutura do pipeline em um arquivo JSON. Por exemplo, para um pipeline nomeado MyFirstPipeline, execute o seguinte comando:

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

    Este comando retorna nada, mas o arquivo que você criou deve aparecer no diretório onde você executou o comando.

  2. Abra o arquivo JSON em qualquer editor de texto plano e, para editar o estágio de origem, altere o parâmetro PollForSourceChanges de um bucket denominado storage-bucket para false, conforme mostrado neste exemplo.

    Por que estou fazendo essa alteração? A configuração deste parâmetro para false desativa as verificações periódicas para que você possa utilizar apenas a detecção de alterações baseada em eventos.

    "configuration": { "S3Bucket": "storage-bucket", "PollForSourceChanges": "false", "S3ObjectKey": "index.zip" },
  3. Se você estiver trabalhando com a estrutura do pipeline recuperada por meio do comando get-pipeline, é necessário remover as linhas metadata do arquivo JSON. Caso contrário, o comando update-pipeline não é capaz de utilizá-la. Remova as linhas "metadata": { }, "created", "pipelineARN" e os campos "updated".

    Por exemplo, remova as seguintes linhas da estrutura:

    "metadata": { "pipelineArn": "arn:aws:codepipeline:region:account-ID:pipeline-name", "created": "date", "updated": "date" },

    Salve o arquivo.

  4. Para aplicar suas alterações, execute o comando update-pipeline especificando o arquivo JSON do pipeline:

    Importante

    Não se esqueça de incluir file:// antes do nome de arquivo. Ele é obrigatório nesse comando.

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

    Este comando retorna toda a estrutura do pipeline editado.

    nota

    O comando update-pipeline interrompe o pipeline. Se uma revisão estiver sendo executada pelo pipeline quando você executar o comando update-pipeline, essa execução será interrompida. Você deve iniciar manualmente o pipeline para executar a revisão através do pipeline atualizado. Use o comando start-pipeline-execution para iniciar manualmente o pipeline.

Migre pipelines de votação com uma fonte S3 habilitada para eventos (modelo) AWS CloudFormation

Esse procedimento é para um pipeline em que o bucket de origem tem eventos ativados.

Use estas etapas para alterar o pipeline com uma origem do da sondagem para a detecção de alterações baseada em eventos.

Para criar um pipeline baseado em eventos do , edite o parâmetro de seu pipeline e adicione os seguintes recursos em seu modelo:

  • A regra do e a função do IAM para permitir que esse evento inicie o pipeline.

Ao utilizar o AWS CloudFormation para criar e gerenciar seus pipelines, o modelo inclui um conteúdo semelhante ao seguinte:

nota

A propriedade Configuration no estágio de origem denominado PollForSourceChanges. Se o seu modelo não inclui essa propriedade, PollForSourceChanges é definido como true por padrão.

YAML
AppPipeline: Type: AWS::CodePipeline::Pipeline Properties: RoleArn: !GetAtt CodePipelineServiceRole.Arn Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Version: 1 Provider: S3 OutputArtifacts: - Name: SourceOutput Configuration: S3Bucket: !Ref SourceBucket S3ObjectKey: !Ref S3SourceObjectKey PollForSourceChanges: true RunOrder: 1 ...
JSON
"AppPipeline": { "Type": "AWS::CodePipeline::Pipeline", "Properties": { "RoleArn": { "Fn::GetAtt": ["CodePipelineServiceRole", "Arn"] }, "Stages": [ { "Name": "Source", "Actions": [ { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "AWS", "Version": 1, "Provider": "S3" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "S3Bucket": { "Ref": "SourceBucket" }, "S3ObjectKey": { "Ref": "SourceObjectKey" }, "PollForSourceChanges": true }, "RunOrder": 1 } ] }, ...
Para criar uma regra do com o como origem do evento e o como o destino e aplicar as políticas de permissões
  1. No modelo, em Resources, use o recurso AWS::IAM::Role do AWS CloudFormation para configurar a função do IAM que habilita o evento a iniciar seu pipeline. Essa entrada cria uma função que utiliza duas políticas:

    • A primeira política permite que a função seja assumida.

    • A segunda política fornece permissões para iniciar o pipeline.

    Por que estou fazendo essa alteração? A adição do recurso AWS::IAM::Role permite que o crie permissões para . Esse recurso é adicionado à sua pilha do AWS CloudFormation.

    YAML
    EventRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - events.amazonaws.com Action: sts:AssumeRole Path: / Policies: - PolicyName: eb-pipeline-execution PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: codepipeline:StartPipelineExecution Resource: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] ...
    JSON
    "EventRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "events.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "eb-pipeline-execution", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "codepipeline:StartPipelineExecution", "Resource": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] ...
  2. Use o AWS::Events::Rule AWS CloudFormation recurso para adicionar uma regra do EventBridge. Esse padrão de evento cria um evento que monitora a criação ou exclusão de objetos em seu bucket de origem do Amazon S3. Além disso, inclua um destino de seu pipeline. Quando um objeto é criado, essa regra é invocada StartPipelineExecution em seu pipeline de destino.

    Por que estou fazendo essa alteração? A adição do recurso AWS::Events::Rule permite que o AWS CloudFormation crie o evento. Esse recurso é adicionado à sua pilha do AWS CloudFormation.

    YAML
    EventRule: Type: AWS::Events::Rule Properties: EventBusName: default EventPattern: source: - aws.s3 detail-type: - Object Created detail: bucket: name: - !Ref SourceBucket Name: EnabledS3SourceRule State: ENABLED Targets: - Arn: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] RoleArn: !GetAtt EventRole.Arn Id: codepipeline-AppPipeline ...
    JSON
    "EventRule": { "Type": "AWS::Events::Rule", "Properties": { "EventBusName": "default", "EventPattern": { "source": [ "aws.s3" ], "detail-type": [ "Object Created" ], "detail": { "bucket": { "name": [ "s3-pipeline-source-fra-bucket" ] } } }, "Name": "EnabledS3SourceRule", "State": "ENABLED", "Targets": [ { "Arn": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] }, "RoleArn": { "Fn::GetAtt": [ "EventRole", "Arn" ] }, "Id": "codepipeline-AppPipeline" } ] } } }, ...
  3. Salve o modelo atualizado no computador local e abra o console do AWS CloudFormation.

  4. Selecione sua pilha e clique em Create Change Set for Current Stack (Criar conjunto de alterações para a pilha atual).

  5. Carregue o modelo atualizado e, em seguida, visualize as alterações listadas no AWS CloudFormation. Essas são as alterações que serão feitas na pilha. Seus novos recursos devem ser exibidos na lista.

  6. Escolha Executar.

Editar o parâmetro PollForSourceChanges do pipeline
Importante

Ao criar um pipeline com esse método, o parâmetro PollForSourceChanges é padronizado como verdadeiro se não for explicitamente definido como falso. Ao adicionar a detecção de alterações baseada em eventos, é necessário adicionar o parâmetro a sua saída e defini-lo como falso para desativar a sondagem. Caso contrário, o pipeline inicia duas vezes para uma única alteração de origem. Para obter mais detalhes, consulte Configurações padrão do parâmetro PollForSourceChanges.

  • No modelo, altere PollForSourceChanges para false. Se você não incluir PollForSourceChanges na sua definição de pipeline, adicione-o e configure para false.

    Por que estou fazendo essa alteração? A alteração de PollForSourceChanges para false desativa as verificações periódicas para que você possa utilizar apenas a detecção de alterações baseada em eventos.

    YAML
    Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Version: 1 Provider: S3 OutputArtifacts: - Name: SourceOutput Configuration: S3Bucket: !Ref SourceBucket S3ObjectKey: !Ref SourceObjectKey PollForSourceChanges: false RunOrder: 1
    JSON
    { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "AWS", "Version": 1, "Provider": "S3" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "S3Bucket": { "Ref": "SourceBucket" }, "S3ObjectKey": { "Ref": "SourceObjectKey" }, "PollForSourceChanges": false }, "RunOrder": 1 }

Ao utilizar o AWS CloudFormation para criar esses recursos, o pipeline é acionado quando os arquivos presentes no repositório são criados ou atualizados.

nota

Não pare por aqui. Embora o pipeline seja criado, você deve gerar um segundo modelo do para o seu pipeline do . Se você não criar o segundo modelo, o pipeline não apresentará funcionalidades de detecção de alterações.

YAML
Parameters: SourceObjectKey: Description: 'S3 source artifact' Type: String Default: SampleApp_Linux.zip ApplicationName: Description: 'CodeDeploy application name' Type: String Default: DemoApplication BetaFleet: Description: 'Fleet configured in CodeDeploy' Type: String Default: DemoFleet Resources: SourceBucket: Type: AWS::S3::Bucket Properties: NotificationConfiguration: EventBridgeConfiguration: EventBridgeEnabled: true VersioningConfiguration: Status: Enabled CodePipelineArtifactStoreBucket: Type: AWS::S3::Bucket CodePipelineArtifactStoreBucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref CodePipelineArtifactStoreBucket PolicyDocument: Version: 2012-10-17 Statement: - Sid: DenyUnEncryptedObjectUploads Effect: Deny Principal: '*' Action: s3:PutObject Resource: !Join [ '', [ !GetAtt CodePipelineArtifactStoreBucket.Arn, '/*' ] ] Condition: StringNotEquals: s3:x-amz-server-side-encryption: aws:kms - Sid: DenyInsecureConnections Effect: Deny Principal: '*' Action: s3:* Resource: !Sub ${CodePipelineArtifactStoreBucket.Arn}/* Condition: Bool: aws:SecureTransport: false CodePipelineServiceRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - codepipeline.amazonaws.com Action: sts:AssumeRole Path: / Policies: - PolicyName: AWS-CodePipeline-Service-3 PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: - codecommit:CancelUploadArchive - codecommit:GetBranch - codecommit:GetCommit - codecommit:GetUploadArchiveStatus - codecommit:UploadArchive Resource: 'resource_ARN' - Effect: Allow Action: - codedeploy:CreateDeployment - codedeploy:GetApplicationRevision - codedeploy:GetDeployment - codedeploy:GetDeploymentConfig - codedeploy:RegisterApplicationRevision Resource: 'resource_ARN' - Effect: Allow Action: - codebuild:BatchGetBuilds - codebuild:StartBuild Resource: 'resource_ARN' - Effect: Allow Action: - devicefarm:ListProjects - devicefarm:ListDevicePools - devicefarm:GetRun - devicefarm:GetUpload - devicefarm:CreateUpload - devicefarm:ScheduleRun Resource: 'resource_ARN' - Effect: Allow Action: - lambda:InvokeFunction - lambda:ListFunctions Resource: 'resource_ARN' - Effect: Allow Action: - iam:PassRole Resource: 'resource_ARN' - Effect: Allow Action: - elasticbeanstalk:* - ec2:* - elasticloadbalancing:* - autoscaling:* - cloudwatch:* - s3:* - sns:* - cloudformation:* - rds:* - sqs:* - ecs:* Resource: 'resource_ARN' AppPipeline: Type: AWS::CodePipeline::Pipeline Properties: Name: s3-events-pipeline RoleArn: !GetAtt CodePipelineServiceRole.Arn Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Version: 1 Provider: S3 OutputArtifacts: - Name: SourceOutput Configuration: S3Bucket: !Ref SourceBucket S3ObjectKey: !Ref SourceObjectKey PollForSourceChanges: false RunOrder: 1 - Name: Beta Actions: - Name: BetaAction InputArtifacts: - Name: SourceOutput ActionTypeId: Category: Deploy Owner: AWS Version: 1 Provider: CodeDeploy Configuration: ApplicationName: !Ref ApplicationName DeploymentGroupName: !Ref BetaFleet RunOrder: 1 ArtifactStore: Type: S3 Location: !Ref CodePipelineArtifactStoreBucket EventRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - events.amazonaws.com Action: sts:AssumeRole Path: / Policies: - PolicyName: eb-pipeline-execution PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: codepipeline:StartPipelineExecution Resource: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] EventRule: Type: AWS::Events::Rule Properties: EventBusName: default EventPattern: source: - aws.s3 detail-type: - Object Created detail: bucket: name: - !Ref SourceBucket Name: EnabledS3SourceRule State: ENABLED Targets: - Arn: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] RoleArn: !GetAtt EventRole.Arn Id: codepipeline-AppPipeline
JSON
{ "Parameters": { "SourceObjectKey": { "Description": "S3 source artifact", "Type": "String", "Default": "SampleApp_Linux.zip" }, "ApplicationName": { "Description": "CodeDeploy application name", "Type": "String", "Default": "DemoApplication" }, "BetaFleet": { "Description": "Fleet configured in CodeDeploy", "Type": "String", "Default": "DemoFleet" } }, "Resources": { "SourceBucket": { "Type": "AWS::S3::Bucket", "Properties": { "NotificationConfiguration": { "EventBridgeConfiguration": { "EventBridgeEnabled": true } }, "VersioningConfiguration": { "Status": "Enabled" } } }, "CodePipelineArtifactStoreBucket": { "Type": "AWS::S3::Bucket" }, "CodePipelineArtifactStoreBucketPolicy": { "Type": "AWS::S3::BucketPolicy", "Properties": { "Bucket": { "Ref": "CodePipelineArtifactStoreBucket" }, "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Sid": "DenyUnEncryptedObjectUploads", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": { "Fn::Join": [ "", [ { "Fn::GetAtt": [ "CodePipelineArtifactStoreBucket", "Arn" ] }, "/*" ] ] }, "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "aws:kms" } } }, { "Sid": "DenyInsecureConnections", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": { "Fn::Join": [ "", [ { "Fn::GetAtt": [ "CodePipelineArtifactStoreBucket", "Arn" ] }, "/*" ] ] }, "Condition": { "Bool": { "aws:SecureTransport": false } } } ] } } }, "CodePipelineServiceRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "codepipeline.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "AWS-CodePipeline-Service-3", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codecommit:CancelUploadArchive", "codecommit:GetBranch", "codecommit:GetCommit", "codecommit:GetUploadArchiveStatus", "codecommit:UploadArchive" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "codedeploy:CreateDeployment", "codedeploy:GetApplicationRevision", "codedeploy:GetDeployment", "codedeploy:GetDeploymentConfig", "codedeploy:RegisterApplicationRevision" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "codebuild:BatchGetBuilds", "codebuild:StartBuild" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "devicefarm:ListProjects", "devicefarm:ListDevicePools", "devicefarm:GetRun", "devicefarm:GetUpload", "devicefarm:CreateUpload", "devicefarm:ScheduleRun" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "lambda:InvokeFunction", "lambda:ListFunctions" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "elasticbeanstalk:*", "ec2:*", "elasticloadbalancing:*", "autoscaling:*", "cloudwatch:*", "s3:*", "sns:*", "cloudformation:*", "rds:*", "sqs:*", "ecs:*" ], "Resource": "resource_ARN" } ] } } ] } }, "AppPipeline": { "Type": "AWS::CodePipeline::Pipeline", "Properties": { "Name": "s3-events-pipeline", "RoleArn": { "Fn::GetAtt": [ "CodePipelineServiceRole", "Arn" ] }, "Stages": [ { "Name": "Source", "Actions": [ { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "AWS", "Version": 1, "Provider": "S3" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "S3Bucket": { "Ref": "SourceBucket" }, "S3ObjectKey": { "Ref": "SourceObjectKey" }, "PollForSourceChanges": false }, "RunOrder": 1 } ] }, { "Name": "Beta", "Actions": [ { "Name": "BetaAction", "InputArtifacts": [ { "Name": "SourceOutput" } ], "ActionTypeId": { "Category": "Deploy", "Owner": "AWS", "Version": 1, "Provider": "CodeDeploy" }, "Configuration": { "ApplicationName": { "Ref": "ApplicationName" }, "DeploymentGroupName": { "Ref": "BetaFleet" } }, "RunOrder": 1 } ] } ], "ArtifactStore": { "Type": "S3", "Location": { "Ref": "CodePipelineArtifactStoreBucket" } } } }, "EventRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "events.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "eb-pipeline-execution", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "codepipeline:StartPipelineExecution", "Resource": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] } } ] } } ] } }, "EventRule": { "Type": "AWS::Events::Rule", "Properties": { "EventBusName": "default", "EventPattern": { "source": [ "aws.s3" ], "detail-type": [ "Object Created" ], "detail": { "bucket": { "name": [ { "Ref": "SourceBucket" } ] } } }, "Name": "EnabledS3SourceRule", "State": "ENABLED", "Targets": [ { "Arn": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] }, "RoleArn": { "Fn::GetAtt": [ "EventRole", "Arn" ] }, "Id": "codepipeline-AppPipeline" } ] } } } } }

Migre pipelines de votação com uma fonte do S3 e uma trilha do CloudTrail

Para um pipeline com uma fonte do Amazon S3, modifique o pipeline para que a detecção de alterações seja automatizada por meio do EventBridge. Escolha um dos seguintes métodos para implementar a migração:

Migre pipelines de votação com uma fonte do S3 e uma trilha do CloudTrail (CLI)

Siga essas etapas para fazer com que um pipeline que conduz sondagem (verificações periódicas) passe a utilizar um evento no . Se você deseja criar um pipeline, consulte Crie um pipeline em CodePipeline.

Para criar um pipeline baseado em eventos com o , edite o parâmetro de seu pipeline e crie os seguintes recursos:

  • A trilha, o bucket e a política de bucket do AWS CloudTrail que o Amazon S3 pode usar para registrar em log os eventos que ocorrem.

  • Eventos EventBridge

  • Função do IAM para permitir que o evento do inicie o pipeline

Para criar uma trilha do AWS CloudTrail e habilitar o registro em log

Para usar a AWS CLI para criar uma trilha, chame o comando create-trail, especificando:

  • O nome da trilha.

  • O bucket ao qual você já aplicou a política de bucket do AWS CloudTrail.

Para obter mais informações, consulte Criar uma trilha com a interface de linha de comando da AWS.

  1. Use o comando create-trail e inclua os parâmetros --name e --s3-bucket-name.

    Por que estou fazendo essa alteração? Isso cria a trilha do CloudTrail necessária para o bucket de origem do S3.

    O comando a seguir usa --name e --s3-bucket-name para criar uma trilha denominada my-trail e um bucket chamado de myBucket.

    aws cloudtrail create-trail --name my-trail --s3-bucket-name myBucket
  2. Use o comando start-logging e inclua o parâmetro --name.

    Por que estou fazendo essa alteração? Esse comando inicia o registro em log do para o bucket de origem e envia eventos ao .

    Exemplo:

    O comando a seguir utiliza --name para iniciar o registro em log em uma trilha denominada my-trail.

    aws cloudtrail start-logging --name my-trail
  3. Use o comando put-event-selectors e inclua os parâmetros --trail-name e --event-selectors. Use seletores de eventos para especificar que você deseja que a trilha registre em log os eventos de dados para o bucket de origem e envie os eventos para a regra do .

    Por que estou fazendo essa alteração? Esse comando filtra eventos.

    Exemplo:

    O comando a seguir utiliza --trail-name e --event-selectors para especificar eventos de dados para um bucket de origem e prefixo denominado myBucket/myFolder.

    aws cloudtrail put-event-selectors --trail-name my-trail --event-selectors '[{ "ReadWriteType": "WriteOnly", "IncludeManagementEvents":false, "DataResources": [{ "Type": "AWS::S3::Object", "Values": ["arn:aws:s3:::myBucket/myFolder/file.zip"] }] }]'
Para criar uma regra do com o como origem do evento e o como o destino e aplicar as políticas de permissões
  1. Conceda ao as permissões necessárias para usar o para invocar a regra. Para obter mais informações sobre como usar políticas baseadas em recursos para o , consulte o .

    1. Use o exemplo a seguir para criar a política de confiança que permita ao assumir a função de serviço. Chame-o de trustpolicyforEB.json.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
    2. Use o comando a seguir para criar a função Role-for-MyRule e anexar a política de confiança.

      Por que estou fazendo essa alteração? A adição dessa política de confiança à função cria permissões para .

      aws iam create-role --role-name Role-for-MyRule --assume-role-policy-document file://trustpolicyforEB.json
    3. Crie o JSON da política de permissões, conforme mostrado aqui para o pipeline chamado MyFirstPipeline. Nomeie a politica de permissões permissionspolicyforEB.json.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codepipeline:StartPipelineExecution" ], "Resource": [ "arn:aws:codepipeline:us-west-2:80398EXAMPLE:MyFirstPipeline" ] } ] }
    4. Use o comando a seguir para anexar a nova política de permissões CodePipeline-Permissions-Policy-for-EB à função Role-for-MyRule criada.

      aws iam put-role-policy --role-name Role-for-MyRule --policy-name CodePipeline-Permissions-Policy-For-EB --policy-document file://permissionspolicyforEB.json
  2. Use o comando put-rule e inclua os parâmetros --name, --event-pattern e --role-arn.

    O exemplo de comando a seguir cria uma regra chamada MyS3SourceRule.

    aws events put-rule --name "MyS3SourceRule" --event-pattern "{\"source\":[\"aws.s3\"],\"detail-type\":[\"AWS API Call via CloudTrail\"],\"detail\":{\"eventSource\":[\"s3.amazonaws.com\"],\"eventName\":[\"CopyObject\",\"PutObject\",\"CompleteMultipartUpload\"],\"requestParameters\":{\"bucketName\":[\"my-bucket\"],\"key\":[\"my-key\"]}}} --role-arn "arn:aws:iam::ACCOUNT_ID:role/Role-for-MyRule"
  3. Para adicionar o put-targets como destino, use o comando --rule e inclua os parâmetros e .

    O comando a seguir especifica que, para a regra denominada MyS3SourceRule, o Id do destino é composto do número um, indicando que, em uma lista de destinos para a regra, esse é o destino 1. O comando também especifica um ARN de exemplo para o pipeline. O pipeline é iniciado quando uma alteração é feita no repositório.

    aws events put-targets --rule MyS3SourceRule --targets Id=1,Arn=arn:aws:codepipeline:us-west-2:80398EXAMPLE:TestPipeline
Editar o parâmetro PollForSourceChanges do pipeline
Importante

Ao criar um pipeline com esse método, o parâmetro PollForSourceChanges é padronizado como verdadeiro se não for explicitamente definido como falso. Ao adicionar a detecção de alterações baseada em eventos, é necessário adicionar o parâmetro a sua saída e defini-lo como falso para desativar a sondagem. Caso contrário, o pipeline inicia duas vezes para uma única alteração de origem. Para obter mais detalhes, consulte Configurações padrão do parâmetro PollForSourceChanges.

  1. Execute o get-pipeline comando para copiar a estrutura do pipeline em um arquivo JSON. Por exemplo, para um pipeline nomeado MyFirstPipeline, execute o seguinte comando:

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

    Este comando retorna nada, mas o arquivo que você criou deve aparecer no diretório onde você executou o comando.

  2. Abra o arquivo JSON em qualquer editor de texto plano e, para editar o estágio de origem, altere o parâmetro PollForSourceChanges de um bucket denominado storage-bucket para false, conforme mostrado neste exemplo.

    Por que estou fazendo essa alteração? A configuração deste parâmetro para false desativa as verificações periódicas para que você possa utilizar apenas a detecção de alterações baseada em eventos.

    "configuration": { "S3Bucket": "storage-bucket", "PollForSourceChanges": "false", "S3ObjectKey": "index.zip" },
  3. Se você estiver trabalhando com a estrutura do pipeline recuperada por meio do comando get-pipeline, é necessário remover as linhas metadata do arquivo JSON. Caso contrário, o comando update-pipeline não é capaz de utilizá-la. Remova as linhas "metadata": { }, "created", "pipelineARN" e os campos "updated".

    Por exemplo, remova as seguintes linhas da estrutura:

    "metadata": { "pipelineArn": "arn:aws:codepipeline:region:account-ID:pipeline-name", "created": "date", "updated": "date" },

    Salve o arquivo.

  4. Para aplicar suas alterações, execute o comando update-pipeline especificando o arquivo JSON do pipeline:

    Importante

    Não se esqueça de incluir file:// antes do nome de arquivo. Ele é obrigatório nesse comando.

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

    Este comando retorna toda a estrutura do pipeline editado.

    nota

    O comando update-pipeline interrompe o pipeline. Se uma revisão estiver sendo executada pelo pipeline quando você executar o comando update-pipeline, essa execução será interrompida. Você deve iniciar manualmente o pipeline para executar a revisão através do pipeline atualizado. Use o comando start-pipeline-execution para iniciar manualmente o pipeline.

Migre pipelines de votação com uma fonte do S3 e uma trilha do CloudTrail (modelo) AWS CloudFormation

Use estas etapas para alterar o pipeline com uma origem do da sondagem para a detecção de alterações baseada em eventos.

Para criar um pipeline baseado em eventos do , edite o parâmetro de seu pipeline e adicione os seguintes recursos em seu modelo:

  • O exige que todos os eventos do sejam registrados em log. Você deve criar uma trilha, um bucket e uma política de bucket do que o pode usar para registrar em log os eventos que ocorrem. Para obter mais informações, consulte Registrar em log dados e eventos de gerenciamento para trilhas.

  • A regra do e a função do IAM para permitir que esse evento inicie o pipeline.

Ao utilizar o AWS CloudFormation para criar e gerenciar seus pipelines, o modelo inclui um conteúdo semelhante ao seguinte:

nota

A propriedade Configuration no estágio de origem denominado PollForSourceChanges. Se o seu modelo não inclui essa propriedade, PollForSourceChanges é definido como true por padrão.

YAML
AppPipeline: Type: AWS::CodePipeline::Pipeline Properties: RoleArn: !GetAtt CodePipelineServiceRole.Arn Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Version: 1 Provider: S3 OutputArtifacts: - Name: SourceOutput Configuration: S3Bucket: !Ref SourceBucket S3ObjectKey: !Ref S3SourceObjectKey PollForSourceChanges: true RunOrder: 1 ...
JSON
"AppPipeline": { "Type": "AWS::CodePipeline::Pipeline", "Properties": { "RoleArn": { "Fn::GetAtt": ["CodePipelineServiceRole", "Arn"] }, "Stages": [ { "Name": "Source", "Actions": [ { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "AWS", "Version": 1, "Provider": "S3" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "S3Bucket": { "Ref": "SourceBucket" }, "S3ObjectKey": { "Ref": "SourceObjectKey" }, "PollForSourceChanges": true }, "RunOrder": 1 } ] }, ...
Para criar uma regra do com o como origem do evento e o como o destino e aplicar as políticas de permissões
  1. No modelo, em Resources, use o recurso AWS::IAM::Role do AWS CloudFormation para configurar a função do IAM que habilita o evento a iniciar seu pipeline. Essa entrada cria uma função que utiliza duas políticas:

    • A primeira política permite que a função seja assumida.

    • A segunda política fornece permissões para iniciar o pipeline.

    Por que estou fazendo essa alteração? A adição do recurso AWS::IAM::Role permite que o crie permissões para . Esse recurso é adicionado à sua pilha do AWS CloudFormation.

    YAML
    EventRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - events.amazonaws.com Action: sts:AssumeRole Path: / Policies: - PolicyName: eb-pipeline-execution PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: codepipeline:StartPipelineExecution Resource: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] ...
    JSON
    "EventRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "events.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "eb-pipeline-execution", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "codepipeline:StartPipelineExecution", "Resource": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] ...
  2. Use o AWS::Events::Rule AWS CloudFormation recurso para adicionar uma regra do EventBridge. Esse padrão de evento cria um evento que monitora CopyObject, PutObject e em seu bucket de origem do . Além disso, inclua um destino de seu pipeline. Quando CopyObject, PutObject ou CompleteMultipartUpload ocorrer, essa regra invoca StartPipelineExecution em seu pipeline de destino.

    Por que estou fazendo essa alteração? A adição do recurso AWS::Events::Rule permite que o AWS CloudFormation crie o evento. Esse recurso é adicionado à sua pilha do AWS CloudFormation.

    YAML
    EventRule: Type: AWS::Events::Rule Properties: EventPattern: source: - aws.s3 detail-type: - 'AWS API Call via CloudTrail' detail: eventSource: - s3.amazonaws.com eventName: - CopyObject - PutObject - CompleteMultipartUpload requestParameters: bucketName: - !Ref SourceBucket key: - !Ref SourceObjectKey Targets: - Arn: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] RoleArn: !GetAtt EventRole.Arn Id: codepipeline-AppPipeline ...
    JSON
    "EventRule": { "Type": "AWS::Events::Rule", "Properties": { "EventPattern": { "source": [ "aws.s3" ], "detail-type": [ "AWS API Call via CloudTrail" ], "detail": { "eventSource": [ "s3.amazonaws.com" ], "eventName": [ "CopyObject", "PutObject", "CompleteMultipartUpload" ], "requestParameters": { "bucketName": [ { "Ref": "SourceBucket" } ], "key": [ { "Ref": "SourceObjectKey" } ] } } }, "Targets": [ { "Arn": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] }, "RoleArn": { "Fn::GetAtt": [ "EventRole", "Arn" ] }, "Id": "codepipeline-AppPipeline" } ] } } }, ...
  3. Adicione este trecho ao primeiro modelo para permitir a funcionalidade de pilha cruzada:

    YAML
    Outputs: SourceBucketARN: Description: "S3 bucket ARN that Cloudtrail will use" Value: !GetAtt SourceBucket.Arn Export: Name: SourceBucketARN
    JSON
    "Outputs" : { "SourceBucketARN" : { "Description" : "S3 bucket ARN that Cloudtrail will use", "Value" : { "Fn::GetAtt": ["SourceBucket", "Arn"] }, "Export" : { "Name" : "SourceBucketARN" } } ...
  4. Salve o modelo atualizado no computador local e abra o console do AWS CloudFormation.

  5. Selecione sua pilha e clique em Create Change Set for Current Stack (Criar conjunto de alterações para a pilha atual).

  6. Carregue o modelo atualizado e, em seguida, visualize as alterações listadas no AWS CloudFormation. Essas são as alterações que serão feitas na pilha. Seus novos recursos devem ser exibidos na lista.

  7. Escolha Executar.

Editar o parâmetro PollForSourceChanges do pipeline
Importante

Ao criar um pipeline com esse método, o parâmetro PollForSourceChanges é padronizado como verdadeiro se não for explicitamente definido como falso. Ao adicionar a detecção de alterações baseada em eventos, é necessário adicionar o parâmetro a sua saída e defini-lo como falso para desativar a sondagem. Caso contrário, o pipeline inicia duas vezes para uma única alteração de origem. Para obter mais detalhes, consulte Configurações padrão do parâmetro PollForSourceChanges.

  • No modelo, altere PollForSourceChanges para false. Se você não incluir PollForSourceChanges na sua definição de pipeline, adicione-o e configure para false.

    Por que estou fazendo essa alteração? A alteração de PollForSourceChanges para false desativa as verificações periódicas para que você possa utilizar apenas a detecção de alterações baseada em eventos.

    YAML
    Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Version: 1 Provider: S3 OutputArtifacts: - Name: SourceOutput Configuration: S3Bucket: !Ref SourceBucket S3ObjectKey: !Ref SourceObjectKey PollForSourceChanges: false RunOrder: 1
    JSON
    { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "AWS", "Version": 1, "Provider": "S3" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "S3Bucket": { "Ref": "SourceBucket" }, "S3ObjectKey": { "Ref": "SourceObjectKey" }, "PollForSourceChanges": false }, "RunOrder": 1 }
Criar um segundo modelo para os recursos do do pipeline do
  • Em um modelo separado, em Resources, use os recursos AWS::S3::Bucket, AWS::S3::BucketPolicy e AWS::CloudTrail::Trail do AWS CloudFormation para fornecer uma definição de bucket simples e uma trilha para o CloudTrail.

    Por que estou fazendo essa alteração? Considerando o limite atual de cinco trilhas por conta, a trilha do precisa ser criada e gerenciada separadamente. (Consulte Limites em AWS CloudTrail.) No entanto, você pode incluir vários buckets do em uma única trilha, para que você possa criar a trilha uma vez e adicionar buckets do para outros pipelines, conforme for necessário. Cole o seguinte no arquivo do segundo modelo de exemplo.

    YAML
    ################################################################################### # Prerequisites: # - S3 SourceBucket and SourceObjectKey must exist ################################################################################### Parameters: SourceObjectKey: Description: 'S3 source artifact' Type: String Default: SampleApp_Linux.zip Resources: AWSCloudTrailBucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref AWSCloudTrailBucket PolicyDocument: Version: 2012-10-17 Statement: - Sid: AWSCloudTrailAclCheck Effect: Allow Principal: Service: - cloudtrail.amazonaws.com Action: s3:GetBucketAcl Resource: !GetAtt AWSCloudTrailBucket.Arn - Sid: AWSCloudTrailWrite Effect: Allow Principal: Service: - cloudtrail.amazonaws.com Action: s3:PutObject Resource: !Join [ '', [ !GetAtt AWSCloudTrailBucket.Arn, '/AWSLogs/', !Ref 'AWS::AccountId', '/*' ] ] Condition: StringEquals: s3:x-amz-acl: bucket-owner-full-control AWSCloudTrailBucket: Type: AWS::S3::Bucket DeletionPolicy: Retain AwsCloudTrail: DependsOn: - AWSCloudTrailBucketPolicy Type: AWS::CloudTrail::Trail Properties: S3BucketName: !Ref AWSCloudTrailBucket EventSelectors: - DataResources: - Type: AWS::S3::Object Values: - !Join [ '', [ !ImportValue SourceBucketARN, '/', !Ref SourceObjectKey ] ] ReadWriteType: WriteOnly IncludeManagementEvents: false IncludeGlobalServiceEvents: true IsLogging: true IsMultiRegionTrail: true ...
    JSON
    { "Parameters": { "SourceObjectKey": { "Description": "S3 source artifact", "Type": "String", "Default": "SampleApp_Linux.zip" } }, "Resources": { "AWSCloudTrailBucket": { "Type": "AWS::S3::Bucket", "DeletionPolicy": "Retain" }, "AWSCloudTrailBucketPolicy": { "Type": "AWS::S3::BucketPolicy", "Properties": { "Bucket": { "Ref": "AWSCloudTrailBucket" }, "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Sid": "AWSCloudTrailAclCheck", "Effect": "Allow", "Principal": { "Service": [ "cloudtrail.amazonaws.com" ] }, "Action": "s3:GetBucketAcl", "Resource": { "Fn::GetAtt": [ "AWSCloudTrailBucket", "Arn" ] } }, { "Sid": "AWSCloudTrailWrite", "Effect": "Allow", "Principal": { "Service": [ "cloudtrail.amazonaws.com" ] }, "Action": "s3:PutObject", "Resource": { "Fn::Join": [ "", [ { "Fn::GetAtt": [ "AWSCloudTrailBucket", "Arn" ] }, "/AWSLogs/", { "Ref": "AWS::AccountId" }, "/*" ] ] }, "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } } ] } } }, "AwsCloudTrail": { "DependsOn": [ "AWSCloudTrailBucketPolicy" ], "Type": "AWS::CloudTrail::Trail", "Properties": { "S3BucketName": { "Ref": "AWSCloudTrailBucket" }, "EventSelectors": [ { "DataResources": [ { "Type": "AWS::S3::Object", "Values": [ { "Fn::Join": [ "", [ { "Fn::ImportValue": "SourceBucketARN" }, "/", { "Ref": "SourceObjectKey" } ] ] } ] } ], "ReadWriteType": "WriteOnly", "IncludeManagementEvents": false } ], "IncludeGlobalServiceEvents": true, "IsLogging": true, "IsMultiRegionTrail": true } } } } ...

Ao utilizar o AWS CloudFormation para criar esses recursos, o pipeline é acionado quando os arquivos presentes no repositório são criados ou atualizados.

nota

Não pare por aqui. Embora o pipeline seja criado, você deve gerar um segundo modelo do para o seu pipeline do . Se você não criar o segundo modelo, o pipeline não apresentará funcionalidades de detecção de alterações.

YAML
Resources: SourceBucket: Type: AWS::S3::Bucket Properties: VersioningConfiguration: Status: Enabled CodePipelineArtifactStoreBucket: Type: AWS::S3::Bucket CodePipelineArtifactStoreBucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref CodePipelineArtifactStoreBucket PolicyDocument: Version: 2012-10-17 Statement: - Sid: DenyUnEncryptedObjectUploads Effect: Deny Principal: '*' Action: s3:PutObject Resource: !Join [ '', [ !GetAtt CodePipelineArtifactStoreBucket.Arn, '/*' ] ] Condition: StringNotEquals: s3:x-amz-server-side-encryption: aws:kms - Sid: DenyInsecureConnections Effect: Deny Principal: '*' Action: s3:* Resource: !Join [ '', [ !GetAtt CodePipelineArtifactStoreBucket.Arn, '/*' ] ] Condition: Bool: aws:SecureTransport: false CodePipelineServiceRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - codepipeline.amazonaws.com Action: sts:AssumeRole Path: / Policies: - PolicyName: AWS-CodePipeline-Service-3 PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: - codecommit:CancelUploadArchive - codecommit:GetBranch - codecommit:GetCommit - codecommit:GetUploadArchiveStatus - codecommit:UploadArchive Resource: 'resource_ARN' - Effect: Allow Action: - codedeploy:CreateDeployment - codedeploy:GetApplicationRevision - codedeploy:GetDeployment - codedeploy:GetDeploymentConfig - codedeploy:RegisterApplicationRevision Resource: 'resource_ARN' - Effect: Allow Action: - codebuild:BatchGetBuilds - codebuild:StartBuild Resource: 'resource_ARN' - Effect: Allow Action: - devicefarm:ListProjects - devicefarm:ListDevicePools - devicefarm:GetRun - devicefarm:GetUpload - devicefarm:CreateUpload - devicefarm:ScheduleRun Resource: 'resource_ARN' - Effect: Allow Action: - lambda:InvokeFunction - lambda:ListFunctions Resource: 'resource_ARN' - Effect: Allow Action: - iam:PassRole Resource: 'resource_ARN' - Effect: Allow Action: - elasticbeanstalk:* - ec2:* - elasticloadbalancing:* - autoscaling:* - cloudwatch:* - s3:* - sns:* - cloudformation:* - rds:* - sqs:* - ecs:* Resource: 'resource_ARN' AppPipeline: Type: AWS::CodePipeline::Pipeline Properties: Name: s3-events-pipeline RoleArn: !GetAtt CodePipelineServiceRole.Arn Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Version: 1 Provider: S3 OutputArtifacts: - Name: SourceOutput Configuration: S3Bucket: !Ref SourceBucket S3ObjectKey: !Ref SourceObjectKey PollForSourceChanges: false RunOrder: 1 - Name: Beta Actions: - Name: BetaAction InputArtifacts: - Name: SourceOutput ActionTypeId: Category: Deploy Owner: AWS Version: 1 Provider: CodeDeploy Configuration: ApplicationName: !Ref ApplicationName DeploymentGroupName: !Ref BetaFleet RunOrder: 1 ArtifactStore: Type: S3 Location: !Ref CodePipelineArtifactStoreBucket EventRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - events.amazonaws.com Action: sts:AssumeRole Path: / Policies: - PolicyName: eb-pipeline-execution PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: codepipeline:StartPipelineExecution Resource: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] EventRule: Type: AWS::Events::Rule Properties: EventPattern: source: - aws.s3 detail-type: - 'AWS API Call via CloudTrail' detail: eventSource: - s3.amazonaws.com eventName: - PutObject - CompleteMultipartUpload resources: ARN: - !Join [ '', [ !GetAtt SourceBucket.Arn, '/', !Ref SourceObjectKey ] ] Targets: - Arn: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ] RoleArn: !GetAtt EventRole.Arn Id: codepipeline-AppPipeline Outputs: SourceBucketARN: Description: "S3 bucket ARN that Cloudtrail will use" Value: !GetAtt SourceBucket.Arn Export: Name: SourceBucketARN
JSON
"Resources": { "SourceBucket": { "Type": "AWS::S3::Bucket", "Properties": { "VersioningConfiguration": { "Status": "Enabled" } } }, "CodePipelineArtifactStoreBucket": { "Type": "AWS::S3::Bucket" }, "CodePipelineArtifactStoreBucketPolicy": { "Type": "AWS::S3::BucketPolicy", "Properties": { "Bucket": { "Ref": "CodePipelineArtifactStoreBucket" }, "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Sid": "DenyUnEncryptedObjectUploads", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": { "Fn::Join": [ "", [ { "Fn::GetAtt": [ "CodePipelineArtifactStoreBucket", "Arn" ] }, "/*" ] ] }, "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "aws:kms" } } }, { "Sid": "DenyInsecureConnections", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": { "Fn::Join": [ "", [ { "Fn::GetAtt": [ "CodePipelineArtifactStoreBucket", "Arn" ] }, "/*" ] ] }, "Condition": { "Bool": { "aws:SecureTransport": false } } } ] } } }, "CodePipelineServiceRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "codepipeline.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "AWS-CodePipeline-Service-3", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codecommit:CancelUploadArchive", "codecommit:GetBranch", "codecommit:GetCommit", "codecommit:GetUploadArchiveStatus", "codecommit:UploadArchive" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "codedeploy:CreateDeployment", "codedeploy:GetApplicationRevision", "codedeploy:GetDeployment", "codedeploy:GetDeploymentConfig", "codedeploy:RegisterApplicationRevision" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "codebuild:BatchGetBuilds", "codebuild:StartBuild" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "devicefarm:ListProjects", "devicefarm:ListDevicePools", "devicefarm:GetRun", "devicefarm:GetUpload", "devicefarm:CreateUpload", "devicefarm:ScheduleRun" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "lambda:InvokeFunction", "lambda:ListFunctions" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "resource_ARN" }, { "Effect": "Allow", "Action": [ "elasticbeanstalk:*", "ec2:*", "elasticloadbalancing:*", "autoscaling:*", "cloudwatch:*", "s3:*", "sns:*", "cloudformation:*", "rds:*", "sqs:*", "ecs:*" ], "Resource": "resource_ARN" } ] } } ] } }, "AppPipeline": { "Type": "AWS::CodePipeline::Pipeline", "Properties": { "Name": "s3-events-pipeline", "RoleArn": { "Fn::GetAtt": [ "CodePipelineServiceRole", "Arn" ] }, "Stages": [ { "Name": "Source", "Actions": [ { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "AWS", "Version": 1, "Provider": "S3" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "S3Bucket": { "Ref": "SourceBucket" }, "S3ObjectKey": { "Ref": "SourceObjectKey" }, "PollForSourceChanges": false }, "RunOrder": 1 } ] }, { "Name": "Beta", "Actions": [ { "Name": "BetaAction", "InputArtifacts": [ { "Name": "SourceOutput" } ], "ActionTypeId": { "Category": "Deploy", "Owner": "AWS", "Version": 1, "Provider": "CodeDeploy" }, "Configuration": { "ApplicationName": { "Ref": "ApplicationName" }, "DeploymentGroupName": { "Ref": "BetaFleet" } }, "RunOrder": 1 } ] } ], "ArtifactStore": { "Type": "S3", "Location": { "Ref": "CodePipelineArtifactStoreBucket" } } } }, "EventRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "events.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "eb-pipeline-execution", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "codepipeline:StartPipelineExecution", "Resource": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] } } ] } } ] } }, "EventRule": { "Type": "AWS::Events::Rule", "Properties": { "EventPattern": { "source": [ "aws.s3" ], "detail-type": [ "AWS API Call via CloudTrail" ], "detail": { "eventSource": [ "s3.amazonaws.com" ], "eventName": [ "PutObject", "CompleteMultipartUpload" ], "resources": { "ARN": [ { "Fn::Join": [ "", [ { "Fn::GetAtt": [ "SourceBucket", "Arn" ] }, "/", { "Ref": "SourceObjectKey" } ] ] } ] } } }, "Targets": [ { "Arn": { "Fn::Join": [ "", [ "arn:aws:codepipeline:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":", { "Ref": "AppPipeline" } ] ] }, "RoleArn": { "Fn::GetAtt": [ "EventRole", "Arn" ] }, "Id": "codepipeline-AppPipeline" } ] } } }, "Outputs" : { "SourceBucketARN" : { "Description" : "S3 bucket ARN that Cloudtrail will use", "Value" : { "Fn::GetAtt": ["SourceBucket", "Arn"] }, "Export" : { "Name" : "SourceBucketARN" } } } } ...

Migre os pipelines de enquete de uma ação de origem do GitHub versão 1 para conexões

Você pode migrar uma ação de origem do GitHub versão 1 para usar conexões para seu repositório externo. Esse é o método de detecção de alterações recomendado para pipelines com uma ação de origem do GitHub versão 1.

Para um pipeline com uma ação de origem do GitHub versão 1, recomendamos modificar o pipeline para usar uma ação do GitHub versão 2 para que a detecção de alterações seja automatizada por meio do CodeStar Connections. AWS Para obter mais informações sobre como trabalhar com o ConfigMap, consulte GitHub conexões.

Criar uma conexão com o GitHub (console)

Você pode usar a () para criar uma conexão com o GitHub.

Etapa 1: Substituir sua ação do GitHub da versão 1

Use a página de edição do pipeline para substituir sua ação do GitHub da versão 1 por uma ação do GitHub da versão 2.

Para substituir sua ação do GitHub de versão 1
  1. Faça login no console do CodePipeline.

  2. Selecione o pipeline e escolha Edit (Editar). No estágio de origem, clique em Edit stage (Editar estágio). É exibida uma mensagem recomendando que você atualize sua ação.

  3. Em Provedor de ação, escolha GitHub (versão 2).

  4. Faça um dos seguintes procedimentos:

    • Em Conexão, se você ainda não criou uma conexão com seu provedor, escolha Conectar ao GitHub. Prossiga para a Etapa 2: criar uma conexão com o GitHub.

    • Em Conexão, se você já criou uma conexão com seu provedor, escolha a conexão. Vá para a Etapa 3: Salve a ação de origem para sua conexão.

Criar uma conexão com o GitHub

Depois de escolher criar a conexão, a página Connect to GitHub é exibida.

Para criar uma conexão com o GitHub
  1. Em GitHub connection settings (Configurações de conexão do GitHub), o nome da conexão aparece em Connection name (Nome da conexão).

    Em GitHub apps (Aplicações do GitHub), escolha uma instalação de aplicação ou Install a new app (Instalar uma nova aplicação) para criar uma.

    nota

    Você instala uma aplicação para todas as suas conexões com um provedor específico. Se você já instalou a aplicação Connector para GitHub, selecione-a e ignore esta etapa.

  2. Se a página de login do Bitbucket for exibida, faça login com suas credenciais e escolha a opção de continuar.

  3. Na página de instalação do aplicativo, uma mensagem mostra que o aplicativo do AWS CodeStar está tentando se conectar à sua conta do Bitbucket.

    nota

    A aplicação é instalada apenas uma vez para cada conta do GitHub. Se você instalou a aplicação anteriormente, poderá escolher Configure (Configurar) para prosseguir para uma página de modificação para a instalação da aplicação ou usar o botão Back (Voltar) para retornar ao console.

  4. Na AWS CodeStar página Instalar, escolha Instalar.

  5. Na página Connect to GitHub (Conexão ao GitHub) o ID de conexão da sua nova instalação é exibido em GitHub Apps (Aplicações do GitHub). Selecione Connect (Conectar).

Etapa 3: Salve sua ação de origem do GitHub

Conclua suas atualizações na página Editar ação para salvar sua nova ação de origem.

Para salvar sua ação de origem do GitHub
  1. Em Repository name (Nome do repositório), escolha o nome do repositório de terceiros. Em Branch name (Nome da ramificação), escolha a ramificação onde deseja que o pipeline detecte alterações de origem.

    nota

    No Repositório, digite owner-name/repository-name conforme mostrado neste exemplo:

    my-account/my-repository
  2. Em Output artifact format (Formato de artefato de saída), você deve escolher o formato para seus artefatos.

    • Para armazenar artefatos de saída da ação do Bitbucket usando o método padrão, escolha CodePipeline default (Padrão CodePipeline). A ação acessa os arquivos do repositório Bitbucket e armazena os artefatos em um arquivo ZIP no armazenamento de artefatos do pipeline.

    • Para armazenar um arquivo JSON que contém uma referência de URL ao repositório para que as ações downstream possam executar comandos Git diretamente, escolha Full clone (Clone completo). Esta opção só pode ser usada por ações downstream do .

      Se você escolher essa opção, precisará atualizar as permissões para sua função de serviço do projeto CodeBuild, conforme mostrado em. Adicione CodeBuild GitClone permissões para conexões com o Bitbucket GitHub, GitHub Enterprise Server ou .com GitLab Para um tutorial que mostra como usar a opção de clonagem completa do, consulteTutorial: Usar o clone completo com uma origem de pipeline do GitHub.

  3. Em Artefatos de saída, você pode manter o nome do artefato de saída para essa ação, como. SourceArtifact Escolha Concluído para fechar a página Editar ação.

  4. Escolha Concluído para fechar a página de edição do palco. Escolha Salvar para fechar a página de edição do pipeline.

Criar uma conexão com o GitHub (CLI)

Você pode usar a AWS Command Line Interface (AWS CLI) para criar uma conexão com o GitHub.

Para fazer isso, use o comando create-connection.

Importante

Uma conexão criada por meio da AWS CLI ou do AWS CloudFormation permanece no status PENDING por padrão. Depois de criar uma conexão com a CLI ou o AWS CloudFormation, use o console para editar a conexão e tornar seu status AVAILABLE.

Para criar uma conexão com o GitHub
  1. Abra um terminal (Linux, macOS ou Unix) ou um prompt de comando (Windows). Use a AWS CLI para executar o comando create-connection, especificando o --provider-type e o --connection-name para sua conexão. Neste exemplo, o nome do provedor de terceiros é GitHub e o nome da conexão especificada é MyConnection.

    aws codestar-connections create-connection --provider-type GitHub --connection-name MyConnection

    Se tiver êxito, esse comando gerará as informações do ARN de conexão semelhantes às seguintes.

    { "ConnectionArn": "arn:aws:codestar-connections:us-west-2:account_id:connection/aEXAMPLE-8aad-4d5d-8878-dfcab0bc441f" }
  2. Use o console para concluir a conexão.

Migre os pipelines de enquete de uma ação de origem do GitHub versão 1 para webhooks

Você pode usar o console do para atualizar seu pipeline para usar os webhooks para detectar alterações em seu repositório de origem do . Essa migração para webhooks é somente para a ação da versão 1 do GitHub.

Migrar pipelines de enquete para webhooks (ações de origem do GitHub versão 1) (console)

Você pode usar o console do para atualizar seu pipeline para usar os webhooks para detectar alterações em seu repositório de origem do .

Siga essas etapas para fazer com que um pipeline que conduz sondagem (verificações periódicas) passe a utilizar um evento no . Se você deseja criar um pipeline, consulte Crie um pipeline em CodePipeline.

Ao utilizar o console, o parâmetro PollForSourceChanges para o seu pipeline é alterado. O webhook do GitHub será criado e registrado para você.

Para editar o estágio de origem do pipeline
  1. Faça login no console em AWS Management Consolehttp://console.aws.amazon.com/codesuite/codepipeline/home.

    Os nomes de todos os pipelines associados à sua conta da AWS são exibidos.

  2. Em Nome, selecione o nome do pipeline que você deseja editar. Isso abrirá um visão detalhada do pipeline, incluindo o estado de cada uma das ações em cada estágio do pipeline.

  3. Na página de detalhes do pipeline, selecione Editar.

  4. Em Edit stage (Editar estágio), selecione o ícone de edição na ação de origem.

  5. Expanda Change detection options (Opções de detecção de alterações) e selecione Use Amazon CloudWatch Events to automatically start my pipeline when a change occurs (recommended) (Usar o Amazon CloudWatch Events para iniciar automaticamente o pipeline quando ocorrer uma alteração (recomendado)).

    É exibida uma mensagem para informar que o AWS cria um webhook no GitHub para detectar alterações de origem. Você pode optar por não participar nas opções abaixo. Escolha Atualizar. Além do webhook, o cria o seguinte:

    • Um segredo, gerado aleatoriamente e utilizado para autorizar a conexão com o GitHub.

    • O URL do webhook, gerado por meio do uso do endpoint público da região.

    O registra o webhook com o GitHub. Isso inscreve o URL para receber eventos de repositório.

  6. Quando terminar de editar seu pipeline, selecione Salvar alterações do pipeline para voltar à página de resumo.

    Uma mensagem exibe o nome do webhook a ser criado para o pipeline. Escolha Save and continue.

  7. Para testar a ação, utilize a AWS CLI para confirmar uma mudança à origem especificada no estágio de origem do pipeline para que seja possível liberar uma alteração.

Migre pipelines de enquete para webhooks (ações de origem do GitHub versão 1) (CLI)

Siga essas etapas para fazer com que um pipeline que conduz sondagem (verificações periódicas) passe a utilizar um webhook. Se você deseja criar um pipeline, consulte Crie um pipeline em CodePipeline.

Para criar um pipeline baseado em eventos, edite o parâmetro PollForSourceChanges de seu pipeline e crie os seguintes recursos manualmente:

  • Parâmetros de autorização e webhook do GitHub

Para criar e registrar seu webhook
nota

Ao usar a CLI ou o AWS CloudFormation para criar um pipeline e adicionar um webhook, é necessário desativar as verificações periódicas. Para desativar as verificações periódicas, é necessário adicionar explicitamente o parâmetro PollForSourceChanges e defini-lo como falso, conforme descrito no procedimento final abaixo. Caso contrário, o padrão para um pipeline da CLI ou do AWS CloudFormation é que PollForSourceChanges seja padronizado como verdadeiro e não seja exibido na saída da estrutura de pipeline. Para obter mais informações sobre os padrões de PollForSourceChanges, consulte Configurações padrão do parâmetro PollForSourceChanges.

  1. Em um editor de texto, crie e salve um arquivo JSON para o webhook que deseja criar. Use esse exemplo de arquivo para um webhook denominado my-webhook:

    { "webhook": { "name": "my-webhook", "targetPipeline": "pipeline_name", "targetAction": "source_action_name", "filters": [{ "jsonPath": "$.ref", "matchEquals": "refs/heads/{Branch}" }], "authentication": "GITHUB_HMAC", "authenticationConfiguration": { "SecretToken": "secret" } } }
  2. Use o comando put-webhook e inclua os parâmetros --cli-input e --region.

    O exemplo de comando a seguir cria um webhook com o arquivo JSON webhook_json.

    aws codepipeline put-webhook --cli-input-json file://webhook_json.json --region "eu-central-1"
  3. Na saída mostrada neste exemplo, a URL e o ARN são retornados para um webhook denominado my-webhook.

    { "webhook": { "url": "https://webhooks.domain.com/trigger111111111EXAMPLE11111111111111111", "definition": { "authenticationConfiguration": { "SecretToken": "secret" }, "name": "my-webhook", "authentication": "GITHUB_HMAC", "targetPipeline": "pipeline_name", "targetAction": "Source", "filters": [ { "jsonPath": "$.ref", "matchEquals": "refs/heads/{Branch}" } ] }, "arn": "arn:aws:codepipeline:eu-central-1:ACCOUNT_ID:webhook:my-webhook" }, "tags": [{ "key": "Project", "value": "ProjectA" }] }

    Este exemplo adiciona tags ao webhook incluindo a chave de tag Project e o valor ProjectA no webhook. Para obter mais informações sobre a como marcar recursos do , consulte Tags no .

  4. Use o comando register-webhook-with-third-party e inclua o parâmetro --webhook-name.

    O exemplo de comando a seguir registra um webhook denominado my-webhook.

    aws codepipeline register-webhook-with-third-party --webhook-name my-webhook
Editar o parâmetro PollForSourceChanges do pipeline
Importante

Ao criar um pipeline com esse método, o parâmetro PollForSourceChanges é padronizado como verdadeiro se não for explicitamente definido como falso. Ao adicionar a detecção de alterações baseada em eventos, é necessário adicionar o parâmetro a sua saída e defini-lo como falso para desativar a sondagem. Caso contrário, o pipeline inicia duas vezes para uma única alteração de origem. Para obter mais detalhes, consulte Configurações padrão do parâmetro PollForSourceChanges.

  1. Execute o get-pipeline comando para copiar a estrutura do pipeline em um arquivo JSON. Por exemplo, para um pipeline chamado MyFirstPipeline, você deve digitar o seguinte comando:

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

    Este comando retorna nada, mas o arquivo que você criou deve aparecer no diretório onde você executou o comando.

  2. Abra o arquivo JSON em qualquer editor de texto plano e altere ou adicione o parâmetro PollForSourceChanges para editar o estágio de origem. Neste exemplo, para um repositório denominado UserGitHubRepo, o parâmetro é definido como false.

    Por que estou fazendo essa alteração? A alteração deste parâmetro para desativa as verificações periódicas para que você possa utilizar apenas a detecção de alterações baseada em eventos.

    "configuration": { "Owner": "name", "Repo": "UserGitHubRepo", "PollForSourceChanges": "false", "Branch": "main", "OAuthToken": "****" },
  3. Se você estiver trabalhando com a estrutura de pipeline recuperada por meio do comando get-pipeline, é necessário editar a estrutura no arquivo JSON por meio da remoção das linhas metadata do arquivo. Caso contrário, o comando update-pipeline não é capaz de utilizá-la. Remova a seção "metadata" da estrutura do pipeline no arquivo JSON, incluindo os campos: { }, "created", "pipelineARN" e "updated".

    Por exemplo, remova as seguintes linhas da estrutura:

    "metadata": { "pipelineArn": "arn:aws:codepipeline:region:account-ID:pipeline-name", "created": "date", "updated": "date" },

    Salve o arquivo.

  4. Para aplicar suas alterações, execute o comando update-pipeline, especificando o pipeline do arquivo JSON, de modo semelhante ao seguinte:

    Importante

    Não se esqueça de incluir file:// antes do nome de arquivo. Ele é obrigatório nesse comando.

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

    Este comando retorna toda a estrutura do pipeline editado.

    nota

    O comando update-pipeline interrompe o pipeline. Se uma revisão estiver sendo executada pelo pipeline quando você executar o comando update-pipeline, essa execução será interrompida. Você deve iniciar manualmente o pipeline para executar a revisão através do pipeline atualizado. Use o comando start-pipeline-execution para iniciar manualmente o pipeline.

Atualizar os pipelines para o envio de eventos (origem do GitHub) (modelo do AWS CloudFormation)

Siga estas etapas para atualizar o pipeline (com uma origem do GitHub) de verificações periódicas (sondagem) para detecção de alterações baseada em eventos usando webhooks.

Para criar um pipeline baseado em eventos do AWS CodeCommit, edite o parâmetro PollForSourceChanges de seu pipeline e adicione os seguintes recursos em seu modelo:

Ao utilizar o AWS CloudFormation para criar e gerenciar seus pipelines, o modelo apresenta um conteúdo semelhante ao seguinte:

nota

Observe a propriedade de configuração PollForSourceChanges no estágio de origem. Se o seu modelo não inclui essa propriedade, PollForSourceChanges é definido como true por padrão.

YAML
Resources: AppPipeline: Type: AWS::CodePipeline::Pipeline Properties: Name: github-polling-pipeline RoleArn: !GetAtt CodePipelineServiceRole.Arn Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: ThirdParty Version: 1 Provider: GitHub OutputArtifacts: - Name: SourceOutput Configuration: Owner: !Ref GitHubOwner Repo: !Ref RepositoryName Branch: !Ref BranchName OAuthToken: {{resolve:secretsmanager:MyGitHubSecret:SecretString:token}} PollForSourceChanges: true RunOrder: 1 ...
JSON
"AppPipeline": { "Type": "AWS::CodePipeline::Pipeline", "Properties": { "Name": "github-polling-pipeline", "RoleArn": { "Fn::GetAtt": [ "CodePipelineServiceRole", "Arn" ] }, "Stages": [ { "Name": "Source", "Actions": [ { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "ThirdParty", "Version": 1, "Provider": "GitHub" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "Owner": { "Ref": "GitHubOwner" }, "Repo": { "Ref": "RepositoryName" }, "Branch": { "Ref": "BranchName" }, "OAuthToken": "{{resolve:secretsmanager:MyGitHubSecret:SecretString:token}}", "PollForSourceChanges": true }, "RunOrder": 1 } ] }, ...
Como adicionar parâmetros e criar um webhook em seu modelo

É altamente recomendável que você use o AWS Secrets Manager para armazenar suas credenciais. Se você usar o Secrets Manager, já terá configurado e armazenado seus parâmetros secretos no Secrets Manager. Este exemplo usa referências dinâmicas ao AWS Secrets Manager usando credenciais do GitHub para o webhook. Para obter mais informações, consulte Usar referências dinâmicas para especificar valores de modelo.

Importante

Ao transmitir parâmetros secretos, não insira o valor diretamente no modelo. O valor é renderizado como texto sem formatação e, portanto, é legível. Por motivos de segurança, não use texto sem formatação no modelo do AWS CloudFormation para armazenar suas credenciais.

Ao usar a CLI ou o AWS CloudFormation para criar um pipeline e adicionar um webhook, é necessário desativar as verificações periódicas.

nota

Para desativar as verificações periódicas, é necessário adicionar explicitamente o parâmetro PollForSourceChanges e defini-lo como falso, conforme descrito no procedimento final abaixo. Caso contrário, o padrão para um pipeline da CLI ou do AWS CloudFormation é que PollForSourceChanges seja padronizado como verdadeiro e não seja exibido na saída da estrutura de pipeline. Para obter mais informações sobre os padrões de PollForSourceChanges, consulte Configurações padrão do parâmetro PollForSourceChanges.

  1. No modelo, em Resources, adicione os parâmetros:

    YAML
    Parameters: GitHubOwner: Type: String ...
    JSON
    { "Parameters": { "BranchName": { "Description": "GitHub branch name", "Type": "String", "Default": "main" }, "GitHubOwner": { "Type": "String" }, ...
  2. Utilize o recurso AWS::CodePipeline::Webhook do AWS CloudFormation para adicionar um webhook.

    nota

    O TargetAction especificado deve corresponder à propriedade de Name da ação de origem definida no pipeline.

    Se RegisterWithThirdParty estiver definido como true, verifique se o usuário associado ao OAuthToken pode definir os escopos necessários no GitHub. O token e o webhook requerem os seguintes escopos do GitHub:

    • repo – usado para se obter o controle total para ler e efetuar pull de artefatos de repositórios públicos e privados para um pipeline.

    • admin:repo_hook – usado para se obter o controle total dos ganchos do repositório.

    Caso contrário, o GitHub retornará um 404. Para obter mais informações sobre o 404 retornado, consulte https://help.github.com/articles/about-webhooks.

    YAML
    AppPipelineWebhook: Type: AWS::CodePipeline::Webhook Properties: Authentication: GITHUB_HMAC AuthenticationConfiguration: SecretToken: {{resolve:secretsmanager:MyGitHubSecret:SecretString:token}} Filters: - JsonPath: "$.ref" MatchEquals: refs/heads/{Branch} TargetPipeline: !Ref AppPipeline TargetAction: SourceAction Name: AppPipelineWebhook TargetPipelineVersion: !GetAtt AppPipeline.Version RegisterWithThirdParty: true ...
    JSON
    "AppPipelineWebhook": { "Type": "AWS::CodePipeline::Webhook", "Properties": { "Authentication": "GITHUB_HMAC", "AuthenticationConfiguration": { "SecretToken": "{{resolve:secretsmanager:MyGitHubSecret:SecretString:token}}" }, "Filters": [{ "JsonPath": "$.ref", "MatchEquals": "refs/heads/{Branch}" }], "TargetPipeline": { "Ref": "AppPipeline" }, "TargetAction": "SourceAction", "Name": "AppPipelineWebhook", "TargetPipelineVersion": { "Fn::GetAtt": [ "AppPipeline", "Version" ] }, "RegisterWithThirdParty": true } }, ...
  3. Salve o modelo atualizado em seu computador local e abra o console do AWS CloudFormation.

  4. Selecione sua pilha e clique em Create Change Set for Current Stack (Criar conjunto de alterações para a pilha atual).

  5. Carregue o modelo e visualize as alterações listadas no AWS CloudFormation. Essas são as alterações a serem feitas na pilha. Seus novos recursos devem ser exibidos na lista.

  6. Escolha Executar.

Editar o parâmetro PollForSourceChanges do pipeline
Importante

Ao criar um pipeline com esse método, o parâmetro PollForSourceChanges é padronizado como verdadeiro se não for explicitamente definido como falso. Ao adicionar a detecção de alterações baseada em eventos, é necessário adicionar o parâmetro a sua saída e defini-lo como falso para desativar a sondagem. Caso contrário, o pipeline inicia duas vezes para uma única alteração de origem. Para obter mais detalhes, consulte Configurações padrão do parâmetro PollForSourceChanges.

  • No modelo, altere PollForSourceChanges para false. Se você não incluir PollForSourceChanges na sua definição de pipeline, adicione-o e configure para falso.

    Por que estou fazendo essa alteração? A alteração deste parâmetro para false desativa as verificações periódicas para que você possa utilizar apenas a detecção de alterações baseada em eventos.

    YAML
    Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: ThirdParty Version: 1 Provider: GitHub OutputArtifacts: - Name: SourceOutput Configuration: Owner: !Ref GitHubOwner Repo: !Ref RepositoryName Branch: !Ref BranchName OAuthToken: {{resolve:secretsmanager:MyGitHubSecret:SecretString:token}} PollForSourceChanges: false RunOrder: 1
    JSON
    { "Name": "Source", "Actions": [{ "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "ThirdParty", "Version": 1, "Provider": "GitHub" }, "OutputArtifacts": [{ "Name": "SourceOutput" }], "Configuration": { "Owner": { "Ref": "GitHubOwner" }, "Repo": { "Ref": "RepositoryName" }, "Branch": { "Ref": "BranchName" }, "OAuthToken": "{{resolve:secretsmanager:MyGitHubSecret:SecretString:token}}", PollForSourceChanges: false }, "RunOrder": 1 }]

Ao criar esses recursos com o AWS CloudFormation, o webhook definido é criado no repositório GitHub especificado. Seu pipeline é acionado durante a confirmação.

YAML
Parameters: GitHubOwner: Type: String Resources: AppPipelineWebhook: Type: AWS::CodePipeline::Webhook Properties: Authentication: GITHUB_HMAC AuthenticationConfiguration: SecretToken: {{resolve:secretsmanager:MyGitHubSecret:SecretString:token}} Filters: - JsonPath: "$.ref" MatchEquals: refs/heads/{Branch} TargetPipeline: !Ref AppPipeline TargetAction: SourceAction Name: AppPipelineWebhook TargetPipelineVersion: !GetAtt AppPipeline.Version RegisterWithThirdParty: true AppPipeline: Type: AWS::CodePipeline::Pipeline Properties: Name: github-events-pipeline RoleArn: !GetAtt CodePipelineServiceRole.Arn Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: ThirdParty Version: 1 Provider: GitHub OutputArtifacts: - Name: SourceOutput Configuration: Owner: !Ref GitHubOwner Repo: !Ref RepositoryName Branch: !Ref BranchName OAuthToken: {{resolve:secretsmanager:MyGitHubSecret:SecretString:token}} PollForSourceChanges: false RunOrder: 1 ...
JSON
{ "Parameters": { "BranchName": { "Description": "GitHub branch name", "Type": "String", "Default": "main" }, "RepositoryName": { "Description": "GitHub repository name", "Type": "String", "Default": "test" }, "GitHubOwner": { "Type": "String" }, "ApplicationName": { "Description": "CodeDeploy application name", "Type": "String", "Default": "DemoApplication" }, "BetaFleet": { "Description": "Fleet configured in CodeDeploy", "Type": "String", "Default": "DemoFleet" } }, "Resources": { ... }, "AppPipelineWebhook": { "Type": "AWS::CodePipeline::Webhook", "Properties": { "Authentication": "GITHUB_HMAC", "AuthenticationConfiguration": { "SecretToken": { "{{resolve:secretsmanager:MyGitHubSecret:SecretString:token}}" } }, "Filters": [ { "JsonPath": "$.ref", "MatchEquals": "refs/heads/{Branch}" } ], "TargetPipeline": { "Ref": "AppPipeline" }, "TargetAction": "SourceAction", "Name": "AppPipelineWebhook", "TargetPipelineVersion": { "Fn::GetAtt": [ "AppPipeline", "Version" ] }, "RegisterWithThirdParty": true } }, "AppPipeline": { "Type": "AWS::CodePipeline::Pipeline", "Properties": { "Name": "github-events-pipeline", "RoleArn": { "Fn::GetAtt": [ "CodePipelineServiceRole", "Arn" ] }, "Stages": [ { "Name": "Source", "Actions": [ { "Name": "SourceAction", "ActionTypeId": { "Category": "Source", "Owner": "ThirdParty", "Version": 1, "Provider": "GitHub" }, "OutputArtifacts": [ { "Name": "SourceOutput" } ], "Configuration": { "Owner": { "Ref": "GitHubOwner" }, "Repo": { "Ref": "RepositoryName" }, "Branch": { "Ref": "BranchName" }, "OAuthToken": "{{resolve:secretsmanager:MyGitHubSecret:SecretString:token}}", "PollForSourceChanges": false }, "RunOrder": 1 ...