Migrar los canales de sondeo para utilizar la detección de cambios basada en eventos - AWS CodePipeline

Migrar los canales de sondeo para utilizar la detección de cambios basada en eventos

AWS CodePipeline permite la entrega continua integral, lo que incluye el inicio de la canalización cada vez que se produce un cambio en el código. Hay dos formas de iniciar la canalización tras un cambio de código: detección de cambios basada en eventos y sondeo. Recomendamos utilizar la detección de cambios basada en eventos para las canalizaciones.

Utilice los procedimientos que se incluyen aquí para migrar (actualizar) sus canalizaciones de sondeo al método de detección de cambios basada en eventos para su canalización.

El método de detección de cambios basada en eventos recomendado para las canalizaciones viene determinado por el origen de la canalización, como CodeCommit. En ese caso, por ejemplo, la canalización de sondeo tendría que migrar a la detección de cambios basada en eventos con EventBridge.

Cómo migrar canalizaciones de sondeo

Para migrar canalizaciones de sondeo, determine sus canalizaciones de sondeo y, a continuación, determine el método recomendado de detección de cambios basada en eventos:

  • Siga los pasos que se indican en Cómo ver las canalizaciones de sondeo de su cuenta para determinar sus canalizaciones de sondeo.

  • En la tabla, busque el tipo de origen de su canalización y, a continuación, elija el procedimiento con la implementación que desee usar para migrar su canalización de sondeo. Cada sección contiene varios métodos de migración, como el uso de la CLI o CloudFormation.

Cómo migrar canalizaciones al método de detección de cambios recomendado
Origen de la canalización Método recomendado de detección basada en eventos Procedimientos de migración
AWS CodeCommit Amazon EventBridge (recomendado). Consulte Migración de canalizaciones de sondeo con un origen de CodeCommit.
Amazon S3 EventBridge y bucket habilitados para las notificaciones de eventos (recomendado). Consulte Migración de canalizaciones de sondeo con un origen de S3 habilitado para los eventos.
Amazon S3 EventBridge y un registro de seguimiento de AWS CloudTrail. Consulte Migración de canalizaciones de sondeo con un origen de S3 y un registro de seguimiento de CloudTrail.
GitHub (mediante la aplicación de GitHub) Conexiones (recomendado) Consulte Migración de canalizaciones de sondeo para una acción de origen de GitHub (mediante la aplicación OAuth) a conexiones.
GitHub (mediante la aplicación OAuth) Webhooks Consulte Migración de canalizaciones de sondeo para una acción de origen de GitHub (mediante la aplicación OAuth) a webhooks.
importante

En el caso de las actualizaciones de configuración de acciones de canalizaciones aplicables, como las canalizaciones con una acción de GitHub (mediante la aplicación OAuth), deberá establecer explícitamente el parámetro PollForSourceChanges en false en la configuración de la acción de origen para impedir el sondeo de una canalización. Como resultado, es posible configurar una canalización erróneamente con detección de cambios basados en eventos y por ejemplo, la configuración de una regla de EventBridge y también se omiten el parámetro PollForSourceChanges. Esto se traduce en ejecuciones de canalizaciones duplicadas y la canalización se computa para los límites del número total de canalizaciones que realicen sondeos, lo que de forma predeterminada es mucho menor que las canalizaciones basadas en eventos. Para obtener más información, consulte Cuotas en AWS CodePipeline.

Cómo ver las canalizaciones de sondeo de su cuenta

Como primer paso, utilice uno de los siguientes scripts para determinar qué canalizaciones de su cuenta están configuradas para el sondeo. Estas son las canalizaciones para migrar a la detección de cambios basada en eventos.

Ver las canalizaciones de sondeo de la cuenta (script)

Siga estos pasos para determinar con un script las canalizaciones de su cuenta que utilizan el sondeo.

  1. Abra una ventana de terminal y, a continuación, realice una de las operaciones siguientes:

    • Ejecute el comando siguiente para crear un script nuevo denominado PollingPipelinesExtractor.sh.

      vi PollingPipelinesExtractor.sh
    • Para utilizar un script de python, ejecute el siguiente comando para crear un nuevo script de python llamado PollingPipelinesExtractor.py.

      vi PollingPipelinesExtractor.py
  2. Copie y pegue el siguiente código en el script PollingPipelinesExtractor. Realice una de las siguientes acciones:

    • Copie y pegue el siguiente código en el 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 y pegue el siguiente código en el 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. Deberá ejecutar el script para cada región en la que tenga canalizaciones. Para ejecutar el script, realice una de las siguientes operaciones:

    • Ejecute el comando siguiente para crear un script nuevo denominado PollingPipelinesExtractor.sh. En este ejemplo, la región es us-west-2.

      ./PollingPipelinesExtractor.sh us-west-2
    • Para utilizar un script de python, ejecute el siguiente comando para ejecutar el script de python llamado PollingPipelinesExtractor.py. En este ejemplo, la región es us-west-2.

      python3 PollingPipelinesExtractor.py us-west-2

    En el siguiente ejemplo de salida del script, la región us-west-2 devolvió una lista de canalizaciones de sondeo y muestra la hora de la última ejecución de cada canalización.

    % ./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...%

    Analice la salida del script y, para cada canalización de la lista, actualice el origen de sondeo al método recomendado de detección de cambios basada en eventos.

    nota

    Sus canalizaciones de sondeo vienen determinadas por la configuración de acción de la canalización para el parámetro PollForSourceChanges. Si la configuración de origen de la canalización tiene el parámetro PollForSourceChanges omitido, CodePipeline sondea de forma predeterminada su repositorio para ver si hay cambios en el origen. Este comportamiento es el mismo que si se incluye PollForSourceChanges y se establece en true. Para obtener más información, consulte los parámetros de configuración de la acción de origen de su canalización, como los parámetros de configuración de la acción de origen de Amazon S3, en Referencia sobre la acción de origen de Amazon S3.

    Tenga en cuenta que este script también genera un archivo.csv que contiene la lista de canalizaciones de sondeo de su cuenta y guarda el archivo.csv en la carpeta de trabajo actual.

Migración de canalizaciones de sondeo con un origen de CodeCommit

Puede migrar su canalización de sondeo para usar EventBridge para detectar cambios en su repositorio de origen de CodeCommit o en su bucket de origen de Amazon S3.

CodeCommit: en el caso de una canalización con un origen de CodeCommit, modifique la canalización para que la detección de cambios se automatice mediante EventBridge. Elija uno de los siguientes métodos para implementar la migración:

Migración de canalizaciones de sondeo (origen de CodeCommit o Amazon S3) (consola)

Puede utilizar la consola de CodePipeline para actualizar su canalización para usar EventBridge para detectar cambios en su repositorio de origen de CodeCommit o su bucket de origen de Amazon S3.

nota

Cuando se utiliza la consola para editar una canalización que tiene un repositorio de origen en CodeCommit o un bucket de origen de Amazon S3, la regla y el rol de IAM se crean automáticamente. Si utiliza la AWS CLI para editar la canalización, debe crear el rol de IAM y la regla de EventBridge. Para obtener más información, consulte acciones de origen de CodeCommit y EventBridge.

Utilice estos pasos para editar una canalización que utiliza las comprobaciones periódicas. Si desea crear una canalización, consulte Creación de una canalización, etapas y acciones.

Para editar la etapa de código fuente de la canalización
  1. Inicie sesión en la Consola de administración de AWS y abra la consola de CodePipeline en http://console.aws.amazon.com/codesuite/codepipeline/home.

    Se muestran los nombres de todas las canalizaciones asociadas con su cuenta de AWS.

  2. En Nombre, elija el nombre de la canalización que desea editar. Esto abre una vista detallada de la canalización, que incluye el estado de cada una de las acciones en cada etapa de la canalización.

  3. En la página de detalles de la canalización, elija Edit.

  4. En la etapa Edit (Editar), elija el icono de edición en la acción de código fuente.

  5. Expanda Change Detection Options (Cambiar opciones de detección) y elija Use CloudWatch Events to automatically start my pipeline when a change occurs (recommended) (Usar CloudWatch Events para iniciar automáticamente mi canalización cuando se produzca un cambio (recomendado)).

    Aparecerá un mensaje que muestra la regla de EventBridge que se creará para esta canalización. Elija Actualizar.

    Si está actualizando una canalización que tiene origen en Amazon S3, aparecerá el mensaje siguiente. Elija Actualizar.

  6. Cuando haya terminado de editar la canalización, elija Save pipeline changes para volver a la página de resumen.

    Aparece un mensaje que muestra el nombre de la regla de EventBridge que se creará para la canalización. Elija Guardar y continuar.

  7. Para probar la acción, publique un cambio utilizando la AWS CLI para confirmar un cambio en el código fuente especificado en la etapa de código fuente de la canalización.

Migración de canalizaciones de sondeo (origen de CodeCommit) (CLI)

Siga estos pasos para editar una canalización que utiliza sondeos (comprobaciones periódicas) para utilizar una regla de EventBridge para iniciar la canalización. Si desea crear una canalización, consulte Creación de una canalización, etapas y acciones.

Para crear una canalización basada en eventos con CodeCommit, debe editar el parámetro PollForSourceChanges de la canalización y, a continuación, crear los siguientes recursos manualmente:

  • Evento de EventBridge

  • Rol de IAM para permitir que este evento inicie la canalización

Para editar el parámetro PollForSourceChanges de la canalización
importante

Al crear una canalización con este método, el parámetro PollForSourceChanges se establece en true de forma predeterminada si no se establece explícitamente en false. Al añadir la detección de cambios basada en eventos, debe añadir el parámetro a la salida y establecerlo en false para deshabilitar el sondeo. De lo contrario, la canalización comienza dos veces para un único cambio en el código fuente. Para obtener más información, consulte Configuración válida para el parámetro PollForSourceChanges.

  1. Ejecute el comando get-pipeline para copiar la estructura de canalización en un archivo JSON. Por ejemplo, para una canalización denominada MyFirstPipeline, escriba el siguiente comando:

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

    Este comando no devuelve nada, pero el archivo creado debería aparecer en el directorio en el que se ejecutó el comando.

  2. Abra el archivo JSON en cualquier editor de texto sin formato y edite la etapa de origen cambiando el parámetro PollForSourceChanges por false, tal y como se muestra en este ejemplo.

    Por qué voy a hacer este cambio? Al cambiar este parámetro a false, se desactivan las comprobaciones periódicas, por lo que únicamente puede utilizar la detección de cambios basada en eventos.

    "configuration": { "PollForSourceChanges": "false", "BranchName": "main", "RepositoryName": "MyTestRepo" },
  3. Si está trabajando con la estructura de la canalización recuperada mediante el comando get-pipeline, elimine las líneas metadata del archivo JSON. De lo contrario, el comando update-pipeline no puede utilizarlo. Elimine las líneas "metadata": { } y los campos "created", "pipelineARN" y "updated".

    Por ejemplo, quite las siguientes líneas de la estructura:

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

    Guarde el archivo.

  4. Para aplicar los cambios, ejecute el comando update-pipeline especificando el archivo JSON:

    importante

    Asegúrese de incluir file:// antes del nombre de archivo. Es obligatorio en este comando.

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

    Este comando devuelve la estructura completa de la canalización editada.

    nota

    El comando update-pipeline detiene la canalización. Si se está ejecutando una revisión en la canalización al ejecutar el comando update-pipeline, dicha ejecución se detiene. Debe iniciar manualmente la canalización para ejecutar dicha revisión en la canalización actualizada. Utilice el comando start-pipeline-execution para iniciar manualmente la canalización.

Para crear una regla de EventBridge con CodeCommit como origen de eventos y CodePipeline como destino
  1. Añada permisos para que EventBridge pueda utilizar CodePipeline para invocar la regla. Para obtener más información, consulte Uso de políticas basadas en recursos para Amazon EventBridge.

    1. Utilice el siguiente ejemplo para crear la política de confianza que permite que EventBridge asuma el rol de servicio. Ponga un nombre a la política de confianza trustpolicyforEB.json.

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
    2. Utilice el comando para crear el rol Role-for-MyRule y asocie la política de confianza.

      aws iam create-role --role-name Role-for-MyRule --assume-role-policy-document file://trustpolicyforEB.json
    3. Cree el JSON de la política de permisos, tal y como se muestra en este ejemplo para la canalización denominada MyFirstPipeline. Ponga un nombre a la política de permisos permissionspolicyforEB.json.

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codepipeline:StartPipelineExecution" ], "Resource": [ "arn:aws:codepipeline:us-west-2:111122223333:MyFirstPipeline" ] } ] }
    4. Utilice el siguiente comando para asociar la política de permisos CodePipeline-Permissions-Policy-for-EB al rol Role-for-MyRule.

      Por qué voy a hacer este cambio? Al añadir esta política al rol, se crean permisos para EventBridge.

      aws iam put-role-policy --role-name Role-for-MyRule --policy-name CodePipeline-Permissions-Policy-For-EB --policy-document file://permissionspolicyforEB.json
  2. Llame al comando put-rule e incluya los parámetros --name, --event-pattern y --role-arn.

    Por qué voy a hacer este cambio? Este comando permite que CloudFormation cree el evento.

    El siguiente comando de ejemplo crea una regla llamada 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 agregar CodePipeline como destino, ejecute el comando put-targets e incluya los siguientes parámetros:

    • El parámetro --rule se usa con el rule_name que creó con el comando put-rule.

    • El parámetro --targets se usa con el Id del destino de la lista de destinos y el ARN de la canalización de destino.

    El siguiente comando de muestra especifica que, para la regla denominada MyCodeCommitRepoRule, el destino Id se compone del número uno, lo que indica que, en lo que puede ser una lista de destinos de la regla, se trata del destino 1. El comando de muestra también especifica un ARN de ejemplo para la canalización. La canalización se inicia cuando se produce algún cambio en el repositorio.

    aws events put-targets --rule MyCodeCommitRepoRule --targets Id=1,Arn=arn:aws:codepipeline:us-west-2:80398EXAMPLE:TestPipeline
  4. (Opcional) Para configurar un transformador de entrada con anulaciones de origen para un ID de imagen específico, utilice el siguiente fragmento de código JSON en el comando de la CLI. En el siguiente ejemplo, se configura una anulación donde:

    • actionName (Source en este ejemplo) es el valor dinámico, que se define en la creación de la canalización, no se deriva del evento de origen.

    • revisionType (COMMIT_ID en este ejemplo) es el valor dinámico, que se define en la creación de la canalización, no se deriva del evento de origen.

    • revisionValue (<revisionValue> en este ejemplo) se deriva de la variable del evento de origen.

    { "Rule": "my-rule", "Targets": [ { "Id": "MyTargetId", "Arn": "pipeline-ARN", "InputTransformer": { "sourceRevisions": { "actionName": "Source", "revisionType": "COMMIT_ID", "revisionValue": "<revisionValue>" }, "variables": [ { "name": "Branch_Name", "value": "value" } ] } } ] }

Migrar las canalizaciones de sondeo (fuente de CodeCommit) (plantilla de CloudFormation)

Para crear una canalización basada en eventos con AWS CodeCommit, deberá editar el parámetro PollForSourceChanges de la canalización y, a continuación, añadir los siguientes recursos a su plantilla:

  • Una regla de EventBridge

  • Un rol de IAM para su regla de EventBridge

Si utiliza CloudFormation para crear y administrar las canalizaciones, la plantilla incluye contenido similar al siguiente.

nota

La propiedad Configuration en la etapa de código fuente denominada PollForSourceChanges. Si dicha propiedad no está incluida en la plantilla, PollForSourceChanges se establece en true de forma predeterminada.

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 }] },
Para actualizar la plantilla de CloudFormation de la canalización y crear la regla de EventBridge
  1. En la plantilla, bajo Resources, utilice el recurso AWS::IAM::Role de CloudFormation para configurar el rol de IAM que permitirá que su evento inicie la canalización. Esta entrada crea un rol que utiliza dos políticas:

    • La primera política permite asumir el rol.

    • La segunda política concede permisos para iniciar la canalización.

    Por qué voy a hacer este cambio? La adición del recurso AWS::IAM::Role permite que CloudFormation cree los permisos para EventBridge. Este recurso se añade a su pila de 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. En la plantilla, bajo Resources, utilice el recurso de AWS::Events::Rule CloudFormation para añadir una regla de EventBridge. Este patrón de eventos crea un evento que monitoriza la introducción de cambios en su repositorio. Cuando EventBridge detecta un cambio en el estado del repositorio, la regla invoca StartPipelineExecution en la canalización de destino.

    Por qué voy a hacer este cambio? Al añadir el recurso AWS::Events::Rule, CloudFormation puede crear el evento. Este recurso se añade a su pila de 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. (Opcional) Para configurar un transformador de entrada con anulaciones de origen para un ID de imagen específico, utilice el siguiente fragmento de código YAML. En el siguiente ejemplo, se configura una anulación donde:

    • actionName (Source en este ejemplo) es el valor dinámico, que se define en la creación de la canalización, no se deriva del evento de origen.

    • revisionType (COMMIT_ID en este ejemplo) es el valor dinámico, que se define en la creación de la canalización, no se deriva del evento de origen.

    • revisionValue (<revisionValue> en este ejemplo) se deriva de la variable del evento de origen.

    • Se especifican las variables de salida para BranchName y Value.

    Rule: my-rule Targets: - Id: MyTargetId Arn: pipeline-ARN InputTransformer: sourceRevisions: actionName: Source revisionType: COMMIT_ID revisionValue: <revisionValue> variables: - name: BranchName value: value
  4. Guarde la plantilla actualizada en el equipo local y luego abra la consola de CloudFormation.

  5. Seleccione la pila y luego elija Create Change Set for Current Stack (Crear conjuntos de cambios para la pila actual).

  6. Cargue la plantilla y, a continuación, consulte los cambios indicados en CloudFormation. Estos son los cambios que se realizan en la pila. Debería ver los nuevos recursos en la lista.

  7. Elija Ejecutar.

Para editar el parámetro PollForSourceChanges de la canalización
importante

En muchos casos, el parámetro PollForSourceChanges es true de forma predeterminada al crear una canalización. Al añadir la detección de cambios basada en eventos, debe añadir el parámetro a la salida y establecerlo en false para deshabilitar el sondeo. De lo contrario, la canalización comienza dos veces para un único cambio en el código fuente. Para obtener más información, consulte Configuración válida para el parámetro PollForSourceChanges.

  • En la plantilla, cambie PollForSourceChanges por false. Si no ha incluido PollForSourceChanges en la definición de la canalización, añádalo y establézcalo en false.

    Por qué voy a hacer este cambio? Al cambiar este parámetro a false, se desactivan las comprobaciones periódicas, por lo que únicamente puede utilizar la detección de cambios basada en 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 } ] },

Al crear estos recursos con CloudFormation, la canalización se activa cuando crea o actualiza archivos en el repositorio. Este es el fragmento final de la plantilla:

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 } ] }, ...

Migración de canalizaciones de sondeo con un origen de S3 habilitado para los eventos

En el caso de una canalización con un origen de Amazon S3, modifique la canalización para que la detección de cambios se automatice a través de EventBridge y con un bucket de origen que esté habilitado para las notificaciones de eventos. Este es el método recomendado si utiliza la CLI o CloudFormation para migrar su canalización.

nota

Esto incluye el uso de un bucket que esté habilitado para las notificaciones de eventos, en el que no es necesario crear un registro de seguimiento de CloudTrail independiente. Si utiliza la consola, se configurarán una regla de eventos y un registro de seguimiento de CloudTrail para usted. Para los siguientes pasos, consulte Migración de canalizaciones de sondeo con un origen de S3 y un registro de seguimiento de CloudTrail.

Migrar los canales de sondeo con origen de S3 habilitado para los eventos (CLI)

Siga estos pasos para editar una canalización que utiliza sondeos (comprobaciones periódicas) para utilizar un evento de EventBridge en su lugar. Si desea crear una canalización, consulte Creación de una canalización, etapas y acciones.

Para crear una canalización basada en eventos con Amazon S3, debe editar el parámetro PollForSourceChanges de la canalización y, a continuación, crear los siguientes recursos manualmente:

  • Regla de evento de EventBridge

  • Rol de IAM para permitir que el evento de EventBridge inicie la canalización

Para crear una regla de EventBridge con Amazon S3 como origen de eventos y CodePipeline como destino y aplicar la política de permisos
  1. Conceda permisos para que EventBridge pueda utilizar CodePipeline para invocar la regla. Para obtener más información, consulte Uso de políticas basadas en recursos para Amazon EventBridge.

    1. Utilice el siguiente ejemplo para crear la política de confianza que permite que EventBridge asuma el rol de servicio. Denomínelo trustpolicyforEB.json.

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
    2. Utilice el comando para crear el rol Role-for-MyRule y asocie la política de confianza.

      Por qué voy a hacer este cambio? Al añadir esta política de confianza al rol, se crean permisos para .

      aws iam create-role --role-name Role-for-MyRule --assume-role-policy-document file://trustpolicyforEB.json
    3. Cree el JSON de la política de permisos tal y como se muestra aquí para la canalización denominada MyFirstPipeline. Ponga un nombre a la política de permisos permissionspolicyforEB.json.

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codepipeline:StartPipelineExecution" ], "Resource": [ "arn:aws:codepipeline:us-west-2:111122223333:MyFirstPipeline" ] } ] }
    4. Utilice el siguiente comando para asociar la nueva política de permisos CodePipeline-Permissions-Policy-for-EB al rol Role-for-MyRule que ha creado.

      aws iam put-role-policy --role-name Role-for-MyRule --policy-name CodePipeline-Permissions-Policy-For-EB --policy-document file://permissionspolicyforEB.json
  2. Llame al comando put-rule e incluya los parámetros --name, --event-pattern y --role-arn.

    El siguiente comando de ejemplo crea una regla denominada EnabledS3SourceRule.

    aws events put-rule --name "EnabledS3SourceRule" --event-pattern "{\"source\":[\"aws.s3\"],\"detail-type\":[\"Object Created\"],\"detail\":{\"bucket\":{\"name\":[\"amzn-s3-demo-source-bucket\"]}}}" --role-arn "arn:aws:iam::ACCOUNT_ID:role/Role-for-MyRule"
  3. Para añadir CodePipeline como destino, ejecute el comando put-targets e incluya los parámetros --rule y --targets.

    El siguiente comando especifica que, para la regla denominada EnabledS3SourceRule, el destino Id se compone del número uno, lo que indica que, en lo que puede ser una lista de destinos de la regla, se trata del destino 1. El comando también especifica un ARN de ejemplo para la canalización. La canalización se inicia cuando se produce algún cambio en el repositorio.

    aws events put-targets --rule EnabledS3SourceRule --targets Id=codepipeline-AppPipeline,Arn=arn:aws:codepipeline:us-west-2:80398EXAMPLE:TestPipeline
Para editar el parámetro PollForSourceChanges de la canalización
importante

Al crear una canalización con este método, el parámetro PollForSourceChanges se establece en true de forma predeterminada si no se establece explícitamente en false. Al añadir la detección de cambios basada en eventos, debe añadir el parámetro a la salida y establecerlo en false para deshabilitar el sondeo. De lo contrario, la canalización comienza dos veces para un único cambio en el código fuente. Para obtener más información, consulte Configuración válida para el parámetro PollForSourceChanges.

  1. Ejecute el comando get-pipeline para copiar la estructura de canalización en un archivo JSON. Por ejemplo, para una canalización denominada MyFirstPipeline, escriba el siguiente comando:

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

    Este comando no devuelve nada, pero el archivo creado debería aparecer en el directorio en el que se ejecutó el comando.

  2. Abra el archivo JSON en cualquier editor de texto sin formato y edite la etapa de código fuente cambiando el parámetro PollForSourceChanges del bucket denominado amzn-s3-demo-source-bucket a false, tal y como se muestra en este ejemplo.

    Por qué voy a hacer este cambio? Al establecer este parámetro en false, se desactivan las comprobaciones periódicas, por lo que únicamente puede utilizar la detección de cambios basada en eventos.

    "configuration": { "S3Bucket": "amzn-s3-demo-source-bucket", "PollForSourceChanges": "false", "S3ObjectKey": "index.zip" },
  3. Si está trabajando con la estructura de la canalización recuperada mediante el comando get-pipeline, debe eliminar las líneas metadata del archivo JSON. De lo contrario, el comando update-pipeline no puede utilizarlo. Elimine las líneas "metadata": { } y los campos "created", "pipelineARN" y "updated".

    Por ejemplo, quite las siguientes líneas de la estructura:

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

    Guarde el archivo.

  4. Para aplicar los cambios, ejecute el comando update-pipeline especificando el archivo JSON:

    importante

    Asegúrese de incluir file:// antes del nombre de archivo. Es obligatorio en este comando.

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

    Este comando devuelve la estructura completa de la canalización editada.

    nota

    El comando update-pipeline detiene la canalización. Si se está ejecutando una revisión en la canalización al ejecutar el comando update-pipeline, dicha ejecución se detiene. Debe iniciar manualmente la canalización para ejecutar dicha revisión en la canalización actualizada. Utilice el comando start-pipeline-execution para iniciar manualmente la canalización.

Migrar los canales de sondeo con origen de S3 habilitado para los eventos (plantilla de CloudFormation)

Este procedimiento es para una canalización en la que el bucket de origen tiene los eventos habilitados.

Utilice estos pasos para editar una canalización con origen en Amazon S3 que usa sondeos para que use la detección de cambios basada en eventos.

Para crear una canalización basada en eventos con Amazon S3, deberá editar el parámetro PollForSourceChanges de la canalización y, a continuación, añadir los siguientes recursos a su plantilla:

  • Regla de EventBridge y rol de IAM para permitir que este evento inicie nuestra canalización.

Si utiliza CloudFormation para crear y administrar las canalizaciones, la plantilla incluye contenido similar al siguiente.

nota

La propiedad Configuration en la etapa de código fuente denominada PollForSourceChanges. Si la plantilla no incluye esa propiedad, PollForSourceChanges se establece en true de forma predeterminada.

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 crear una regla de EventBridge con Amazon S3 como origen de eventos y CodePipeline como destino y aplicar la política de permisos
  1. En la plantilla, bajo Resources, utilice el recurso AWS::IAM::Role de CloudFormation para configurar el rol de IAM que permitirá que su evento inicie la canalización. Esta entrada crea un rol que utiliza dos políticas:

    • La primera política permite asumir el rol.

    • La segunda política concede permisos para iniciar la canalización.

    Por qué voy a hacer este cambio? La adición del recurso AWS::IAM::Role permite que CloudFormation cree los permisos para EventBridge. Este recurso se añade a su pila de 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 el recurso de AWS::Events::Rule CloudFormation para añadir una regla de EventBridge. Este patrón de eventos crea un evento que monitoriza la creación o eliminación de objetos en el bucket de origen de Amazon S3. Además, incluya un objetivo de la canalización. Cuando se crea un objeto, esta regla invoca StartPipelineExecution en la canalización de destino.

    Por qué voy a hacer este cambio? Al añadir el recurso AWS::Events::Rule, CloudFormation puede crear el evento. Este recurso se añade a su pila de 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. Guarde la plantilla actualizada en el equipo local y abra la consola de CloudFormation.

  4. Seleccione la pila y luego elija Create Change Set for Current Stack (Crear conjuntos de cambios para la pila actual).

  5. Cargue su plantilla actualizada y, a continuación, consulte los cambios indicados en CloudFormation. Estos son los cambios que se realizarán en la pila. Debería ver los nuevos recursos en la lista.

  6. Elija Ejecutar.

Para editar el parámetro PollForSourceChanges de la canalización
importante

Al crear una canalización con este método, el parámetro PollForSourceChanges se establece en true de forma predeterminada si no se establece explícitamente en false. Al añadir la detección de cambios basada en eventos, debe añadir el parámetro a la salida y establecerlo en false para deshabilitar el sondeo. De lo contrario, la canalización comienza dos veces para un único cambio en el código fuente. Para obtener más información, consulte Configuración válida para el parámetro PollForSourceChanges.

  • En la plantilla, cambie PollForSourceChanges por false. Si no ha incluido PollForSourceChanges en la definición de la canalización, añádalo y establézcalo en false.

    Por qué voy a hacer este cambio? Al cambiar PollForSourceChanges a false, se desactivan las comprobaciones periódicas, por lo que únicamente puede utilizar la detección de cambios basada en 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 }

Al utilizar CloudFormation para crear estos recursos, la canalización se activa cuando crea o actualiza archivos en el repositorio.

nota

No se detenga aquí. Aunque la canalización se crea, debe crear una segunda plantilla de CloudFormation para la canalización de Amazon S3. Si no crea la segunda plantilla, la canalización no tendrá ninguna funcionalidad de detección de cambios.

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
JSON
JSON
{ "Version":"2012-10-17", "Statement": [ { "Action": [ "appconfig:StartDeployment", "appconfig:StopDeployment", "appconfig:GetDeployment" ], "Resource": [ "arn:aws:appconfig:*:111122223333:application/[[Application]]", "arn:aws:appconfig:*:111122223333:application/[[Application]]/*", "arn:aws:appconfig:*:111122223333:deploymentstrategy/*" ], "Effect": "Allow" } ] }

Migración de canalizaciones de sondeo con un origen de S3 y un registro de seguimiento de CloudTrail

En el caso de una canalización con origen de Amazon S3, modifique la canalización para que la detección de cambios se automatice mediante EventBridge. Elija uno de los siguientes métodos para implementar la migración:

Migrar los canales de sondeo con una fuente S3 y un seguimiento de CloudTrail (CLI)

Siga estos pasos para editar una canalización que utiliza sondeos (comprobaciones periódicas) para utilizar un evento de EventBridge en su lugar. Si desea crear una canalización, consulte Creación de una canalización, etapas y acciones.

Para crear una canalización basada en eventos con Amazon S3, debe editar el parámetro PollForSourceChanges de la canalización y, a continuación, crear los siguientes recursos manualmente:

  • AWS CloudTrail registro de seguimiento, bucket y política de bucket que Amazon S3 puede usar para registrar los eventos.

  • Evento de EventBridge

  • Rol de IAM para permitir que el evento de EventBridge inicie la canalización

Para crear un registro de seguimiento de AWS CloudTrail y activar el registro

Para crear un registro de seguimiento mediante la AWS CLI, use el comando create-trail especificando:

  • El nombre del registro de seguimiento.

  • El bucket al que ya haya aplicado la política de bucket para AWS CloudTrail.

