es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Acceder a la plantilla de CloudFormation en S3 desde Lambda.

Quiero usar cfn_client.update_stack() en mi función lambda. Para esto, necesito acceder a una plantilla de CF en mi bucket de S3. El rol de IAM adjunto a la lambda es correcto.
Intenté:

TemplateURL='s3://xxx/yyy/temp.yaml', 

Pero no estaba funcionando. La plantilla es privada, ¿asumo que no puedo usar la url con Https://?
¿Cómo puedo acceder a la plantilla o estoy obligado a descargarla desde el bucket dentro de /tmp de mi lambda y ejecutarla con template-body?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para acceder a una plantilla de CF en tu bucket de S3, necesitas proporcionar la URL del objeto de S3 con el esquema https: en lugar de s3:. Puedes generar una URL prefirmada utilizando el aws-sdk en tu función Lambda para proporcionar acceso temporal al objeto.

    Aquí tienes un ejemplo de código que puedes utilizar para generar una URL prefirmada:

    import boto3
    
    s3_client = boto3.client('s3')
    
    def get_presigned_url(bucket, key):
        url = s3_client.generate_presigned_url(
            ClientMethod='get_object',
            Params={
                'Bucket': bucket,
                'Key': key
            }
        )
    
        return url
    

    Luego puedes utilizar esta URL prefirmada para actualizar tu stack de CloudFormation:

    import boto3
    
    cfn_client = boto3.client('cloudformation')
    
    def update_stack(stack_name, template_url):
        response = cfn_client.update_stack(
            StackName=stack_name,
            TemplateURL=template_url,
            ...
        )
    
        return response
    

    Alternativamente, si no deseas utilizar una URL prefirmada, puedes descargar la plantilla desde el bucket de S3 al directorio /tmp de tu función Lambda y utilizar el parámetro template_body en lugar del parámetro template_url:

    import boto3
    import os
    
    s3_client = boto3.client('s3')
    
    def download_template(bucket, key):
        local_path = '/tmp/template.yaml'
        s3_client.download_file(bucket, key, local_path)
        return local_path
    
    def update_stack(stack_name, template_path):
        with open(template_path, 'r') as f:
            template_body = f.read()
    
        response = cfn_client.update_stack(
            StackName=stack_name,
            TemplateBody=template_body,
            ...
        )
    
        return response
    

    Nota que debes asegurarte de que tu rol IAM tenga los permisos apropiados para acceder al bucket de S3 y actualizar el stack de CloudFormation.

Comments are closed.