Uso de AWS CodeBuild con un servidor proxy - AWS CodeBuild

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Uso de AWS CodeBuild con un servidor proxy

Puede utilizar AWS CodeBuild con un servidor proxy para regular el tráfico HTTP y HTTPS de entrada y salida de Internet. Para ejecutar CodeBuild con un servidor proxy, debe instalar un servidor proxy en una subred pública y CodeBuild en una subred privada de una VPC.

Existen dos casos de uso principales en los que CodeBuild se ejecuta en un servidor proxy:

  • Elimina la necesidad de utilizar una gateway NAT o una instancia NAT en la VPC.

  • Permite especificar las URL a las que las instancias del servidor proxy pueden obtener acceso y a las que el servidor proxy deniega el acceso.

Puede utilizar CodeBuild con dos tipos de servidores proxy. En ambos casos, el servidor proxy se ejecuta en una subred pública, mientras que CodeBuild lo hace en una subred privada.

Componentes necesarios para ejecutar CodeBuild en un servidor proxy

Para ejecutar AWS CodeBuild en un servidor proxy transparente o explícito, necesita estos componentes:

  • Una VPC.

  • Una subred pública en la VPC para el servidor proxy.

  • Una subred privada en la VPC para CodeBuild.

  • Una gateway de Internet que permita la comunicación entre la VPC e Internet.

En el siguiente diagrama, se muestran cómo interactúan los componentes.

Configuración de una VPC, varias subredes y una gateway de red

A continuación, se presentan los pasos necesarios para ejecutar AWS CodeBuild en un servidor proxy transparente o explícito.

  1. Cree una VPC. Para obtener más información, consulte Creación de una VPC en la Guía del usuario de Amazon VPC.

  2. Cree dos subredes en la VPC. Una será una subred pública llamada Public Subnet en la que se ejecutará el servidor proxy. La otra será una subred privada llamada Private Subnet en la que se ejecutará CodeBuild.

    Para obtener más información, consulte Creación de una subred en la VPC.

  3. Cree una gateway de Internet y vincúlela a su VPC. Para obtener más información, consulte Creación y asociación de una gateway de Internet.

  4. Agregue una regla a la tabla de enrutamiento predeterminada que direccione el tráfico saliente desde la VPC (0.0.0.0/0) a la gateway de Internet. Para obtener más información, consulte Adición y eliminación de rutas de una tabla de enrutamiento.

  5. Agregue una regla al grupo de seguridad predeterminado de la VPC que permita la entrada de tráfico SSH (TCP 22) procedente de la VPC (0.0.0.0/0).

  6. Siga las instrucciones que se indican en Lanzar una instancia con el asistente de inicialización de instancias en la Guía del usuario de Amazon EC2 para lanzar una instancia de Amazon Linux. Cuando el asistente esté en ejecución, seleccione las siguientes opciones:

    • En Elija un tipo de instancia, seleccione una Imagen de máquina de Amazon (AMI) de Amazon Linux.

    • En Subnet (Subred), seleccione la subred pública que creó anteriormente en este tema. Si utilizó el nombre recomendado, se llamará Public Subnet (Subred pública).

    • En Auto-assign Public IP (IP de asignación automática), elija Enable (Habilitar).

    • En la página Configure Security Group (Configurar grupo de seguridad), en Assign a security group (Asignar un grupo de seguridad), seleccione Select an existing security group (Seleccionar un grupo de seguridad existente). A continuación, seleccione el grupo de seguridad predeterminado.

    • Cuando haga clic en Launch (Lanzar), seleccione un par de claves existente o cree uno.

    Seleccione la configuración predeterminada de todas las demás opciones.

  7. Una vez que la instancia EC2 esté en ejecución, desactive las comprobaciones de origen/destino. Para obtener más información, consulte Desactivación de comprobaciones de origen/destino en la Guía del usuario de Amazon VPC.

  8. Cree una tabla de enrutamiento en la VPC. Agregue una regla a la tabla de enrutamiento que direccione el tráfico destinado a Internet al servidor proxy. Asocie esta tabla de enrutamiento con la subred privada. Esta operación es necesaria para que las solicitudes de salida de las instancias de la subred privada en la que se ejecuta CodeBuild se direccionen siempre a través del servidor proxy.

Instalación y configuración de un servidor proxy

Existen muchos servidores proxy entre los que elegir. Aquí, vamos a utilizar un servidor proxy de código abierto, Squid, para mostrar cómo se ejecuta AWS CodeBuild en un servidor proxy. Puede emplear estos mismos conceptos con otros servidores proxy.

Para instalar Squid, utilice un repositorio yum ejecutando los siguientes comandos:

