AWS CodeBuild
사용 설명서 (API 버전 2016-10-06)

프록시 서버에 CodeBuild 사용

프록시 서버에 AWS CodeBuild를 사용하여 인터넷과의 HTTP 및 HTTPS 트래픽을 제어할 수 있습니다. 프록시 서버에서 CodeBuild를 실행하려면 Amazon Virtual Private Cloud(Amazon VPC)에서 퍼블릭 서브넷에 프록시 서버를 설치하고 가상 서브넷에 CodeBuild를 설치합니다.

프록시 서버에서 CodeBuild를 실행하는 주요 사용 사례는 두 가지입니다.

  • Amazon VPC에서 NAT 게이트웨이 또는 NAT 인스턴스를 사용할 필요가 없어집니다.

  • 프록시 서버 내 인스턴스가 액세스할 수 있는 URL을 지정하고 프록시 서버가 액세스를 거부하는 URL을 지정할 수 있습니다.

CodeBuild를 두 가지 유형의 프록시 서버에 사용할 수 있습니다. 두 유형 모두, 프록시 서버는 퍼블릭 서브넷에서 실행되고 CodeBuild는 프라이빗 서브넷에서 실행됩니다.

프록시 서버에서 CodeBuild를 실행하기 위해 필요한 구성 요소

투명 또는 명시적 프록시 서버에서 AWS CodeBuild를 실행하려면 다음 구성 요소가 필요합니다.

  • Amazon VPC.

  • 프록시 서버용 Amazon VPC에 퍼블릭 서브넷 1개.

  • CodeBuild용 Amazon VPC에 프라이빗 서브넷 1개.

  • VPC와 인터넷 간 통신을 허용하는 인터넷 게이트웨이.

다음 다이어그램은 구성 요소가 상호 작용하는 방식을 보여 줍니다.

VPC, 서브넷 및 네트워크 게이트웨이 설정

다음은 투명 또는 명시적 프록시 서버에서 AWS CodeBuild를 실행하는 데 필요한 단계입니다.

  1. VPC를 만듭니다. 자세한 내용은 VPC 만들기 단원을 참조하십시오.

  2. VPC에서 서브넷 2개를 만듭니다. 하나는 프록시 서버가 실행되는 퍼블릭 서브넷입니다(이름: Public Subnet). 다른 하나는 CodeBuild가 실행되는 프라이빗 서브넷입니다(이름: Private Subnet).

    자세한 내용은 VPC에서 서브넷 만들기 단원을 참조하십시오.

  3. 인터넷 게이트웨이를 생성하여 VPC에 연결합니다. 자세한 내용은 인터넷 게이트웨이 생성 및 연결을 참조하십시오.

  4. 기본 라우팅 테이블에 VPC(0.0.0.0/0)에서 인터넷 게이트웨이로 가는 트래픽을 라우팅하는 규칙을 추가합니다. 자세한 내용은 라우팅 테이블에 경로 추가 및 라우팅 테이블에서 경로 제거 단원을 참조하십시오.

  5. VPC의 기본 보안 그룹에 VPC(0.0.0.0/0)로부터 들어오는 SSH 트래픽(TCP 22)을 허용하는 규칙을 추가합니다.

  6. 시작 인스턴스 마법사를 사용하여 인스턴스 시작 단원의 지침을 따라 Amazon Linux Amazon EC2 인스턴스를 시작합니다. 마법사를 실행할 때 다음 옵션을 선택합니다.

    • 인스턴스 유형 선택에서 Amazon Linux Amazon 머신 이미지(AMI)를 선택합니다.

    • 서브넷에서 이 주제의 앞부분에서 만든 퍼블릭 서브넷을 선택합니다. 제안된 이름을 사용했다면 퍼블릭 서브넷입니다.

    • 퍼블릭 IP 자동 할당에서 활성화를 선택합니다.

    • 보안 그룹 구성 페이지의 보안 그룹 할당에서 Select an existing security group(기존 보안 그룹 선택)을 선택합니다. 그런 다음 기본 보안 그룹을 선택합니다.

    • 시작을 선택한 후 기존 키 페어를 하나 선택하거나 생성합니다.

    다른 옵션은 모두 기본 설정을 선택합니다.

  7. Amazon EC2 인스턴스가 실행되면 원본/대상 확인을 비활성화합니다. 자세한 내용은 원본/대상 확인 비활성화 단원을 참조하십시오.

  8. VPC에서 라우팅 테이블을 만듭니다. 라우팅 테이블에 인터넷으로 향하는 트래픽을 프록시 서버로 라우팅하는 규칙을 추가합니다. 이 라우팅 테이블을 프라이빗 서브넷과 연결합니다. 이 단계는 CodeBuild가 실행되는 프라이빗 서브넷 내 인스턴스의 아웃바운드 요청이 항상 프록시 서버를 통해 라우팅되도록 하는 데 필요합니다.

프록시 서버 설치 및 구성

