CodeBuild が VPC 内のリソースにアクセスできるようになりました

2017.11.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、藤本です。

現地時間 11/21、CodeBuild の実行環境から VPC 内のリソースにアクセスできるようになりました。

早速試してみました。

概要

AWS CodeBuild はビルド実行サービスです。任意の Docker イメージからコンテナを起動して、ソースコードを取得して、任意の処理を実行して、必要に応じてビルドの成果物を S3 へアップロードすることができます。

私のイメージ図

CI/CD 系のビルドや、ユニットテストを担うサービスの位置付けであるとは思うのですが、任意の処理がかけるので発想次第では利用の幅が広がるサービスです。

今まで CodeBuild で動作するコンテナは VPC の外で起動するため、VPC 内のリソースにアクセスする場合、Public IPアドレスにしかアクセスできませんでした。それが今回のアップデートにより CodeBuild のコンテナを VPC 内に起動することができ、セキュリティグループによって VPC 内部のリソースへのアクセスが可能となりました。

それにより以下のようなことが可能となりました。

  • CodeBuild からプライベートネットワークに配置した RDS にアクセスできるようになり、DB が関連したテストを実施できるようになる
  • CodeBuild からインターナル ELB にアクセスできるようになり、プライベートネットワークで接続される別 Webシステムとのインテグレーションテストを実施できるようになる
  • 固定IPアドレスからのアクセスしか許可されない外部サービスに NAT ゲートウェイ経由(固定IPアドレス)でアクセスできるようになる
  • ポリシー上、外部からのアクセスが禁止されている AWS サービスに VPCエンドポイント経由でアクセスできるようになる

一つだけ制約があります。

VPC 内に配置した CodeBuild のコンテナは Public IPアドレスを割り当てることができません。つまり、ソースコードリポジトリとなる GitHubや、CodeCommit などインターネット上のリソースと連携する場合、NAT ゲートウェイや NAT インスタンスが必要となり、それらにルーティングするサブネットに配置する必要があります。

試してみた

それでは早速試してみましょう。

今回は簡単に GitHub リポジトリに格納した Python プログラムから VPC に配置した RDS for MySQL に一件のレコードを INSERT するプログラムを実施してみます。

環境

  • Git リポジトリ:GitHub
  • DB:RDS for MySQL 5.6

サンプルソースコード

MySQL にデータを INSERT するプログラムと、それを実行するビルド定義ファイルです。

insert.py
#!/usr/bin/env python

import MySQLdb
import os

def main():
    connection = MySQLdb.connect(
        host=os.environ['DB_HOST'],
        user=os.environ['DB_USER'],
        passwd=os.environ['DB_PASSWD'],
        db=os.environ['DB_NAME'])

    cursor = connection.cursor()

    cursor.execute("insert into user_table values ('fujimoto', 30)")

    cursor.close()
    connection.commit()
    connection.close()


if __name__ == '__main__':
    main()
buildspec.yml
version: 0.2
 
phases:
  build:
    commands:
      - pip install mysqlclient
      - python insert.py

CodeBuild のビルドプロジェクト作成

ビルドプロジェクトを作成します。

ビルドプロジェクト作成画面に VPC の設定箇所が増えています。VPC、サブネット、セキュリティグループを選択します。サブネット、セキュリティグループは複数選択可能です。

環境変数に RDS for MySQL の接続先情報やユーザー情報を定義してます。

ビルド開始

ビルドを実行します。

作成したビルドプロジェクトを選択して、Start Build をクリックします。

そのまま Start Build をクリックします。

ビルド処理が開始します。ちょっと待つと成功となります。

これだと結果がよく分からないので DB の登録データを確認してみましょう。

[root@ip-172-31-60-30 ~]# mysql -h xxxxxx.xxxxxxxxxxx.us-east-1.rds.amazonaws.com -u fujimoto -p db
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 41
Server version: 5.6.37-log MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select * from user_table;
+----------+------+
| name     | age  |
+----------+------+
| fujimoto |   30 |
+----------+------+
1 row in set (0.00 sec)

プログラムで書いたデータが入っていますね。VPC のプラベートなサブネットに配置した RDS for MySQL へ問題なくアクセスできました。

まとめ

いかがでしたでしょうか?最近、Codeシリーズの嬉しいアップデートが多いです。次はもう一つのアップデートのキャッシュも試してみたいと思います。