sudo yum update -y sudo yum install -y squid

Después de instalar Squid, edite el archivo squid.conf siguiendo las instrucciones que se indican más adelante en este tema.

Configuración de Squid para el tráfico HTTPS

En HTTPS, el tráfico HTTP se encapsula en una conexión Transport Layer Security (TLS). Squid utiliza una característica llamada SslPeekAndSplice para recuperar la indicación de nombre de servidor (SNI) del inicio de TLS que contiene el host de Internet solicitado. Esta operación es necesaria, ya que Squid no necesita descifrar el tráfico HTTPS. Para habilitar SslPeekAndSplice, Squid necesita un certificado. Cree este certificado con OpenSSL:

sudo mkdir /etc/squid/ssl cd /etc/squid/ssl sudo openssl genrsa -out squid.key 2048 sudo openssl req -new -key squid.key -out squid.csr -subj "/C=XX/ST=XX/L=squid/O=squid/CN=squid" sudo openssl x509 -req -days 3650 -in squid.csr -signkey squid.key -out squid.crt sudo cat squid.key squid.crt | sudo tee squid.pem
nota

En el caso de HTTP, Squid no requiere configuración. En todos los mensajes de solicitud HTTP/1.1, puede recuperar el campo del encabezado de host, donde se especifica el host de Internet que se está solicitando.

Ejecución de CodeBuild en un servidor proxy explícito

Para ejecutar AWS CodeBuild en un servidor proxy explícito, debe configurar el servidor proxy de forma que permita o deniegue el tráfico dirigido a sitios externos o el tráfico procedente de estos sitios y debe configurar las variables de entorno HTTPS_PROXY y HTTP_PROXY.

Configuración de Squid como un servidor proxy explícito

Si desea configurar el servidor proxy de Squid para que sea explícito, debe realizar las siguientes modificaciones en el archivo /etc/squid/squid.conf:

  • Elimine las siguientes reglas de lista de control de acceso (ACL) predeterminadas.

    acl localnet src 10.0.0.0/8 acl localnet src 172.16.0.0/12 acl localnet src 192.168.0.0/16 acl localnet src fc00::/7 acl localnet src fe80::/10

    Agregue lo siguiente en lugar de las reglas de ACL predeterminadas que ha eliminado. La primera línea admite las solicitudes procedentes de la VPC. Las siguientes dos líneas conceden al servidor proxy acceso a una URL de destino que AWS CodeBuild podría estar utilizando. Modifique la expresión regular de la última línea para especificar buckets de S3 o un repositorio de CodeDommit en una región de AWS. Por ejemplo:

    • Si la fuente es Amazon S3, use el comando acl download_src dstdom_regex .*s3\.us-west-1\.amazonaws\.com para conceder acceso a los buckets de S3 de la región us-west-1.

    • Si la fuente es AWS CodeCommit, use git-codecommit.<your-region>.amazonaws.com para agregar una región de AWS a una lista de elementos permitidos.

    acl localnet src 10.1.0.0/16 #Only allow requests from within the VPC acl allowed_sites dstdomain .github.com #Allows to download source from GitHub acl allowed_sites dstdomain .bitbucket.com #Allows to download source from Bitbucket acl download_src dstdom_regex .*\.amazonaws\.com #Allows to download source from Amazon S3 or CodeCommit
  • Reemplace http_access allow localnet por lo siguiente:

    http_access allow localnet allowed_sites http_access allow localnet download_src
  • Si desea que la compilación cargue registros y artefactos, realice una de las siguientes acciones:

    1. Antes de la instrucción http_access deny all, inserte las siguientes instrucciones. Permiten a CodeBuild acceder a CloudWatch y Amazon S3. Se requiere acceso a CloudWatch para que CodeBuild pueda crear registros de CloudWatch. El acceso a Amazon S3 es necesario para poder cargar artefactos y el almacenamiento en caché de Amazon S3.

      • https_port 3130 cert=/etc/squid/ssl/squid.pem ssl-bump intercept acl SSL_port port 443 http_access allow SSL_port acl allowed_https_sites ssl::server_name .amazonaws.com acl step1 at_step SslBump1 acl step2 at_step SslBump2 acl step3 at_step SslBump3 ssl_bump peek step1 all ssl_bump peek step2 allowed_https_sites ssl_bump splice step3 allowed_https_sites ssl_bump terminate step2 all
      • Después de guardar squid.conf, ejecute el comando siguiente:

        sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 3130 sudo service squid restart
    2. Agregue proxy al archivo buildspec. Para obtener más información, consulte Sintaxis de buildspec.

      version: 0.2 proxy: upload-artifacts: yes logs: yes phases: build: commands: - command
