Cómo establecer una variable de entorno en Amazon EC2

He creado una etiqueta en la consola de AWS para uno de mis instancias de EC2.

Cómo establecer una variable de entorno en Amazon EC2

Sin embargo, cuando me miro en el servidor, no la variable de entorno conjunto.

Lo mismo funciona con elastic beanstalk. env muestra las etiquetas que he creado en la consola.

$ env
 [...]
 DB_PORT=5432

Cómo puedo configurar las variables de entorno en Amazon EC2?

InformationsquelleAutor PJ Bergeron | 2015-02-21

5 Kommentare

  1. 28

    Usted puede obtener esta información a partir de la meta de datos y, a continuación, ejecutar su propio entorno de conjunto de comandos.

    Usted puede obtener la instancia de identificación de la meta de datos (ver aquí para más detalles: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#instancedata-data-retrieval)

    curl http://169.254.169.254/latest/meta-data/instance-id
    

    A continuación, puede llamar al describir-etiquetas con la pre-instalada de la CLI de AWS (o instalarlo en tu AMI)

    aws ec2 describe-tags --filters "Name=resource-id,Values=i-5f4e3d2a" "Name=Value,Values=DB_PORT"
    

    A continuación, puede utilizar OS establezca la variable de entorno comando

    export DB_PORT=/what/you/got/from/the/previous/call
    

    Puede ejecutar todos los que en sus datos de usuario de la secuencia de comandos. Ver aquí para más detalles: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html

    • Recomiendo el uso de una función de IAM para la instancia – esto le permitirá hacer la llamada a la API sin especificar las credenciales. Esta respuesta Chico dio es exactamente lo que su uso en la producción.
    • Gracias por sus respuestas. He creado una función de IAM permitiendo ec2:DescribeTags pero cuando voy a ejecutar aws ec2 describe-tags puedo obtener A client error (UnauthorizedOperation) occurred when calling the DescribeTags operation: You are not authorized to perform this operation. Lo que me estoy perdiendo?
    • Ok, tuve que hacer rm -rf .aws y aws configure (sin introducir ninguna clave de API) con el fin de tener aws lectura de las nuevas credenciales de la instancia de metadatos.
    • Usted necesita para crear un rol para la instancia de ec2 para permitir hacer las llamadas: docs.aws.amazon.com/AWSEC2/latest/UserGuide/…
    • parece que limitar el número de etiquetas a ser 10. The maximum number of Tags for a resource has been reached. Preguntaba si hay alguna solución a eso?
    • utilizar sólo una etiqueta de datos, y codificar su contenido en json o similar.

  2. 6

    He utilizado una combinación de las siguientes herramientas:

    • Instalar jq biblioteca (sudo apt-get install -y jq)
    • Instalar la Instancia de EC2 Metadatos Herramienta de Consulta

    Aquí está el quid de la cuestión el código de abajo en caso de que la actualización en el futuro: https://gist.github.com/marcellodesales/a890b8ca240403187269

    ######
    # Author: Marcello de Sales ([email protected])
    # Description: Create Create Environment Variables in EC2 Hosts from EC2 Host Tags
    # 
    ### Requirements:  
    # * Install jq library (sudo apt-get install -y jq)
    # * Install the EC2 Instance Metadata Query Tool (http://aws.amazon.com/code/1825)
    #
    ### Installation:
    # * Add the Policy EC2:DescribeTags to a User
    # * aws configure
    # * Souce it to the user's ~/.profile that has permissions
    #### 
    # REboot and verify the result of $(env).
    
    # Loads the Tags from the current instance
    getInstanceTags () {
      # http://aws.amazon.com/code/1825 EC2 Instance Metadata Query Tool
      INSTANCE_ID=$(./ec2-metadata | grep instance-id | awk '{print $2}')
    
      # Describe the tags of this instance
      aws ec2 describe-tags --region sa-east-1 --filters "Name=resource-id,Values=$INSTANCE_ID"
    }
    
    # Convert the tags to environment variables.
    # Based on https://github.com/berpj/ec2-tags-env/pull/1
    tags_to_env () {
        tags=$1
    
        for key in $(echo $tags | /usr/bin/jq -r ".[][].Key"); do
            value=$(echo $tags | /usr/bin/jq -r ".[][] | select(.Key==\"$key\") | .Value")
            key=$(echo $key | /usr/bin/tr '-' '_' | /usr/bin/tr '[:lower:]' '[:upper:]')
            echo "Exporting $key=$value"
            export $key="$value"
        done
    }
    
    # Execute the commands
    instanceTags=$(getInstanceTags)
    tags_to_env "$instanceTags"
    
  3. 3

    Últimamente, parece AWS Parámetro de la Tienda es una mejor solución.

    Ahora hay incluso un secretos manager que se auto gestiona sensible configuraciones de base de datos de claves y tal..

    Ver esta secuencia de comandos mediante la SSM Parámetro de la Tienda en función de las soluciones anteriores por Chico y PJ Bergeron.

    https://github.com/lezavala/ec2-ssm-env

    • Veo que el script es un script de bash. Asumo que poner la llamada a él (sh import-params.sh -p /NAMESPACE/ENV/ -r us-west-1) USUARIO en la sección de DATOS de la instancia de EC2, pero donde debo guardar la secuencia de comandos de modo que es accesible cuando la instancia se está iniciando?
    • Creo que en Linux es una práctica común para almacenar secuencias de comandos en el directorio /usr/local/bin. Puede ejecutar el comando en el arranque a través de cron @reboot o /etc/rc.local de Mi preferencia es para disparar a través de AWS Ejecutar Comando como puedo destino/actualización de varias instancias.
  4. 2

    Yo normalmente la carga de las etiquetas de variables de entorno en el arranque mediante la ejecución de un UserData secuencia de comandos. Dependiendo de la instancia, puedo cambiar el --query y --filter parámetros para la describe-instances llamar, pero de lo contrario, el guión sigue siendo el mismo. NOTA: El ejemplo de abajo excluye la etiqueta Name y etiquetas que contengan : – cambiar este comportamiento para adaptarse a sus necesidades.

    #!/bin/bash -v
    apt-get update
    apt-get -y install awscli
    
    # add boot script which loads environment variables
    cat > /etc/profile.d/export_instance_tags.sh << 'EndOfMessage'
    # fetch instance info
    INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
    INSTANCE_AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
    INSTANCE_REGION="`echo \"$INSTANCE_AZ\" | sed -e 's:\([0-9][0-9]*\)[a-z]*\$:\\1:'`"
    
    # export instance tags
    export_statement=$(aws ec2 describe-tags --region "$INSTANCE_REGION" --filters "Name=resource-id,Values=$INSTANCE_ID" --query 'Tags[?!contains(Key, `Name`) && !contains(Key, `:`)].[Key,Value]' --output text | sed -E 's/^([^\s\t]+)[\s\t]+([^\n]+)$/export \1="\2"/g')
    eval $export_statement
    
    # export instance info
    export INSTANCE_ID
    export INSTANCE_AZ
    export INSTANCE_REGION
    EndOfMessage
    

    Se ejecuta describe-tags a la lista de todas las etiquetas, vuelve a formatear la salida de una secuencia de declaraciones de exportación con sed, a continuación, ejecuta el resultado utilizando eval

    • Estoy tratando de su guión, pero con el error An error occurred (UnauthorizedOperation) when calling the DescribeTags operation: You are not authorized to perform this operation. Alguna idea?
    • Ha sido un tiempo desde que estaba en AWS, pero creo que te falta el IAM permiso «ec2:DescribeTags». Intente agregar a la instancia de perfil de la ejecución de la instancia de EC2.
    • Sí, lo hizo. Gracias!

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea