CodeBuild(CodePipeline)をVPCで実行するシーンでは、以下のようにプロキシ指定を駆使する必要があるケースがあると思います。
- 外部通信にプロキシ(HTTP_PROXY,HTTPS_PROXY)を利用する
- AWSサービスへの通信のうち、VPCエンドポイントが提供されている場合は、VPCエンドポイント経由(NO_PROXY)とする
- プロキシ設定は、パラメータストアに入れて集約したい
パラメータストアに、http_proxy
,https_proxy
,no_proxy
を登録して、CodeBuildの環境変数でパラメータストア参照にすれば良いかなと試しましたがうまく行きません。
これを実現する方法を記載します。
前提
- CodePipelineから、Github -> CodeBuildの形で、CodePipelineからCodeBuildは実行する流れ
- CodeBuildはbuildspec内で、proxyやvpcエンドポイントへの通信が必要となる
- パラメータストアに、
http_proxy
、https_proxy
、no_proxy
を定義している
結論
- CodeBuildの環境変数
no_proxy
は、.s3.ap-northeast-1.amazonaws.com,ssm.ap-northeast-1.amazonaws.com
をPLAINTEXT
で登録 - CodeBuildの環境変数
http_proxy
、https_proxy
は、パラメータストア参照で登録 - buildspecの中で、
no_proxy
をパラメータストアから読み出し、環境変数に設定する
buildspec.yml
version: 0.2
env:
parameter-store:
ps_no_proxy: no_proxy # パラメータストアからno_proxyの値を読み出す
phases:
install:
commands:
- unset no_proxy # この時点のno_proxyは、s3とssmがセットされているのでno_proxyをリセット
- export no_proxy="$ps_no_proxy" # パラメータストアから読み出したno_proxyの値で設定
- echo $http_proxy # CodeBuildの環境変数にパラメータストア参照で設定しているためパラメータストアのhttp_proxyの値がセットされている
- echo $https_proxy # 同上
試したこと
冒頭の記載の通り、以下のように全てのプロキシ設定をCodeBuildの環境変数でパラメータストアを参照するとうまく行きません
以下のように、DOWNLOAD_SOURCEの箇所でエラーとなってしまいます。
CLIENT_ERROR: RequestError: send request failed caused by: Get "https://codepipeline-ap-northeast-1-xxxxxxxxx.s3.ap-northeast-1.amazonaws.com/xxxxxx/SourceArti/xxxxxx": proxyconnect tcp: dial tcp :80: connect: connection refused for primary source and source version arn:aws:s3:::codepipeline-ap-northeast-1-xxxxxxx/xxxxxx/SourceArti/xxxxx
- パラメータストアを利用せずに、PLAINTEXTで設定してもうまく行きます。
-
.s3.ap-northeast-1.amazonaws.com,ssm.ap-northeast-1.amazonaws.com
をPLAINTEXTで指定している理由は、ソースステージのアーティファクトがS3にあるため、とパラメータストア(SSM)から値を読み出すためにVPCエンドポイントを経由するためです。