Para obtener más información, consulte Creación de un registro de seguimiento con la interfaz de línea de comandos de AWS.

  1. Llame al comando create-trail e incluya los parámetros --name y --s3-bucket-name.

    Por qué voy a hacer este cambio? Esto crea el registro de seguimiento de CloudTrail necesario para su bucket de origen de S3.

    El comando siguiente utiliza --name y --s3-bucket-name para crear un registro de seguimiento llamado my-trail y un bucket llamado amzn-s3-demo-source-bucket.

    aws cloudtrail create-trail --name my-trail --s3-bucket-name amzn-s3-demo-source-bucket
  2. Use el comando start-logging e incluya el parámetro --name.

    Por qué voy a hacer este cambio? Este comando inicia el registro de CloudTrail para su bucket de origen y envía eventos a EventBridge.

    Ejemplo:

    El siguiente comando utiliza --name para iniciar el registro en un registro de seguimiento llamado my-trail.

    aws cloudtrail start-logging --name my-trail
  3. Llame al comando put-event-selectors e incluya los parámetros --trail-name y --event-selectors. Utilice selectores de eventos para indicar que desea que el registro de seguimiento grabe los eventos de datos del bucket de origen y envíe los eventos a la regla de EventBridge.

    Por qué voy a hacer este cambio? Este comando filtra eventos.

    Ejemplo:

    El siguiente comando utiliza --trail-name y --event-selectors para especificar eventos de datos para un bucket de origen y un prefijo llamados amzn-s3-demo-source-bucket/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:::amzn-s3-demo-source-bucket/myFolder/file.zip"] }] }]'
Para crear una regla de EventBridge con Amazon S3 como origen de eventos y CodePipeline como destino y aplicar la política de permisos
  1. Conceda permisos para que EventBridge pueda utilizar CodePipeline para invocar la regla. Para obtener más información, consulte Uso de políticas basadas en recursos para Amazon EventBridge.

    1. Utilice el siguiente ejemplo para crear la política de confianza que permite que EventBridge asuma el rol de servicio. Denomínelo trustpolicyforEB.json.

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
    2. Utilice el comando para crear el rol Role-for-MyRule y asocie la política de confianza.

      Por qué voy a hacer este cambio? Al añadir esta política de confianza al rol, se crean permisos para .

      aws iam create-role --role-name Role-for-MyRule --assume-role-policy-document file://trustpolicyforEB.json
    3. Cree el JSON de la política de permisos tal y como se muestra aquí para la canalización denominada MyFirstPipeline. Ponga un nombre a la política de permisos permissionspolicyforEB.json.

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codepipeline:StartPipelineExecution" ], "Resource": [ "arn:aws:codepipeline:us-west-2:111122223333:MyFirstPipeline" ] } ] }
    4. Utilice el siguiente comando para asociar la nueva política de permisos CodePipeline-Permissions-Policy-for-EB al rol Role-for-MyRule que ha creado.

      aws iam put-role-policy --role-name Role-for-MyRule --policy-name CodePipeline-Permissions-Policy-For-EB --policy-document file://permissionspolicyforEB.json
  2. Llame al comando put-rule e incluya los parámetros --name, --event-pattern y --role-arn.

    El siguiente comando de ejemplo crea una regla denominada 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\":[\"amzn-s3-demo-source-bucket\"],\"key\":[\"my-key\"]}}} --role-arn "arn:aws:iam::ACCOUNT_ID:role/Role-for-MyRule"
  3. Para añadir CodePipeline como destino, ejecute el comando put-targets e incluya los parámetros --rule y --targets.

    El siguiente comando especifica que, para la regla denominada MyS3SourceRule, el destino Id se compone del número uno, lo que indica que, en lo que puede ser una lista de destinos de la regla, se trata del destino 1. El comando también especifica un ARN de ejemplo para la canalización. La canalización se inicia cuando se produce algún cambio en el repositorio.

    aws events put-targets --rule MyS3SourceRule --targets Id=1,Arn=arn:aws:codepipeline:us-west-2:80398EXAMPLE:TestPipeline
  4. (Opcional) Para configurar un transformador de entrada con anulaciones de origen para un ID de imagen específico, utilice el siguiente fragmento de código JSON en el comando de la CLI. En el siguiente ejemplo, se configura una anulación donde:

    • actionName (Source en este ejemplo) es el valor dinámico, que se define en la creación de la canalización, no se deriva del evento de origen.

    • revisionType (S3_OBJECT_VERSION_ID en este ejemplo) es el valor dinámico, que se define en la creación de la canalización, no se deriva del evento de origen.

    • revisionValue (<revisionValue> en este ejemplo) se deriva de la variable del evento de origen.

    { "Rule": "my-rule", "Targets": [ { "Id": "MyTargetId", "Arn": "ARN", "InputTransformer": { "InputPathsMap": { "revisionValue": "$.detail.object.version-id" }, "InputTemplate": { "sourceRevisions": { "actionName": "Source", "revisionType": "S3_OBJECT_VERSION_ID", "revisionValue": "<revisionValue>" } } } } ] }
Para editar el parámetro PollForSourceChanges de la canalización
importante

Al crear una canalización con este método, el parámetro PollForSourceChanges se establece en true de forma predeterminada si no se establece explícitamente en false. Al añadir la detección de cambios basada en eventos, debe añadir el parámetro a la salida y establecerlo en false para deshabilitar el sondeo. De lo contrario, la canalización comienza dos veces para un único cambio en el código fuente. Para obtener más información, consulte Configuración válida para el parámetro PollForSourceChanges.

  1. Ejecute el comando get-pipeline para copiar la estructura de canalización en un archivo JSON. Por ejemplo, para una canalización denominada MyFirstPipeline, escriba el siguiente comando:

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

    Este comando no devuelve nada, pero el archivo creado debería aparecer en el directorio en el que se ejecutó el comando.

  2. Abra el archivo JSON en cualquier editor de texto sin formato y edite la etapa de código fuente cambiando el parámetro PollForSourceChanges del bucket denominado amzn-s3-demo-source-bucket a false, tal y como se muestra en este ejemplo.

    Por qué voy a hacer este cambio? Al establecer este parámetro en false, se desactivan las comprobaciones periódicas, por lo que únicamente puede utilizar la detección de cambios basada en eventos.

    "configuration": { "S3Bucket": "amzn-s3-demo-source-bucket", "PollForSourceChanges": "false", "S3ObjectKey": "index.zip" },
  3. Si está trabajando con la estructura de la canalización recuperada mediante el comando get-pipeline, debe eliminar las líneas metadata del archivo JSON. De lo contrario, el comando update-pipeline no puede utilizarlo. Elimine las líneas "metadata": { } y los campos "created", "pipelineARN" y "updated".

    Por ejemplo, quite las siguientes líneas de la estructura:

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

    Guarde el archivo.

  4. Para aplicar los cambios, ejecute el comando update-pipeline especificando el archivo JSON:

    importante

    Asegúrese de incluir file:// antes del nombre de archivo. Es obligatorio en este comando.

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

    Este comando devuelve la estructura completa de la canalización editada.

    nota

    El comando update-pipeline detiene la canalización. Si se está ejecutando una revisión en la canalización al ejecutar el comando update-pipeline, dicha ejecución se detiene. Debe iniciar manualmente la canalización para ejecutar dicha revisión en la canalización actualizada. Utilice el comando start-pipeline-execution para iniciar manualmente la canalización.

Migrar los canales de sondeo con una fuente S3 y un seguimiento de CloudTrail (plantilla de CloudFormation)

Utilice estos pasos para editar una canalización con origen en Amazon S3 que usa sondeos para que use la detección de cambios basada en eventos.

Para crear una canalización basada en eventos con Amazon S3, deberá editar el parámetro PollForSourceChanges de la canalización y, a continuación, añadir los siguientes recursos a su plantilla:

  • EventBridge requiere que se registren todos los eventos de Amazon S3. Debe crear un registro de seguimiento de AWS CloudTrail, un bucket y una política de bucket que Amazon S3 pueda usar para registrar los eventos que se produzcan. Para obtener más información, consulte Registro de eventos de datos y Registro de eventos de gestión para registros de seguimiento.

  • Regla de EventBridge y rol de IAM para permitir que este evento inicie nuestra canalización.

