Cómo importar variable en el archivo Swagger para AWS ApiGateway

Quiero utilizar APIGateway para mi aplicación RESTful por archivo OpenApi pero ¿Cómo puedo inyectar mis variables desde fuera del archivo swagger en él

Swagger.yml

openapi: "3.0.1"
info:
    title: !Join ['-', ['XXXX', !Ref ServiceName]]
paths:
    /:
        get:
            responses:
                default:
                    description: "Default response for GET /"
            x-amazon-apigateway-integration:
                payloadFormatVersion: "1.0"
                connectionId: !Ref VPCLink
                type: "http_proxy"
                httpMethod: "ANY"
                uri: !GetAtt ServiceDiscovery.Arn
                connectionType: "VPC_LINK"
    /health:
        get:
            responses:
                default:
                    description: "Default response for GET /health"
            x-amazon-apigateway-integration:
                payloadFormatVersion: "1.0"
                connectionId: !Ref VPCLink
                type: "http_proxy"
                httpMethod: "ANY"
                uri: !GetAtt ServiceDiscovery.Arn
                connectionType: "VPC_LINK"
x-amazon-apigateway-cors:
    allowOrigins:
        - '*'
    allowHeaders:
        - '*'
    allowMethods:
        - 'GET'
x-amazon-apigateway-importexport-version: "1.0"  

Plantilla de Cloudformation :

    HttpApi:
        Type: AWS::ApiGatewayV2::Api
        Properties:
            Body:
                Fn::Transform:
                    Name: AWS::Include
                    Parameters:
                        Location: "s3://XXXX/Swagger.yml"

Pero... Ha seguido el error en la cloudformation :
"Transform AWS::Include failed with: The specified S3 object's content should be valid Yaml/JSON"

Y cuando quito funciones integradas como Join y GetAtt de mi swagger. Yml funciona.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por binarybuilder


2 Respuestas:

  • El problema que estás experimentando se debe a que estás utilizando funciones intrínsecas de AWS CloudFormation dentro de tu archivo Swagger (YAML) y cuando intentas importarlo a través de la transformación AWS::Include, no es capaz de interpretar esas funciones.

    Para poder resolver este problema, te recomiendo seguir estos pasos:

    • Separar la lógica de las funciones intrínsecas de AWS CloudFormation de tu archivo Swagger. Puedes utilizar variables en su lugar y después inyectar los valores de esas variables en tu Swagger.yml durante la implementación.
    • Crear un archivo separado (por ejemplo, variables.yml) donde definirás tus variables:
    yaml
    ServiceName: XXXX
    VPCLink: 
    ServiceDiscoveryArn: 
    
    • Modificar tu archivo Swagger.yml para usar las variables definidas en el paso anterior:
    yaml
    openapi: "3.0.1"
    info:
        title: !Join ['-', ['XXXX', ${ServiceName}]
    paths:
        /:
            get:
                responses:
                    default:
                        description: "Default response for GET /"
                x-amazon-apigateway-integration:
                    payloadFormatVersion: "1.0"
                    connectionId: ${VPCLink}
                    type: "http_proxy"
                    httpMethod: "ANY"
                    uri: ${ServiceDiscoveryArn}
                    connectionType: "VPC_LINK"
        /health:
            get:
                responses:
                    default:
                        description: "Default response for GET /health"
                x-amazon-apigateway-integration:
                    payloadFormatVersion: "1.0"
                    connectionId: ${VPCLink}
                    type: "http_proxy"
                    httpMethod: "ANY"
                    uri: ${ServiceDiscoveryArn}
                    connectionType: "VPC_LINK"
    x-amazon-apigateway-cors:
        allowOrigins:
               
    • ''
    allowHeaders:
    • ''
    allowMethods:
    • 'GET'
    x-amazon-apigateway-importexport-version: "1.0"
    • Modificar tu plantilla de CloudFormation para incluir el archivo de variables y utilizarlo como entradas en la transformación AWS::Include:
    yaml
    HttpApi:
        Type: AWS::ApiGatewayV2::Api
        Properties:
            Body:
                Fn::Transform:
                    Name: AWS::Include
                    Parameters:
                        Location: "s3://XXXX/variables.yml"
    

    Al seguir estos pasos, deberías poder separar la lógica de las funciones intrínsecas de AWS CloudFormation de tu archivo Swagger y poder importar tus variables externas de manera exitosa. ¡Espero que esta solución te sea útil! Si tienes alguna otra pregunta, no dudes en decirme.

    Respondida el Dec 18, 2020 a las 11:08 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Estás intentando importar un archivo YAML que contiene funciones intrínsecas de AWS CloudFormation (!Join y !GetAtt) en tu archivo Swagger para AWS API Gateway. Sin embargo, API Gateway no reconoce estas funciones.

    Para resolver este problema, debes utilizar el parámetro StageVariables en la definición de tu API Gateway para inyectar valores externos en tu archivo Swagger. Aquí tienes cómo hacerlo:

    1. Define las variables de etapa en tu plantilla de CloudFormation:

    yaml
        

    ... (el resto de tu plantilla)

    StageVariables: ServiceName: 'my-service-name' VPCLink: 'my-vpc-link'

    2. Utiliza las variables de etapa en tu archivo Swagger:

    yaml
    openapi: "3.0.1"
    info:
        title: ${stageVariables.ServiceName}
    paths:
        /:
            get:
                responses:
                    default:
                        description: "Default response for GET /"
                x-amazon-apigateway-integration:
                    payloadFormatVersion: "1.0"
                    connectionId: ${stageVariables.VPCLink}
                    type: "http_proxy"
                    httpMethod: "ANY"
                    uri: !GetAtt ServiceDiscovery.Arn
                    connectionType: "VPC_LINK"
        /health:
            get:
                responses:
                    default:
                        description: "Default response for GET /health"
                x-amazon-apigateway-integration:
                    payloadFormatVersion: "1.0"
                    connectionId: ${stageVariables.VPCLink}
                    type: "http_proxy"
                    httpMethod: "ANY"
                    uri: !GetAtt ServiceDiscovery.Arn
                    connectionType: "VPC_LINK"
    x-amazon-apigateway-cors:
        allowOrigins:
               
    • ''
    allowHeaders:
    • ''
    allowMethods:
    • 'GET'
    x-amazon-apigateway-importexport-version: "1.0"

    Cuando despliegues tu API Gateway, las variables de etapa especificadas en la plantilla de CloudFormation se inyectarán en tu archivo Swagger.

    Nota:

    Asegúrate de que el archivo Swagger se almacena en un bucket de S3 público o con la configuración de CORS adecuada para permitir el acceso desde API Gateway. También debes asegurarte de que las variables de etapa definidas en la plantilla de CloudFormation coincidan con los nombres utilizados en el archivo Swagger.

    Respondida el Dec 18, 2020 a las 11:12 - por Gemini

    Votos positivos: 0 | Votos negativos: 0