선택할 수 있는 프록시 서버는 많습니다. 여기서는 오픈 소스 프록시 서버 Squid를 사용하여 프록시 서버에서 AWS CodeBuild를 실행하는 방법을 시연합니다. 동일한 개념을 다른 프록시 서버에도 적용할 수 있습니다.

Squid를 설치하려면 다음 명령을 실행하여 yum repo를 사용합니다.

sudo yum update -y sudo yum install -y squid

Squid를 설치한 후 squid.conf 파일을 편집합니다. 이 파일을 편집하기 위한 지침은 이 주제의 뒷부분에 포함되어 있습니다.

HTTPS 트래픽에 대해 Squid 구성

HTTPS의 경우, TLS(전송 계층 보안) 연결에서 HTTP 트래픽이 캡슐화된 것입니다. Squid는 SslPeekAndSplice라는 기능을 사용하여 TSL 초기화에서 요청된 인터넷 호스트를 포함하는 SNI(서버 이름 표시)를 검색합니다. 이는 Squid가 HTTPS 트래픽을 해독할 필요가 없도록 하기 위해 필요합니다. SslPeekAndSplice를 활성화하려면 Squid가 인증서를 요구합니다. 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

참고

HTTP의 경우, Squid를 구성할 필요가 없습니다. 모든 HTTP/1.1 요청 메시지에서 요청되는 인터넷 호스를 지정하는 호스트 헤더 필드를 검색할 수 있습니다.

명시적 프록시 서버에서 CodeBuild 실행

명시적 프록시 서버에서 AWS CodeBuild를 실행하려면 프록시 서버가 외부 사이트와의 트래픽을 허용 또는 거부하도록 구성한 다음, HTTP_PROXYHTTPS_PROXY 환경 변수를 구성해야 합니다.

Squid를 명시적 프록시 서버로 구성

Squid를 명시적 프록시 서버로 구성하려면 다음과 같이 /etc/squid/squid.conf 파일을 수정해야 합니다.

  • 다음 기본 ACL(액세스 제어 목록) 규칙을 제거합니다.

    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

    제거한 기본 ACL 규칙 대신 다음 규칙을 추가합니다. 첫 번째 줄은 Amazon VPC로부터의 요청을 허용합니다. 다음 두 줄은 프록시 서버에 AWS CodeBuild가 사용할 수 있는 대상 URL에 대한 액세스 권한을 부여합니다. 마지막 줄의 정규식을 수정하여 AWS 리전의 Amazon S3 버킷 또는 CodeCommit 리포지토리를 지정합니다. 예:

    • 소스가 Amazon S3일 경우 acl download_src dstdom_regex .*s3\.us-west-1\.amazonaws\.com 명령을 사용하여 us-west-1 리전 내 Amazon S3 버킷에 대한 액세스 권한을 부여합니다.

    • 소스가 AWS CodeCommit인 경우 git-codecommit.<your-region>.amazonaws.com을 사용하여 AWS 리전을 화이트리스트로 지정합니다.

    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
  • http_access allow localnet을 다음으로 바꿉니다.

    http_access allow localnet allowed_sites http_access allow localnet download_src
  • 빌드가 로그 및 아티팩트를 업로드하도록 하려면 다음 중 하나를 수행하십시오.

    1. http_access deny all 문 앞에 다음 문을 삽입합니다. 이들 문은 CodeBuild가 CloudWatch 및 Amazon S3에 액세스하도록 허용합니다. CloudWatch에 대한 액세스는 CodeBuild가 CloudWatch 로그를 생성하기 위해 필요합니다. Amazon S3에 대한 액세스는 결과물 및 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
      • squid.conf를 저장하고 다음을 실행합니다.

        sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 3130 sudo service squid restart
    2. buildspec 파일에 proxy를 추가합니다. 자세한 내용은 빌드 사양 구문 단원을 참조하십시오.

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

참고

RequestError 시간 초과 오류가 발생할 경우 프록시 서버에서 CodeBuild를 실행할 때 RequestError 시간 초과 오류 단원을 참조하십시오.

자세한 내용은 이 주제의 후반부에서 명시적 프록시 서버 샘플 Squid.conf 파일 단원을 참조하십시오.

CodeBuild 프로젝트 만들기

명시적 프록시 서버에서 AWS CodeBuild를 실행하려면 프로젝트 수준에서 HTTP_PROXYHTTPS_PROXY 환경 변수를 프록시 서버용으로 만든 Amazon EC2 인스턴스의 프라이빗 IP 주소와 포트 3128로 설정합니다. 프라이빗 IP 주소는 http://your-ec2-private-ip-address:3128과 비슷합니다. 자세한 내용은 CodeBuild에서 빌드 프로젝트 만들기CodeBuild에서 빌드 프로젝트 설정 변경 단원을 참조하십시오.

다음 명령을 사용하여 Squid 프록시 액세스 로그를 확인합니다.

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