Si utiliza CloudFormation para crear y administrar las canalizaciones, la plantilla incluye contenido similar al siguiente.

nota

La propiedad Configuration en la etapa de código fuente denominada PollForSourceChanges. Si la plantilla no incluye esa propiedad, PollForSourceChanges se establece en true de forma predeterminada.

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 crear una regla de EventBridge con Amazon S3 como origen de eventos y CodePipeline como destino y aplicar la política de permisos
  1. En la plantilla, bajo Resources, utilice el recurso AWS::IAM::Role de CloudFormation para configurar el rol de IAM que permitirá que su evento inicie la canalización. Esta entrada crea un rol que utiliza dos políticas:

    • La primera política permite asumir el rol.

    • La segunda política concede permisos para iniciar la canalización.

    Por qué voy a hacer este cambio? La adición del recurso AWS::IAM::Role permite que CloudFormation cree los permisos para EventBridge. Este recurso se añade a su pila de 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 el recurso AWS::Events::Rule de CloudFormation para añadir una regla de EventBridge. Este patrón de eventos crea un evento que monitoriza CopyObject, PutObject y CompleteMultipartUpload en el bucket de origen de Amazon S3. Además, incluya un objetivo de la canalización. Cuando se produce CopyObject, PutObject o CompleteMultipartUpload, esta regla invoca StartPipelineExecution en la canalización de destino.

    Por qué voy a hacer este cambio? Al añadir el recurso AWS::Events::Rule, CloudFormation puede crear el evento. Este recurso se añade a su pila de 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. Añada este fragmento a su primera plantilla para permitir la funcionalidad de pila 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. (Opcional) Para configurar un transformador de entrada con anulaciones de origen para un ID de imagen específico, utilice el siguiente fragmento de código YAML. En el siguiente ejemplo, se configura una anulación donde:

    • actionName (Source en este ejemplo) es el valor dinámico, que se define en la creación de la canalización, no se deriva del evento de origen.

    • revisionType (S3_OBJECT_VERSION_ID en este ejemplo) es el valor dinámico, que se define en la creación de la canalización, no se deriva del evento de origen.

    • revisionValue (<revisionValue> en este ejemplo) se deriva de la variable del evento de origen.

    --- Rule: my-rule Targets: - Id: MyTargetId Arn: pipeline-ARN InputTransformer: InputPathsMap: revisionValue: "$.detail.object.version-id" InputTemplate: sourceRevisions: actionName: Source revisionType: S3_OBJECT_VERSION_ID revisionValue: '<revisionValue>'
  5. Guarde la plantilla actualizada en el equipo local y abra la consola de CloudFormation.

  6. Seleccione la pila y luego elija Create Change Set for Current Stack (Crear conjuntos de cambios para la pila actual).

  7. Cargue su plantilla actualizada y, a continuación, consulte los cambios indicados en CloudFormation. Estos son los cambios que se realizarán en la pila. Debería ver los nuevos recursos en la lista.

  8. Elija Ejecutar.

Para editar el parámetro PollForSourceChanges de la canalización
importante

Al crear una canalización con este método, el parámetro PollForSourceChanges se establece en true de forma predeterminada si no se establece explícitamente en false. Al añadir la detección de cambios basada en eventos, debe añadir el parámetro a la salida y establecerlo en false para deshabilitar el sondeo. De lo contrario, la canalización comienza dos veces para un único cambio en el código fuente. Para obtener más información, consulte Configuración válida para el parámetro PollForSourceChanges.

  • En la plantilla, cambie PollForSourceChanges por false. Si no ha incluido PollForSourceChanges en la definición de la canalización, añádalo y establézcalo en false.

    Por qué voy a hacer este cambio? Al cambiar PollForSourceChanges a false, se desactivan las comprobaciones periódicas, por lo que únicamente puede utilizar la detección de cambios basada en 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 }
Para crear una segunda plantilla para los recursos de CloudTrail de la canalización de Amazon S3
  • En una plantilla independiente, bajo Resources, utilice los recursos AWS::S3::Bucket, AWS::S3::BucketPolicy y AWS::CloudTrail::Trail CloudFormation para proporcionar una definición de bucket simple y un registro de seguimiento para CloudTrail.

    Por qué voy a hacer este cambio? Dado el límite actual de cinco registros de seguimiento por cuenta, el registro de seguimiento de CloudTrail se debe crear y administrar por separado. (Consulte Límites en AWS CloudTrail.) Sin embargo, puede incluir muchos buckets de Amazon S3 en un único registro de seguimiento, por lo que puede crear el registro de seguimiento una vez y, a continuación, añadir buckets de Amazon S3 para otras canalizaciones según sea necesario. Pegue lo siguiente en el segundo archivo de plantilla de ejemplo.

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

Al utilizar CloudFormation para crear estos recursos, la canalización se activa cuando crea o actualiza archivos en el repositorio.

nota

No se detenga aquí. Aunque la canalización se crea, debe crear una segunda plantilla de CloudFormation para la canalización de Amazon S3. Si no crea la segunda plantilla, la canalización no tendrá ninguna funcionalidad de detección de cambios.

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" } } } } ...

Migración de canalizaciones de sondeo para una acción de origen de GitHub (mediante la aplicación OAuth) a conexiones

Puede migrar una acción de origen de GitHub (mediante la aplicación OAuth) para usar conexiones para su repositorio externo. Este es el método de detección de cambios recomendado para las canalizaciones con una acción de origen de GitHub (mediante la aplicación OAuth).

Para una canalización con una acción de origen de GitHub (mediante la aplicación OAuth), recomendamos modificar la canalización para usar una acción de GitHub (mediante la aplicación de GitHub), de modo que la detección de cambios se automatice mediante AWS CodeConnections. Para obtener más información sobre cómo trabajar con conexiones, consulte Conexiones de GitHub.

Creación de una conexión a GitHub (consola)

Puede utilizar la consola para crear una conexión a GitHub.

Paso 1: reemplazo de la acción de GitHub (mediante la aplicación OAuth)

Use la página de edición de canalización para reemplazar su acción de GitHub (mediante la aplicación OAuth) por una acción de GitHub (mediante la aplicación de GitHub).

Cómo reemplazar la acción de GitHub (mediante la aplicación OAuth)
  1. Inicie sesión en la consola de CodePipeline.

  2. Seleccione su canalización y, a continuación, elija Editar. Elija Editar etapa en la etapa de fuente. Aparece un mensaje en el que se recomienda actualizar la acción.

  3. En Proveedor de la acción, elija GitHub (mediante la aplicación de GitHub).

  4. Realice una de las siguientes acciones:

    • En Conexión, si aún no ha creado una conexión con su proveedor, seleccione Conectar a GitHub. Continúe con el Paso 2: Crear una conexión a GitHub.

    • En Conexión, si ya ha creado una conexión con su proveedor, seleccione la conexión. Continúe con el Paso 3: Guardar la acción de origen para la conexión.

Paso 2: Crear una conexión a GitHub

Después de elegir crear la conexión, se muestra la página Conectar a GitHub.

Para crear una conexión a GitHub
  1. En Configuración de conexión de GitHub, el nombre de su conexión se muestra en Nombre de la conexión.

    En Aplicaciones de GitHub, elija la instalación de una aplicación o elija Instalar una aplicación nueva para crear una.

    nota

    Se instala una aplicación para todas las conexiones a un proveedor en particular. Si ya instaló la aplicación GitHub, elija la aplicación y omita este paso.

  2. Si se muestra la página de autorización para GitHub, inicie sesión con sus credenciales y luego elija continuar.

  3. En la página de instalación de la aplicación, aparece un mensaje que indica que la aplicación de AWS CodeStar está intentando conectarse a su cuenta de GitHub.

    nota

    Solo instale la aplicación una vez para cada cuenta de GitHub. Si instaló la aplicación previamente, puede elegir Configure (Configurar) para dirigirse a una página de modificación para la instalación de la aplicación o puede utilizar el botón Atrás para volver a la consola.

  4. En la página Instalar AWS CodeStar, seleccione Instalar.

  5. En la página Conectarse a GitHub, aparece el ID de conexión para la instalación nueva . Elija Conectar.

Paso 3: Guardar la acción de origen de GitHub

Complete las actualizaciones en la página Editar acción para guardar la nueva acción fuente.

Para guardar la acción de origen de GitHub
  1. En Repositorio, introduzca el nombre del repositorio de terceros. En Ramificación, introduzca la ramificación en la que desea que la canalización detecte los cambios de origen.

    nota

    En Repositorio, escriba owner-name/repository-name como se muestra en este ejemplo:

    my-account/my-repository
  2. En Formato del artefacto de salida, debe elegir el formato de los artefactos.

  3. En Artefactos de salida, puede conservar el nombre del artefacto de salida para esta acción, por ejemplo SourceArtifact. Seleccione Listo para cerrar la página Editar acción.

  4. Seleccione Listo para cerrar la página de edición de etapa. Seleccione Guardar para cerrar la página de edición de la canalización.

Creación de una conexión a GitHub (CLI)

Puede utilizar la AWS Command Line Interface (AWS CLI) para crear una conexión a GitHub.

Para ello, utilice el comando create-connection.

importante

De forma predeterminada, las conexiones que se crean a través de AWS CLI o AWS CloudFormation tienen el estado PENDING. Después de crear una conexión con la CLI o CloudFormation, utilice la consola para modificar la conexión y establecer su estado en AVAILABLE.

Para crear una conexión a GitHub
  1. Abra un terminal (Linux, macOS o Unix) o un símbolo del sistema (Windows). Utilice AWS CLI para ejecutar el comando create-connection y especifique los valores de --provider-type y --connection-name de la conexión. En este ejemplo, el nombre del proveedor de terceros es GitHub y el nombre especificado para la conexión es MyConnection.

    aws codeconnections create-connection --provider-type GitHub --connection-name MyConnection

    Si se ejecuta correctamente, este comando devuelve la información del ARN de la conexión, que será similar a lo siguiente.

    { "ConnectionArn": "arn:aws:codeconnections:us-west-2:account_id:connection/aEXAMPLE-8aad-4d5d-8878-dfcab0bc441f" }
  2. Utilice la consola para completar la conexión.

Migración de canalizaciones de sondeo para una acción de origen de GitHub (mediante la aplicación OAuth) a webhooks

Puede migrar su canalización para usar webhooks para detectar cambios en el repositorio de origen de GitHub. Esta migración a webhooks es solo para la acción de GitHub (mediante la aplicación OAuth).

importante

Al crear webhooks de CodePipeline, no utilice sus propias credenciales ni reutilice el mismo token secreto en varios webhooks. Para garantizar una seguridad óptima, genere un token secreto único para cada webhook que vaya a crear. El token secreto es una cadena arbitraria que el propio usuario proporciona y que GitHub utiliza para calcular y firmar las cargas útiles de webhook enviadas a CodePipeline, con el fin de proteger la integridad y autenticidad de las cargas útiles de webhook. Usar sus propias credenciales o reutilizar el mismo token en varios webhooks puede provocar vulnerabilidades de seguridad.

Migración de canalizaciones de sondeo a webhooks (acciones de origen de GitHub (mediante la aplicación OAuth)) (consola)

Para la acción de origen de GitHub (mediante la aplicación OAuth), puede utilizar la consola de CodePipeline para actualizar su canalización con el fin de utilizar webhooks para detectar cambios en el repositorio de origen de GitHub.

Siga estos pasos para editar una canalización que utiliza sondeos (comprobaciones periódicas) para utilizar un evento de EventBridge en su lugar. Si desea crear una canalización, consulte Creación de una canalización, etapas y acciones.

Al utilizar la consola, el parámetro PollForSourceChanges de la canalización se cambia automáticamente. El webhook de GitHub se crea y se registra automáticamente.

Para editar la etapa de código fuente de la canalización
  1. Inicie sesión en la Consola de administración de AWS y abra la consola de CodePipeline en http://console.aws.amazon.com/codesuite/codepipeline/home.

    Se muestran los nombres de todas las canalizaciones asociadas con su cuenta de AWS.

  2. En Nombre, elija el nombre de la canalización que desea editar. Esto abre una vista detallada de la canalización, que incluye el estado de cada una de las acciones en cada etapa de la canalización.

  3. En la página de detalles de la canalización, elija Edit.

  4. En la etapa Edit (Editar), elija el icono de edición en la acción de código fuente.

  5. Expanda Change Detection Options (Cambiar opciones de detección) y elija Use Amazon CloudWatch Events to automatically start my pipeline when a change occurs (recommended) (Usar Amazon CloudWatch Events para iniciar automáticamente mi canalización cuando se produzca un cambio (recomendado)).

    Aparece un mensaje que indica que CodePipeline crea un webhook en GitHub para detectar cambios en el origen: AWS CodePipeline creará un webhook para usted. Puede renunciar en las siguientes opciones. Elija Actualizar. Además del webhook, CodePipeline crea lo siguiente:

    • Se genera un secreto de forma aleatoria y se utiliza para autorizar la conexión a GitHub.

    • La URL de webhook se genera utilizando el punto de enlace público correspondiente a la región.

    CodePipeline registra el webhook con GitHub. De este modo se suscribe la URL para recibir eventos del repositorio.

  6. Cuando haya terminado de editar la canalización, elija Save pipeline changes para volver a la página de resumen.

    Aparece un mensaje que muestra el nombre del webhook que se creará para la canalización. Elija Guardar y continuar.

  7. Para probar la acción, publique un cambio utilizando la AWS CLI para confirmar un cambio en el código fuente especificado en la etapa de código fuente de la canalización.

Migración de canalizaciones de sondeo a webhooks (acciones de origen de GitHub (mediante la aplicación OAuth)) (CLI)

Siga estos pasos para editar una canalización que utiliza comprobaciones periódicas para utilizar un webhook en su lugar. Si desea crear una canalización, consulte Creación de una canalización, etapas y acciones.

Para crear una canalización basada en eventos, debe editar el parámetro PollForSourceChanges de la canalización y, a continuación, crear los siguientes recursos manualmente:

  • Webhook de GitHub y parámetros de autorización

Para crear y registrar su webhook
nota

Cuando utilice la CLI o CloudFormation para crear una canalización y añadir un webhook, debe deshabilitar las comprobaciones periódicas. Para deshabilitar las comprobaciones periódicas, debe añadir de forma explícita el parámetro PollForSourceChanges y establecerlo en false, tal y como se detalla en el último procedimiento que viene a continuación. De lo contrario, el comportamiento predeterminado para una canalización de la CLI o de CloudFormation es que el parámetro PollForSourceChanges se establece en true de forma predeterminada y no se muestra en la salida de la estructura de la canalización. Para obtener más información sobre los valores predeterminados de PollForSourceChanges, consulte Configuración válida para el parámetro PollForSourceChanges.

  1. En un editor de texto, cree y guarde un archivo JSON para el webhook que desea crear. Utilice este archivo de ejemplo para un 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. Llame al comando put-webhook e incluya los parámetros --cli-input y --region.

    El comando de muestra siguiente crea un webhook con el archivo JSON webhook_json.

    aws codepipeline put-webhook --cli-input-json file://webhook_json.json --region "eu-central-1"
  3. En la salida que se muestra en este ejemplo, se devuelven la URL y el ARN de un 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" }] }

    En este ejemplo, se etiqueta el webhook con la clave Project y el valor ProjectA. Para obtener más información acerca del etiquetado de recursos de CodePipeline, consulte Etiquetado de recursos.

  4. Use el comando register-webhook-with-third-party e incluya el parámetro --webhook-name.

    El comando de muestra siguiente registra un webhook denominado my-webhook.

    aws codepipeline register-webhook-with-third-party --webhook-name my-webhook
