プライベートなCodeBuild環境からCodeCommitにアクセスしました

2020.12.16

いわさです。

CodeBuildでのビルド実行時にVPC内部のプライベートなリソース(RDSなど)にアクセスしたい場合、CodeBuildのビルド環境の設定で、VPC設定を行うことで、VPC上でコンテナが実行されアクセスできるようになります。

Amazon Virtual Private Cloud による AWS CodeBuild の使用

その際に、CodeBuildに設定したVPC/サブネットが外部へのアクセスが許されていない場合はCodeCommitにもアクセスできないだろうということで、CodeCommitのVPCエンドポイントを試しました。

NATが解決してくれそうですが、使えない場合を想定しています。

サンプルソースコード用意

コードやBuildSpecの中身については本日は言及しません。
以下のサンプルでサッとCodeBuildの設定をして、動作確認していきたいと思います。
コンソールを使用した AWS CodeBuild の開始方法

S3で実行

まずはサンプルに従って、S3をソースに実行してみます。

成功しました。

CodeCommitで実行

次にコード一式をCodeCommitのリポジトリへプッシュし、ソースに実行してみます。この時点ではVPC設定を行いません。

成功しました。

プライベートサブネット上に配置し実行

ビルド環境にてVPC設定を行い、プライベートサブネット上で実行してみます。

ビルドプロジェクト -> ビルドの詳細タブ の 環境セクションを編集します。
VPCとプライベートサブネットを設定して、「VPC設定の確認」を押します。

CodeBuild が、サブネット ID が subnet-098ae8c8af58c2650 であるターゲット NAT ゲートウェイの 0.0.0.0/0 送信先を見つけられないため、IDが vpc-084db422d9f7f52f1 である VPC が、インターネットに接続していない可能性があります

上記警告が出ますが、無視して進めます。

失敗しました。
DOWNLOAD_SOURCEフェーズでタイムアウトしていました。

CodeCommitのエンドポイントを作成し実行

AWS CodeCommit とインターフェイス VPC エンドポイントの使用

VPCからCodeCommitのエンドポイントを作成します。
com.amazonaws.ap-northeast-1.git-codecommit
を使います。
セキュリティグループは、CodeBuildで設定したセキュリティグループからのHTTPSインバウンドを許可しておきます。

DOWNLOAD_SOURCEフェーズに成功しました。
しかし実行結果のログが確認できません。

Logsのエンドポイントを作成し実行

com.amazonaws.ap-northeast-1.logsのエンドポイントを作成します。
git-codecommitと同様にCodeBuildからのHTTPSインバウンドだけ許可します。

成功しました。
実行結果のログも確認出来ました。

まとめ

CodeCommitのVPCエンドポイントでプライベートなCodeBuild環境からアクセスすることが出来ました。
しかし、サンプルではMavenのインストールなどで外部へのアクセスが必要だったため、BUILDフェーズ以降は失敗してしまいました。
このように環境構築時に外部パッケージをダウンロードをすることは往々にしてあると思います。
外部アクセス出来ない場合は、カスタムコンテナイメージなどでパッケージのインストールを済ませておくのが良いかなと思っています。

また、この記事ではCodeCommitとCodeBuildのみで構成しましたが、ソースプロバイダーがCodePipelineの場合はまた別の問題が出てきますのでご注意ください。