CodeBuildコンテナをNATなしプロキシ環境下で実行した

2021.01.07

いわさです。

CodeBuildはビルド実行環境にVPCを指定することが出来ます。
VPCを指定することで、プライベートなリソース(RDSなど)にアクセスしユニットテストでアクセスすることなどが可能となります。

CodeBuildをVPC環境で実行する際はNATゲートウェイを経由できるプライベートサブネットが基本的に必要となります。

しかしプライベートなネットワーク環境で利用するWebアプリなどの場合、直接インターネットへのアクセスが許可されていない場合があります。
もしネットワーク上にプロキシサーバーが存在する場合、CodeBuild実行時に利用することが出来ます。

プロキシ環境で動作させる設定値と挙動を確認するため試したことを記します。

ネットワーク&プロキシサーバーの準備

以下に従いプロキシ環境を用意します。

作成されたプライベートサブネットでCodeBuild実行コンテナを動作させます。

パイプラインの準備

今回はPython + Django on EC2 な環境で試してみます。
ちなみに、こういった検証でCodeシリーズのパイプラインを用意したい場合はCodeStarがオススメです。

検証

まず、パイプライン構築後のデフォルト動作を見てみましょう。

ネットワーク制限の無い環境で動作しているため、ビルドに成功します。
ただし、この時点ではVPC内リソースへのアクセスは出来ません。

VPCを使うように変更してみましょう。

VPC設定の確認ボタンを押すとエラーメッセージが表示されます。

ここでは、無視して実行してみます。

DOWNLOAD_SOURCEフェーズでタイムアウトしました。
VPC内からS3に配置されたCodeCommitソースコードにアクセスが出来ないためです。

プロキシ設定を行い検証

CodeBuildプロジェクトのビルドの詳細タブ->環境より環境変数HTTP_PROXYHTTPS_PROXYを設定します。
IPアドレスは構築したプロキシサーバーのプライベートアドレスを指定します。
また、プライベートサブネットからプロキシサーバーへのルーティングが設定されていることを確認してください。

実行してみます。

進みました。 しかし、UPLOAD_ARTIFACTSフェーズで止まり、ビルドログも表示されません。

buildspec.ymlにもプロキシ設定の追加が必要です。

proxy.upload-artifactsproxy.logsを設定して、実行します。

ビルドログが表示されました。

ビルドフェーズも最後まで進みました。

wgetコマンドなどはどうなる?

ためしてみました。

[Container] 2021/01/07 08:33:22 Moving to directory /codebuild/output/src160764574/src
[Container] 2021/01/07 08:33:22 Registering with agent
[Container] 2021/01/07 08:33:22 Phases found in YAML: 3
[Container] 2021/01/07 08:33:22 INSTALL: 2 commands
[Container] 2021/01/07 08:33:22 PRE_BUILD: 1 commands
[Container] 2021/01/07 08:33:22 POST_BUILD: 1 commands
[Container] 2021/01/07 08:33:22 Phase complete: DOWNLOAD_SOURCE State: SUCCEEDED
[Container] 2021/01/07 08:33:22 Phase context status code: Message:
[Container] 2021/01/07 08:33:22 Entering phase INSTALL
[Container] 2021/01/07 08:33:22 Running command wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz
--2021-01-07 08:33:24-- https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz
Resolving www.phpmyadmin.net (www.phpmyadmin.net)... 89.187.160.52, 2a02:6ea0:d300::5
Connecting to www.phpmyadmin.net (www.phpmyadmin.net)|89.187.160.52|:443... failed: Connection timed out.
Connecting to www.phpmyadmin.net (www.phpmyadmin.net)|2a02:6ea0:d300::5|:443... failed: Cannot assign requested address.
Retrying.

タイムアウトしました。

環境変数のプロキシ設定が適用されてない場合は各コマンドで直接指定が必要となります。

version: 0.2
proxy:
  upload-artifacts: yes
  logs: yes
phases:
  install:
    runtime-versions:
      python: 3.8
    commands:
      # Install dependencies needed for running tests
      - wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz -e USE_PROXY=yes -e HTTPS_PROXY=10.0.0.43:3128
      - pip install -r requirements/common.txt
[Container] 2021/01/07 09:02:23 Running command wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz -e use_proxy=yes -e https_proxy=10.0.0.43:3128
--2021-01-07 09:02:23-- https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz
Connecting to 10.0.0.43:3128... connected.
Proxy request sent, awaiting response... 302 Found
Location: https://files.phpmyadmin.net/phpMyAdmin/5.0.4/phpMyAdmin-5.0.4-all-languages.tar.gz [following]
--2021-01-07 09:02:24-- https://files.phpmyadmin.net/phpMyAdmin/5.0.4/phpMyAdmin-5.0.4-all-languages.tar.gz
Connecting to 10.0.0.43:3128... connected.
Proxy request sent, awaiting response... 200 OK

まとめ

透過プロキシの場合は設定なしで動作しますが、通常のプロキシの場合は環境変数の設定が必要となります。
また、コマンド個別のプロキシ設定が必要な場合もありますので、ビルドログを確認して個別に対応するようにしましょう。