Para editar el parámetro PollForSourceChanges de la canalización
importante

Al crear una canalización con este método, el parámetro PollForSourceChanges se establece en true de forma predeterminada si no se establece explícitamente en false. Al añadir la detección de cambios basada en eventos, debe añadir el parámetro a la salida y establecerlo en false para deshabilitar el sondeo. De lo contrario, la canalización comienza dos veces para un único cambio en el código fuente. Para obtener más información, consulte Configuración válida para el parámetro PollForSourceChanges.

  1. Ejecute el comando get-pipeline para copiar la estructura de canalización en un archivo JSON. Por ejemplo, para una canalización denominada MyFirstPipeline, debería escribir el siguiente comando:

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

    Este comando no devuelve nada, pero el archivo creado debería aparecer en el directorio en el que se ejecutó el comando.

  2. Abra el archivo JSON en cualquier editor de texto sin formato y edite la etapa de código fuente cambiando o añadiendo el parámetro PollForSourceChanges. En este ejemplo, para un repositorio llamado UserGitHubRepo, el parámetro está establecido en false.

    Por qué voy a hacer este cambio? Al cambiar este parámetro, se desactivan las comprobaciones periódicas, por lo que únicamente puede utilizar la detección de cambios basada en eventos.

    "configuration": { "Owner": "name", "Repo": "UserGitHubRepo", "PollForSourceChanges": "false", "Branch": "main", "OAuthToken": "****" },
  3. Si está trabajando con la estructura de canalizaciones recuperada mediante el comando get-pipeline, debe editar la estructura en el archivo JSON quitando las líneas metadata del archivo. De lo contrario, el comando update-pipeline no puede utilizarlo. Quite la sección "metadata" de la estructura de canalizaciones del archivo JSON, incluido { } y los campos "created", "pipelineARN" y "updated".

    Por ejemplo, quite las siguientes líneas de la estructura:

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

    Guarde el archivo.

  4. Para aplicar los cambios, ejecute el comando update-pipeline, especificando el archivo JSON de la canalización, de forma similar a como se muestra a continuación:

    importante

    Asegúrese de incluir file:// antes del nombre de archivo. Es obligatorio en este comando.

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

    Este comando devuelve la estructura completa de la canalización editada.

    nota

    El comando update-pipeline detiene la canalización. Si se está ejecutando una revisión en la canalización al ejecutar el comando update-pipeline, dicha ejecución se detiene. Debe iniciar manualmente la canalización para ejecutar dicha revisión en la canalización actualizada. Utilice el comando start-pipeline-execution para iniciar manualmente la canalización.

Actualización de canalizaciones para eventos de inserción (acciones de origen de GitHub (mediante la aplicación OAuth)) (plantilla de CloudFormation)

Siga estos pasos para actualizar una canalización (con código fuente en GitHub) que realiza comprobaciones periódicas (sondeos) para que realice la detección de cambios basada en eventos utilizando webhooks.

Para crear una canalización basada en eventos con AWS CodeCommit, deberá editar el parámetro PollForSourceChanges de la canalización y, a continuación, añadir un recurso de webhook de GitHub a su plantilla:

Si utiliza CloudFormation para crear y administrar las canalizaciones, la plantilla tendrá contenido similar al siguiente.

nota

Tenga en cuenta la propiedad de configuración PollForSourceChanges de la etapa de código fuente. Si la plantilla no incluye esa propiedad, PollForSourceChanges se establece en true de forma predeterminada.

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 } ] }, ...
Para añadir parámetros y crear un webhook en la plantilla

Se recomienda encarecidamente que utilice AWS Secrets Manager para almacenar sus credenciales. Si utiliza Secrets Manager, debe haber configurado y almacenado sus parámetros secretos en Secrets Manager. En este ejemplo se utilizan referencias dinámicas a Secrets Manager para las credenciales de GitHub de su webhook. Para obtener más información, consulte Uso de referencias dinámicas para especificar valores de plantillas.

importante

Al pasar parámetros del secreto, no introduzca el valor directamente en la plantilla. El valor se representa como texto no cifrado y, por lo tanto, se puede leer. Por motivos de seguridad, no utilice texto no cifrado en la plantilla de CloudFormation para almacenar sus credenciales.

Cuando utilice la CLI o CloudFormation para crear una canalización y añadir un webhook, debe deshabilitar las comprobaciones periódicas.

nota

Para deshabilitar las comprobaciones periódicas, debe añadir de forma explícita el parámetro PollForSourceChanges y establecerlo en false, tal y como se detalla en el último procedimiento que viene a continuación. De lo contrario, el comportamiento predeterminado para una canalización de la CLI o de CloudFormation es que el parámetro PollForSourceChanges se establece en true de forma predeterminada y no se muestra en la salida de la estructura de la canalización. Para obtener más información sobre los valores predeterminados de PollForSourceChanges, consulte Configuración válida para el parámetro PollForSourceChanges.

  1. En la plantilla, bajo Resources, añada los parámetros:

    YAML
    Parameters: GitHubOwner: Type: String ...
    JSON
    { "Parameters": { "BranchName": { "Description": "GitHub branch name", "Type": "String", "Default": "main" }, "GitHubOwner": { "Type": "String" }, ...
  2. Utilice el recurso AWS::CodePipeline::Webhook de CloudFormation para añadir un webhook.

    nota

    El TargetAction especificado debe coincidir con la propiedad Name de su acción de código fuente definida en la canalización.

    Si RegisterWithThirdParty está establecido en true, asegúrese de que el usuario asociado a OAuthToken puede establecer los ámbitos necesarios en GitHub. El token y el webhook requieren los siguientes ámbitos de GitHub:

    • repo: se utiliza para controlar totalmente la lectura y la extracción de artefactos de los repositorios públicos y privados en una canalización.

    • admin:repo_hook: se utiliza para el control total de los enlaces del repositorio.

    De lo contrario, GitHub devuelve un error 404. Para obtener más información acerca del error 404 devuelto, 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. Guarde la plantilla actualizada en el equipo local y luego abra la consola de CloudFormation.

  4. Seleccione la pila y luego elija Create Change Set for Current Stack (Crear conjuntos de cambios para la pila actual).

  5. Cargue la plantilla y, a continuación, consulte los cambios indicados en CloudFormation. Estos son los cambios que se realizan en la pila. Debería ver los nuevos recursos en la lista.

  6. Elija Ejecutar.

Para editar el parámetro PollForSourceChanges de la canalización
importante

Al crear una canalización con este método, el parámetro PollForSourceChanges se establece en true de forma predeterminada si no se establece explícitamente en false. Al añadir la detección de cambios basada en eventos, debe añadir el parámetro a la salida y establecerlo en false para deshabilitar el sondeo. De lo contrario, la canalización comienza dos veces para un único cambio en el código fuente. Para obtener más información, consulte Configuración válida para el parámetro PollForSourceChanges.

  • En la plantilla, cambie PollForSourceChanges por false. Si no ha incluido PollForSourceChanges en la definición de la canalización, añádalo y establézcalo en false.

    Por qué voy a hacer este cambio? Al cambiar este parámetro a false, se desactivan las comprobaciones periódicas, por lo que únicamente puede utilizar la detección de cambios basada en 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 }]

Al crear estos recursos con CloudFormation, se creará el webhook definido en el repositorio especificado de GitHub. Al confirmar, se activará la canalización.

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