nota

Si recibe un error de tiempo de espera agotado RequestError, consulte RequestError error de tiempo de espera cuando se ejecuta CodeBuild en un servidor proxy.

Para obtener más información, consulte Archivo squid.conf de ejemplo de un servidor proxy explícito más adelante en este tema.

Creación de un proyecto de CodeBuild.

Para ejecutar AWS CodeBuild con el servidor proxy explícito, defina las variables de entorno HTTPS_PROXY y HTTP_PROXY con la dirección IP privada de la instancia EC2 que creó para el servidor proxy y el puerto 3128 en el nivel del proyecto. La dirección IP privada será parecida a la siguiente: http://your-ec2-private-ip-address:3128. Para obtener más información, consulte Creación de un proyecto de compilación en AWS CodeBuild y Cambiar la configuración de un proyecto de compilación en AWS CodeBuild.

Utilice el comando siguiente para ver el registro de acceso del proxy de Squid:

sudo tail -f /var/log/squid/access.log

Archivo squid.conf de ejemplo de un servidor proxy explícito

A continuación, se incluye un ejemplo de un archivo squid.conf configurado para un servidor proxy explícito.

acl localnet src 10.0.0.0/16 #Only allow requests from within the VPC # add all URLS to be whitelisted for download source and commands to be run in build environment acl allowed_sites dstdomain .github.com #Allows to download source from github acl allowed_sites dstdomain .bitbucket.com #Allows to download source from bitbucket acl allowed_sites dstdomain ppa.launchpad.net #Allows to run apt-get in build environment acl download_src dstdom_regex .*\.amazonaws\.com #Allows to download source from S3 or CodeCommit acl SSL_ports port 443 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT # # Recommended minimum Access Permission configuration: # # Deny requests to certain unsafe ports http_access deny !Safe_ports # Deny CONNECT to other than secure SSL ports http_access deny CONNECT !SSL_ports # Only allow cachemgr access from localhost http_access allow localhost manager http_access deny manager # We strongly recommend the following be uncommented to protect innocent # web applications running on the proxy server who think the only # one who can access services on "localhost" is a local user #http_access deny to_localhost # # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS # # Example rule allowing access from your local networks. # Adapt localnet in the ACL section to list your (internal) IP networks # from where browsing should be allowed http_access allow localnet allowed_sites http_access allow localnet download_src http_access allow localhost # Add this for CodeBuild to access CWL end point, caching and upload artifacts S3 bucket end point https_port 3130 cert=/etc/squid/ssl/squid.pem ssl-bump intercept acl SSL_port port 443 http_access allow SSL_port acl allowed_https_sites ssl::server_name .amazonaws.com acl step1 at_step SslBump1 acl step2 at_step SslBump2 acl step3 at_step SslBump3 ssl_bump peek step1 all ssl_bump peek step2 allowed_https_sites ssl_bump splice step3 allowed_https_sites ssl_bump terminate step2 all # And finally deny all other access to this proxy http_access deny all # Squid normally listens to port 3128 http_port 3128 # Uncomment and adjust the following to add a disk cache directory. #cache_dir ufs /var/spool/squid 100 16 256 # Leave coredumps in the first cache dir coredump_dir /var/spool/squid # # Add any of your own refresh_pattern entries above these. # refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern . 0 20% 4320

Ejecución de CodeBuild en un servidor proxy transparente

Para ejecutar AWS CodeBuild en un servidor proxy transparente, debe configurar el servidor proxy para que tenga acceso a los sitios web y los dominios con los que interactúa.

Configuración de Squid como un servidor proxy transparente

Si desea configurar un servidor proxy para que sea transparente, debe concederle acceso a los dominios y sitios web que desee. Para ejecutar AWS CodeBuild con un servidor proxy transparente, debe concederle acceso a amazonaws.com. También debe concederle acceso a otros sitios web que CodeBuild utilice. Los valores variarán en función de cómo cree los proyectos de CodeBuild. Existen sitios web de ejemplo con repositorios, como GitHub, Bitbucket, Yum y Maven. Para conceder a Squid acceso a determinados dominios y sitios web, utilice un comando similar al siguiente para actualizar el archivo squid.conf. Este comando de ejemplo concede acceso a amazonaws.com, github.com y bitbucket.com. Puede editar este ejemplo para conceder acceso a otros sitios web.

cat | sudo tee /etc/squid/squid.conf ≪EOF visible_hostname squid #Handling HTTP requests http_port 3129 intercept acl allowed_http_sites dstdomain .amazonaws.com #acl allowed_http_sites dstdomain domain_name [uncomment this line to add another domain] http_access allow allowed_http_sites #Handling HTTPS requests https_port 3130 cert=/etc/squid/ssl/squid.pem ssl-bump intercept acl SSL_port port 443 http_access allow SSL_port acl allowed_https_sites ssl::server_name .amazonaws.com acl allowed_https_sites ssl::server_name .github.com acl allowed_https_sites ssl::server_name .bitbucket.com #acl allowed_https_sites ssl::server_name [uncomment this line to add another website] acl step1 at_step SslBump1 acl step2 at_step SslBump2 acl step3 at_step SslBump3 ssl_bump peek step1 all ssl_bump peek step2 allowed_https_sites ssl_bump splice step3 allowed_https_sites ssl_bump terminate step2 all http_access deny all EOF

Las solicitudes entrantes procedentes de las instancias de la subred privada deben redirigirse a los puertos de Squid. Squid escucha el tráfico HTTP en el puerto 3129 (en lugar de en el 80) y el tráfico HTTPS en el puerto 3130 (en lugar de en el 443). Utilice el comando iptables para direccionar el tráfico:

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3129 sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 3130 sudo service iptables save sudo service squid start

Creación de un proyecto de CodeBuild.

Una vez configurado el servidor proxy, podrá utilizarlo con AWS CodeBuild en una subred privada sin necesidad de configurar nada más. Todas las solicitudes HTTP y HTTPS pasan por el servidor proxy público. Utilice el comando siguiente para ver el registro de acceso del proxy de Squid:

sudo tail -f /var/log/squid/access.log

Ejecución de un administrador de paquetes y otras herramientas en un servidor proxy

Para ejecutar una herramienta, como un administrador de paquetes, en un servidor proxy
  1. Agregue la herramienta a la lista de permitidos en su servidor proxy agregando instrucciones en el archivo squid.conf.

  2. Agregue una línea al archivo buildspec que apunte al punto de conexión privado del servidor proxy.

En los siguientes ejemplos, se muestra cómo hacerlo con apt-get, curl y maven. Si utiliza una herramienta diferente, se aplicarán los mismos principios. Agréguela a una lista de permitidos en el archivo squid.conf y agregue un comando al archivo de especificación de compilación para que CodeBuild conozca el punto de conexión del servidor proxy.

Para ejecutar apt-get en un servidor proxy
  1. Agregue las siguientes instrucciones en el archivo squid.conf para incluir apt-get en la lista de permitidos del servidor proxy. Las primeras tres líneas permiten que ejecutar apt-get en el entorno de compilación.

    acl allowed_sites dstdomain ppa.launchpad.net # Required for apt-get to run in the build environment acl apt_get dstdom_regex .*\.launchpad.net # Required for CodeBuild to run apt-get in the build environment acl apt_get dstdom_regex .*\.ubuntu.com # Required for CodeBuild to run apt-get in the build environment http_access allow localnet allowed_sites http_access allow localnet apt_get
  2. Agregue la siguiente instrucción en el archivo buildspec para que los comandos apt-get busquen la configuración del proxy en /etc/apt/apt.conf.d/00proxy.

    echo 'Acquire::http::Proxy "http://<private-ip-of-proxy-server>:3128"; Acquire::https::Proxy "http://<private-ip-of-proxy-server>:3128"; Acquire::ftp::Proxy "http://<private-ip-of-proxy-server>:3128";' > /etc/apt/apt.conf.d/00proxy
Para ejecutar curl en un servidor proxy
  1. Agregue lo siguiente al archivo squid.conf para incluir curl en la lista de permitidos del entorno de compilación.

    acl allowed_sites dstdomain ppa.launchpad.net # Required to run apt-get in the build environment acl allowed_sites dstdomain google.com # Required for access to a webiste. This example uses www.google.com. http_access allow localnet allowed_sites http_access allow localnet apt_get
  2. Agregue la siguiente instrucción al archivo buildspec, de modo que curl utilice el servidor proxy privado para acceder al sitio web que agregó a squid.conf. En este ejemplo, el sitio web es google.com.

    curl -x <private-ip-of-proxy-server>:3128 https://www.google.com
Para ejecutar maven en un servidor proxy
  1. Agregue lo siguiente al archivo squid.conf para incluir maven en la lista de permitidos del entorno de compilación.

    acl allowed_sites dstdomain ppa.launchpad.net # Required to run apt-get in the build environment acl maven dstdom_regex .*\.maven.org # Allows access to the maven repository in the build environment http_access allow localnet allowed_sites http_access allow localnet maven
  2. Agregue la siguiente instrucción al archivo buildspec.

    maven clean install -DproxySet=true -DproxyHost=<private-ip-of-proxy-server> -DproxyPort=3128