Saltar al contenido

¿Cómo elimino un recurso personalizado basado en Lambda que está bloqueado en el estado DELETE_FAILED o DELETE_IN_PROGRESS en CloudFormation y no avanza?

5 minutos de lectura
0

Mi recurso personalizado basado en AWS Lambda está bloqueado en el estado DELETE_FAILED o DELETE_IN_PROGRESS en AWS CloudFormation y no avanza. Quiero eliminar mi recurso personalizado.

Resolución

Elige una de las siguientes soluciones según el estado de tu recurso.

Eliminar un recurso personalizado que está bloqueado en el estado DELETE_FAILED y no avanza

Aparece un mensaje de error si intentas eliminar una pila con un recurso personalizado basado en Lambda que carece de la lógica necesaria para gestionar las solicitudes de eliminación. También puedes ver el siguiente mensaje de error si el recurso personalizado contiene una lógica de eliminación incorrecta: "CloudFormation did not receive a response from your Custom Resource. Please check your logs for requestId [652961ca-f24e-42e0-8f74-3f4846ba282d]. If you use the Python cfn-response module, you might need to update your Lambda function code so that CloudFormation can attach the updated version."

El estado de la pila cambia a DELETE_FAILED y, a continuación, aparece el siguiente mensaje de error: "Custom Resource failed to stabilize in expected time."

Para eliminar la pila, sigue estos pasos:

  1. Abre la consola de CloudFormation.
  2. Selecciona la pila que contiene el recurso personalizado que está bloqueado en estado DELETE_FAILED y no avanza.
  3. Selecciona Acciones y, a continuación, Eliminar pila.
  4. En la ventana emergente que proporciona una lista de recursos para conservar, selecciona el recurso personal bloqueado en el estado DELETE_FAILED. A continuación, selecciona Eliminar.
  5. Selecciona Acciones y, a continuación, Eliminar pila.

El estado de la pila cambia a DELETE_COMPLETE.

Nota: Tu recurso personalizado no es un recurso físico, por lo que no tendrás que limpiar tu recurso personalizado tras la eliminación de la pila.

Eliminación de un recurso personalizado que está bloqueado en el estado DELETE_IN_PROGRESS

Cuando la pila elimina un recurso personalizado, se bloquea en el estado DELETE_IN_PROGRESS y no avanza, es posible que la pila no tenga la lógica necesaria para administrar las solicitudes de eliminación. O bien, tu pila podría incluir una lógica de eliminación incorrecta.

Para forzar la eliminación de la pila, debes enviar manualmente una señal SUCCESS. La señal requiere los valores ResponseURL y RequestId que están incluidos en el evento que se envía desde CloudFormation a Lambda.

  1. En tu plantilla de CloudFormation, identifica el nombre de la función de Lambda a la que tu recurso personalizado está enviando solicitudes. Puedes encontrar el nombre de la función en la propiedad ServiceToken del recurso AWS::CloudFormation::CustomResource o del recurso Custom::String.

    Por ejemplo:

    MyCustomResource:
      Type: "Custom::PingTester"
      Properties:
        ServiceToken:
          !Sub |
            arn:aws:lambda:us-east-1:111122223333:function:awsexamplelambdafunction
  2. Abre la consola de Lambda.

  3. En el panel de navegación, selecciona Funciones y, a continuación, elige la función que has identificado en el paso 1. Por ejemplo, awsexamplelambdafunction es el nombre de la función en el código de ejemplo anterior.

  4. Comprueba que la función de Lambda registre los detalles del evento en el grupo de registro de Amazon CloudWatch denominado /aws/lambda/function_name.
    Ejemplo de lógica:

    exports.handler = function(event, context) {    console.log("REQUEST RECEIVED:\n" + JSON.stringify(event));
    ...
    }

    Nota: Si tu función de Lambda no incluye la lógica para imprimir el evento en los registros de CloudWatch, no podrás obtener los valores ResponseURL y RequestId. Debes tener esos valores para enviar una señal manual. Espera aproximadamente una hora para que la pila de CloudFormation agote el tiempo de espera y pase al estado DELETE_FAILED. A continuación, completa los pasos de la sección Eliminar un recurso personalizado que está detenido en estado DELETE_FAILED y no avanza para eliminar tu pila.

  5. Elige la pestaña Supervisión y, a continuación, selecciona Ver registros en CloudWatch.

  6. En la consola de Amazon CloudWatch, selecciona el registro más reciente.

    Nota: Puedes ver los registros de CloudWatch únicamente si tu función tiene acceso a los Registros de Amazon CloudWatch para la secuencia de registro.

  7. En el registro más reciente, identifica el evento en el que el valor RequestType está configurado como Delete, y luego copia los valores de RequestId, ResponseURL, StackId, LogicalResourceId y PhysicalResourceId. Por ejemplo:

    Received event: {
      "RequestType": "Delete",
      "ServiceToken": "arn:aws:lambda:us-east-1:111122223333:function:awsexamplelambdafunction",
      "ResponseURL": "https://cloudformation-custom-resource-response-useast1.s3.us-east-1.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A111122223333%3Astack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2%7CMyCustomResource%7Ce2fc8f5c-0391-4a65-a645-7c695646739?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20170313T0212304Z&X-Amz-SignedHeaders=host&X-Amz-Expires=7200&X-Amz-Credential=QWERTYUIOLASDFGBHNZCV%2F20190415%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=dgvg36bh23mk44nj454bjb54689bg43r8v011uerehiubrjrug5689ghg94hb",
      "StackId": "arn:aws:cloudformation:us-east-1:111122223333:stack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2",
      "RequestId": "e2fc8f5c-0391-4a65-a645-7c695646739",
      "LogicalResourceId": "MyCustomResource",
      "PhysicalResourceId": "test-MyCustomResource-1URTEVUHSKSKDFF",
      "ResourceType": "Custom::PingTester"
  8. Para enviar una señal de respuesta SUCCESS en el objeto de respuesta a la solicitud de eliminación, ejecuta el siguiente comando en tu interfaz de línea de comandos local. Asegúrate de incluir los valores que copiaste del paso 7.

    curl -H "Content-Type: ''" -X PUT -d "{\"Status\": \"SUCCESS\",\"PhysicalResourceId\": \"test-CloudWatchtrigger-1URTEVUHSKSKDFF\",\"StackId\": \"arn:aws:cloudformation:us-west-2:111122223333:stack/CRStack/5105e4b0-4a29-11ef-8c42-067744df1edb\",\"RequestId\": \"dca731ad-18ad-496c-8c77-459d904fd36b\",\"LogicalResourceId\": \"MyCustomResource\"}" "https://cloudformation-custom-resource-response-uswest2.s3-us-west-2.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-west-2%3A111122223333%3Astack/CRStack/5105e4b0-4a29-11ef-8c42-067744df1edb%7CCustomResource%7Cdca731ad-18ad-496c-8c77-459d904fd36b?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20240725T020141Z&X-Amz-SignedHeaders=host&X-Amz-Expires=7200&X-Amz-Credential=AKIA54RCMT6SJPHCTM4H%2F20240725%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Signature=3b1567adb5ec9415526251a26bac3a6c861ac77aa090a3ada0a4a4d109a7273d"

El estado de tus recursos personalizados cambia a DELETE_COMPLETE en los eventos de la pila de CloudFormation.

Información relacionada

Creación de una lógica de aprovisionamiento personalizada con recursos personalizados

AWS::CloudFormation::CustomResource

¿Cuáles son algunas de las prácticas recomendadas para implementar recursos personalizados basados en AWS Lambda con AWS CloudFormation?