Crear una lógica de aprovisionamiento personalizada con recursos personalizados
Los recursos personalizados le permiten escribir la lógica de aprovisionamiento personalizada en sus plantillas de CloudFormation y hacer que CloudFormation la ejecute cada vez que cree, actualice (si ha cambiado el recurso personalizado) o elimine una pila. Esto puede resultar útil cuando sus requisitos de aprovisionamiento implican una lógica compleja o flujos de trabajo que no se pueden expresar con los tipos de recursos integrados de CloudFormation.
Por ejemplo, es posible que desee incluir recursos que no están disponibles como tipos de recursos de CloudFormation. Puede incluir esos recursos usando recursos personalizados. De esta forma, puede seguir administrando todos los recursos relacionados en una sola pila.
Para definir un recurso personalizado en su plantilla de CloudFormation, se usan los tipos de recurso AWS::CloudFormation::CustomResource
o Custom::
. Los recursos personalizados requieren una propiedad, el token de servicio, que especifica a dónde envía CloudFormation las solicitudes, como un tema de Amazon SNS o una función de Lambda.MyCustomResourceTypeName
En los siguientes temas se proporciona información sobre cómo utilizar recursos personalizados.
Temas
nota
El registro de CloudFormation y los recursos personalizados ofrecen sus propias ventajas. Los recursos personalizados ofrecen las siguientes ventajas:
-
No es necesario registrar el recurso.
-
Puede incluir un recurso completo como parte de una plantilla sin necesidad de registrarse.
-
Son compatibles con las operaciones
Create
,Update
yDelete
.
Entre las ventajas de los recursos basados en el registro se encuentran:
-
Compatibilidad con el modelado, el aprovisionamiento y la administración de recursos de aplicaciones de terceros
-
Compatibilidad con las operaciones
Create
,Read
,Update
,Delete
yList
(CRUDL
) -
Compatibilidad con la detección de desviaciones en tipos de recursos privados y de terceros
A diferencia de los recursos personalizados, los recursos basados en registros no necesitarán asociar un tema de Amazon SNS o una función de Lambda para realizar operaciones CRUDL
. Para obtener más información, consulte Administración de extensiones a través del registro de CloudFormation.
Cómo funcionan los recursos personalizados
El proceso general para configurar un nuevo recurso personalizado incluye los siguientes pasos. Estos pasos implican dos funciones: el proveedor de recursos personalizados, que es el propietario del recurso personalizado, y el desarrollador de plantillas, que crea una plantilla que incluye un tipo de recurso personalizado. Puede ser la misma persona, pero si no lo es, el proveedor de recursos personalizados debe colaborar con el desarrollador de plantillas.
-
El proveedor de recursos personalizados escribe una lógica que determina cómo gestionar las solicitudes de CloudFormation y llevar a cabo acciones en el recurso personalizado.
-
El proveedor de recursos personalizados crea el tema de Amazon SNS o la función de Lambda a la que CloudFormation puede enviar solicitudes. El tema de Amazon SNS o la función de Lambda deben estar en la misma región en la que se creará la pila.
-
El proveedor de recursos personalizados proporciona el ARN del tema de Amazon SNS o el ARN de la función de Lambda al desarrollador de plantillas.
-
El desarrollador de plantillas define el recurso personalizado en su plantilla de CloudFormation. Esto incluye un token de servicio y los parámetros de datos de entrada. El proveedor de recursos personalizados define el token de servicio y la estructura de los datos de entrada. El token de servicio, que siempre es obligatorio, especifica el ARN del tema de Amazon SNS o el ARN de la función de Lambda. Los datos de entrada son opcionales según el recurso personalizado.
Ahora, cada vez que se utiliza la plantilla para crear, actualizar o eliminar el recurso personalizado, CloudFormation envía una solicitud al token de servicio especificado y espera una respuesta antes de proceder con la operación de la pila.
A continuación, se resume el flujo de creación de una pila a partir de la plantilla:
-
CloudFormation envía una solicitud al token de servicio especificado. La solicitud incluye información como el tipo de solicitud y una URL prefirmada de Amazon Simple Storage Service, donde el recurso personalizado envía sus respuestas. Para obtener más información acerca de lo que se incluye en la solicitud, consulte Objetos de solicitudes de recursos personalizados.
A continuación, se presenta un ejemplo de los datos que CloudFormation incluye en una solicitud de
Create
: En este ejemplo,ResourceProperties
permite a CloudFormation crear una carga personalizada que se enviará a la función de Lambda.{ "RequestType" : "Create", "ResponseURL" : "http://pre-signed-S3-url-for-response", "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10", "RequestId" : "unique id for this create request", "ResourceType" : "Custom::TestResource", "LogicalResourceId" : "MyTestResource", "ResourceProperties" : { "Name" : "Value", "List" : [ "1", "2", "3" ] } }
-
El proveedor de recursos personalizados procesa la solicitud de CloudFormation y devuelve una respuesta
SUCCESS
oFAILED
a la URL prefirmada. custom resource provider proporciona la respuesta en un archivo con formato JSON y la carga a la URL de S3 prefirmada. Para obtener más información, consulte Carga de objetos con URL prefirmadas en la Guía para usuarios de Amazon Simple Storage Service.En la respuesta, el custom resource provider también puede incluir pares de nombre-valor a los que el template developer puede obtener acceso. Por ejemplo, la respuesta puede incluir datos de salida si la solicitud ha funcionado o un mensaje de error si ha fallado. Para obtener más información acerca de las respuestas, consulte Objetos de respuesta de recursos personalizados.
importante
Si los pares nombre-valor contienen información confidencial, debe usar el campo
NoEcho
para enmascarar la salida del recurso personalizado. De lo contrario, los valores son visibles a través de las API que muestran valores de propiedades (comoDescribeStackEvents
).Para obtener más información sobre el uso de
NoEcho
para enmascarar información confidencial, consulte la práctica recomendada de No integre credenciales en sus plantillas.custom resource provider es responsable de escuchar y responder a la solicitud. Por ejemplo, en el caso de las notificaciones de Amazon SNS, el proveedor de recursos personalizados debe escuchar las notificaciones que se envían al ARN de un tema específico y responder a ellas. CloudFormation espera y escucha una respuesta en la ubicación de la URL prefirmada.
Los siguientes datos de ejemplo muestran lo que un recurso personalizado podría incluir en una respuesta:
{ "Status" : "SUCCESS", "PhysicalResourceId" : "TestResource1", "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10", "RequestId" : "unique id for this create request", "LogicalResourceId" : "MyTestResource", "Data" : { "OutputName1" : "Value1", "OutputName2" : "Value2", } }
-
Después de obtener una respuesta
SUCCESS
, CloudFormation continúa con la operación de la pila. Si se recibe una respuestaFAILED
o ninguna respuesta, la operación genera un error. Todo dato de salida del recurso personalizado se almacena en la ubicación de la URL prefirmada. El template developer puede recuperar los datos usando la función Fn::GetAtt.
nota
Si utiliza AWS PrivateLink, los recursos personalizados de la VPC deben tener acceso a buckets de S3 específicos de CloudFormation. Los recursos personalizados deben enviar las respuestas a una URL de Amazon S3 prefirmada. Si no pueden enviar respuestas a Amazon S3, CloudFormation no recibirá una respuesta y la operación de pila producirá un error. Para obtener más información, consulte Acceso a CloudFormation mediante un punto de conexión de la interfaz (AWS PrivateLink).
Tiempo de espera de respuesta
El tiempo de espera predeterminado para un recurso personalizado es de 3600 segundos (1 hora). Si no se recibe una respuesta en este tiempo, la operación de la pila se considerará fallida.
Puede ajustar el valor del tiempo de espera en función del tiempo que estime que tomará la respuesta del recurso personalizado. Por ejemplo, al aprovisionar un recurso personalizado que invoca una función de Lambda y se espera que responda en cinco minutos, puede establecer un tiempo de espera de cinco minutos en la plantilla de la pila al especificar la propiedad ServiceTimeout
. Para obtener más información, consulte Objetos de solicitudes de recursos personalizados. De esta forma, si hay un error en la función de Lambda que provoca que se bloquee, CloudFormation no podrá realizar la operación de la pila después de cinco minutos, en lugar de esperar toda una hora.
Sin embargo, procure no establecer un valor de tiempo de espera demasiado bajo. Para evitar tiempos de espera inesperados, asegúrese de que su recurso personalizado disponga de tiempo suficiente para completar las acciones necesarias y devolver una respuesta.