使用 AWS CodeBuild 搭配代理伺服器 - AWS CodeBuild

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 AWS CodeBuild 搭配代理伺服器

您可以使用 AWS CodeBuild 搭配代理伺服器來調節往返網際網路的 HTTP 和 HTTPS 流量。若要搭配代理伺服器執行 CodeBuild,請將代理伺服器安裝在公有子網路,在 VPC 中的私有子網路。

在代理伺服器中執行 CodeBuild 有兩個主要的使用案例:

  • 不需要在您的 VPC 中使用 NAT 閘道或 NAT 執行個體。

  • 可讓您指定代理伺服器中的執行個體可以存取的 URL,以及代理伺服器拒絕存取的 URL。

您可以使用 CodeBuild 搭配兩種類型的代理伺服器。兩者都一樣,代理伺服器在公有子網路中執行,CodeBuild 在私有子網路中執行。

在代理伺服器中執行 CodeBuild 所需的元件

您需要這些元件才能在透明或明確代理伺服器中執行 AWS CodeBuild:

  • VPC。

  • 您的 VPC 中一個用於代理伺服器的公有子網路。

  • VPC 中一個用於 CodeBuild 的私有子網路。

  • 允許 VPC 和網際網路之間通訊的網際網路閘道。

下圖顯示元件如何互動。

設定 VPC、子網路和網路閘道

在透明或明確代理伺服器中執行 AWS CodeBuild 需要以下步驟。

  1. 建立 VPC。如需相關資訊,請參閱「」。建立 VPC中的Amazon VPC User Guide

  2. 在 VPC 中建立兩個子網路。一個是名為 Public Subnet 的公有子網路,您的代理伺服器在其中執行。另一個是名為Private Subnet在其中運行 CodeBuild。

    如需相關資訊,請參閱在您的 VPC 中建立子網路

  3. 建立網際網路閘道並連接到您的 VPC。如需詳細資訊,請參閱建立和連接網際網路閘道

  4. 在預設路由表中新增規則,將從 VPC (0.0.0.0/0) 傳出的流量路由傳送到網際網路閘道。如需相關資訊,請參閱從路由表新增和移除路由

  5. 在 VPC 的預設安全群組中新增規則,以允許來自 VPC (0.0.0.0/0) 的輸入 SSH 流量 (TCP 22)。

  6. 請遵循使用啟動執行個體精靈啟動執行個體中的Amazon EC2 使用者指南啟動 Amazon Linux 執行個體。當您執行精靈時,請選擇以下選項:

    • In選擇執行個體類型下,選擇 Amazon Linux Amazon Machine Image (AMI)。

    • Subnet (子網路) 中,選擇您先前在此主題中建立的公有子網路。如果您使用建議的名稱,則為 公有子網路 (Public Subnet)

    • Auto-assign Public IP (自動指派公有 IP) 中,選擇 Enable (啟用)

    • Configure Security Group (設定安全群組) 頁面,針對 Assign a security group (指派安全群組),選擇 Select an existing security group (選取現有的安全群組)。接下來,選擇預設安全群組。

    • 當您選擇 Launch (啟動) 之後,選擇現有的金鑰對或建立金鑰對。

    對於其他所有選項,選擇預設設定。

  7. 在您的 EC2 執行個體執行之後,停用來源/目的地檢查。如需相關資訊,請參閱「」。停用來源/目標檢查中的Amazon VPC User Guide

  8. 在您 VPC 中建立路由表。在路由表中新增規則,將流向網際網路的流量路由傳送到您的代理伺服器。將此路由表與您的私有子網路建立關聯。需要如此,從私有子網路中的執行個體 (CodeBuild) 傳出的請求才會一律透過代理伺服器來路由傳送。

安裝和設定代理伺服器

有許多代理伺服器可供選擇。此處使用開放來源碼代理伺服器 Squid,以示範 AWS CodeBuild 如何在代理伺服器中執行。您可以將相同的概念套用到其他代理伺服器。

若要安裝 Squid,請執行下列命令來使用 yum 儲存庫:

sudo yum update -y sudo yum install -y squid

安裝 Squid 之後,請按照本主題稍後的指示編輯其 squid.conf 檔案。

針對 HTTPS 流量來設定 Squid

對於 HTTPS,HTTP 流量會封裝在 Transport Layer Security (TLS) 連線中。Squid 使用稱為 SslPeekAndSplice 的功能,從包含所要求網際網路主機的 TLS 初始中,擷取伺服器名稱指示 (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 規則。第一行允許來自 VPC 的請求。接下來兩行授予許可給您的代理伺服器存取 AWS CodeBuild 可能使用的目的地 URL。編輯最後一行的規則表達式,以指定 S3 儲存貯體,或在AWS區域。例如:

    • 如果您的來源是 Amazon S3,請使用命令acl download_src dstdom_regex .*s3\.us-west-1\.amazonaws\.com,以授權存取us-west-1區域。

    • 如果您的來源是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. proxy 新增至您的 buildspec 檔案。如需詳細資訊,請參閱 Buildspec 語法

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

如果您收到 RequestError 逾時錯誤,請參閱 在代理服務器中執行代 CodeBuild 時發生 RequestError

如需詳細資訊,請參閱本主題稍後的 明確代理伺服器 squid.conf 檔案範例

創建 CodeBuild 專案

若要搭配明確代理伺服器來執行 AWS CodeBuild,請在專案層級將其 HTTP_PROXYHTTPS_PROXY 環境變數設定為您為代理伺服器所建立之 EC2 執行個體的私有 IP 地址,以及連接埠 3128。私有 IP 地址看起來像是 http://your-ec2-private-ip-address:3128。如需詳細資訊,請參閱 在 AWS CodeBuild 中建立建置專案在 AWS 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 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

在透明代理伺服器中執行 CodeBuild

若要在透明代理伺服器中執行 AWS CodeBuild,您必須將代理伺服器設定為可存取與之互動的網站和網域。

將 Squid 設定為透明代理伺服器

若要將代理伺服器設定為透明,您必須授與它您希望其存取之網域和網站的存取權。若要搭配透明代理伺服器來執行 AWS CodeBuild,您必須授與它 amazonaws.com 的存取權。您還必須授權存取使用 CodeBuild 使用的其他網路。這些都根據您如何建立 CodeBuild 專案而有所不同。例如,GitHub、Bitbucket、Yum 和 Maven 等儲存庫的網站。若要授與 Squid 存取特定網域和網站,請使用類似以下的命令來更新 squid.conf 檔案。此命令範例會授予對 amazonaws.comgithub.combitbucket.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 會在連接埠 3129 (而不是 80) 接聽 HTTP 流量,在 3130 (而不是 443) 接聽 HTTPS 流量。使用 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-getcurlmaven 這樣做。如果您使用不同的工具,也適用同樣的原則。將其添加到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 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. 在 buildspec 檔案中新增以下陳述式,讓 apt-get 命令在 /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

如何在代理伺服器中執行 curl

  1. squid.conf 檔案中新增以下陳述式,將 curl 新增至建置環境中的允許清單。

    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. 在 buildspec 檔案中新增以下陳述式,讓 curl 使用私有代理伺服器來存取您新增到 squid.conf 的網站。在此範例中,網站為 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 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. 在您的 buildspec 檔案中新增以下陳述式。

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