명시적 프록시 서버 샘플 Squid.conf 파일

다음은 명시적 프록시 서버용으로 구성된 squid.conf 파일의 예입니다.

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 executed 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 execute 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

투명 프록시 서버에서 CodeBuild 실행

투명 프록시 서버에서 AWS CodeBuild를 실행하려면 프록시 서버가 상호 작용하는 웹 사이트 및 도메인에 액세스할 수 있도록 구성해야 합니다.

Squid를 투명 프록시 서버로 구성

프록시 서버를 투명으로 구성하려면 액세스하려는 도메인 및 웹 사이트에 대한 액세스 권한을 부여해야 합니다. 투명 프록시 서버에서 AWS CodeBuild를 실행하려면 amazonaws.com에 대한 액세스 권한을 부여해야 합니다. 또한 CodeBuild가 사용하는 다른 웹 사이트에 대해서도 액세스 권한을 부여해야 합니다. 이러한 웹 사이트는 CodeBuild 프로젝트를 만드는 방식에 따라 달라집니다. 예를 들어 GitHub, Bitbucket, Yum, Maven 같은 리포지토리용 웹 사이트입니다. Squid에 특정 도메인 및 웹 사이트에 대한 액세스 권한을 부여하려면 다음과 같은 명령을 사용하여 squid.conf 파일을 업데이트합니다. 이 샘플 명령은 amazonaws.com, github.com 및 bitbucket.com에 대한 액세스 권한을 부여합니다. 이 샘플을 편집하여 다른 웹 사이트에 대한 액세스 권한을 부여할 수 있습니다.

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

프라이빗 서브넷에 있는 인스턴스에서 오는 수신 요청은 Squid 포트로 리디렉션해야 합니다. Squid는 HTTP 트래픽의 경우 포트 3129(80이 아님)에서 수신 대기하고, HTTPS 트래픽의 경우 포트 3130(443이 아님)에서 수신 대기합니다. iptables 명령을 사용하여 트래픽을 적절히 라우팅합니다.

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

CodeBuild 프로젝트 만들기

프록시 서버를 구성하면 더 이상 구성할 필요 없이 프라이빗 서브넷에서 AWS CodeBuild를 사용할 수 있습니다. 모든 HTTP 및 HTTPS 요청이 퍼블릭 프록시 서버를 통과합니다. 다음 명령을 사용하여 Squid 프록시 액세스 로그를 확인합니다.

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

프록시 서버에서 패키지 관리자 및 기타 도구 실행

프록시 서버에서 패키지 관리자와 같은 도구를 실행하려면

  1. squid.conf 파일에 문을 추가하여 프록시 서버에서 해당 도구를 화이트리스트로 지정합니다.

  2. 프록시 서버의 프라이빗 엔드포인트를 가리키는 줄을 buildspec 파일에 추가합니다.

다음 예제는 apt-get, curlmaven에서 이렇게 하는 방법을 보여줍니다. 다른 도구를 사용하는 경우 동일한 개념을 사용하여 squid.conf 파일에서 해당 도구를 화이트리스트로 지정하고 buildspec 파일에 문을 추가하여 CodeBuild가 프록시 서버의 엔드포인트를 인식하게 만듭니다.

프록시 서버에서 apt-get 실행

  1. squid.conf 파일에 다음 문을 추가하여 프록시 서버에서 apt-get을 화이트리스트로 지정합니다. 처음 세 줄은 빌드 환경에서 apt-get을 실행하도록 허용합니다.

    acl allowed_sites dstdomain ppa.launchpad.net # Required for apt-get to execute in the build environment acl apt_get dstdom_regex .*\.launchpad.net # Required for CodeBuild to execute apt-get in the build environment acl apt_get dstdom_regex .*\.ubuntu.com # Required for CodeBuild to execute apt-get in the build environment http_access allow localnet allowed_sites http_access allow localnet apt_get
  2. apt-get 명령이 /etc/apt/apt.conf.d/00proxy에서 프록시 구성을 검색하도록 buildspec 파일에 다음 문을 추가합니다.

    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

프록시 서버에서 curl 실행

  1. squid.conf 파일에 다음 문을 추가하여 빌드 환경에서 curl을 화이트리스트로 지정합니다.

    acl allowed_sites dstdomain ppa.launchpad.net # Required to execute 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. curl이 프라이빗 프록시 서버를 사용하여 squid.conf에 추가한 웹 사이트에 액세스하도록 buildspec 파일에 다음 문을 추가합니다. 이 예제에서 웹 사이트는 google.com입니다.

    curl -x <private-ip-of-proxy-server>:3128 https://www.google.com

프록시 서버에서 maven 실행

  1. squid.conf 파일에 다음 문을 추가하여 빌드 환경에서 maven을 화이트리스트로 지정합니다.

    acl allowed_sites dstdomain ppa.launchpad.net # Required to execute 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. buildspec 파일에 다음 문을 추가합니다.

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