[アップデート]AWS CodeBuild で Amazon EFS のサポートがされました!

はじめに

こんにちは、AWS事業本部のニシヤマです。はいマスキュラー。

AWS CodeBuildがAmazon EFSのサポートしました!

https://aws.amazon.com/jp/about-aws/whats-new/2020/02/aws-codebuild-adds-support-for-amazon-efs/

何が変わったのか?

今までCodeBuildでの成果物に関してはビルドプロジェクトのアーティファクトの項目で指定したS3バケットに出力してました。 今回のアップデートによりCodeBuildでEFSファイルシステムをマウントし、EFS上にソースコードの成果物を作成することが可能になりました。

前提

以下のAWS公式のチュートリアルを参照しCodeBuildの実行環境を構築しておいてください。

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/getting-started.html

以下の弊社ブログもあります。

やってみる

ではやってみます。今回のアップデートのドキュメントを参照して、今回のEFSを利用した環境を構築していきます。

EFSの作成

マネジメントコンソールのメニューでEFSを選択し、EFSのコンソールのファイルシステムの作成をクリックしてください。

ネットワークアクセスを設定するの画面で上記のCodeBuildの環境構築で作成したVPC IDを選択します。マウントターゲットの作成ではサブネットの項目でプライベートサブネットを選択し、次のステップをクリック。

今回は検証なのでファイルシステムの設定を行うはデフォルトのまま次のステップをクリック。

次のクライアントアクセスを設定でもデフォルトのまま次のステップをクリック。確認と作成で内容を確認したら、ファイルシステムの作成をクリックしてEFSを作成します。少しするとEFSの作成が完了します。この時、EFSのDNS 名をメモしておきます。

CodeBuildプロジェクトの作成

続いてCodeBuildの設定を行います。

マネジメントコンソールのメニューでCodebuidを選択し、Codebuidのコンソールのビルドプロジェクトを作成するをクリックしてください。

プロジェクトの設定の設定項目でプロジェクトの名前を入力し、前提のCodeBuildのチュートリアルでS3バケットにアップロードしたソースコードのZIPを指定します。

環境では以下を設定します。

  • 環境イメージ:マネージド型イメージ
  • オペレーティングシステム:Ubuntu
  • ランタイム:Standard
  • イメージ:aws/codebuild/standard:2.0
  • 特権付与:チェックあり

また、サービスロールでは新しいサービスロールを選択し、ロール名を入力します。

環境の追加設定を展開し、VPCの項目にCodeBuildの環境構築で作成したVPC IDを選択します。サブネットの項目では、一つ以上のプライベートサブネットを選択、セキュリティグループの項目ではアウトバウンドが許可されているセキュリティグループを選択します。

注意すべきは、ここで選択するサブネットはドキュメントに記載ある通り、プライベートサブネットを選択して下さい。パブリックサブネットを選択して実行したビルドが進まず失敗しました。

続いてビルドの仕様 (buildspec)を定義します。ビルドの仕様 (buildspec)で、ビルドコマンドの挿入を選択、エディタに切り替えをクリックします。

エディタに以下の内容を貼り付けます。こちらはドキュメントの内容とは異なりチュートリアルのビルドの仕様 (buildspec)を流用したものになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: 0.2
 
env:
  variables:
      EFS_DIR: "/efs"
      M3_HOME: ".m2"
      EFS_DNS: "fs-XXXXXXXX.efs.ap-northeast-1.amazonaws.com"
phases:
  install:
    runtime-versions:
      java: openjdk11
    commands:
      - mkdir -p $EFS_DIR
      - apt-get update && apt-get install -y nfs-common
  pre_build:
    commands:
      - mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 $EFS_DNS:/ $EFS_DIR
      - df -h
      - mkdir -p $EFS_DIR/$M3_HOME/
  build:
    commands:
      - echo Build started on `date`
      - mvn install -Dmaven.repo.local=$EFS_DIR/$M3_HOME/
  post_build:
    commands:
      - echo Build completed on `date`

実施している内容は以下になります。

  • variablesセクションでEFSのDNS名、マウントするEFSの情報を定義
  • installセクションでJavaのバージョンを指定し、`commands`でマウントポイント作成、NFSクライアントをインストール
  • pre_buildセクションでEFSをマウントし、成果物の出力先を作成
  • buildセクションでMavenでローカルリポジトリをEFSに指定してソースコードをビルド

アーティファクトはなしの状態で、ビルドプロジェクトを作成するをクリックします。

ビルドプロジェクトの作成が完了したら準備完了です。

ビルドの開始をクリックし実行しましょう。ビルドの開始画面ではそのままビルドの開始をクリックします。

ビルドが開始されましたのメッセージと共にビルドが実行されます。 ビルドの実行状況が確認したい場合は、ビルドログのテールログをクリックしてください。ログがリアルタイムで流れていきます。

少し待つとステータスが成功になりました。

ビルドログにも以下の成果物の出力先と、BUILD SUCCESSのメッセージが吐かれています。

1
2
3
4
5
6
7
8
[INFO] Installing /codebuild/output/src599883797/src/target/messageUtil-1.0.jar to /efs/.m2/org/example/messageUtil/1.0/messageUtil-1.0.jar
[INFO] Installing /codebuild/output/src599883797/src/pom.xml to /efs/.m2/org/example/messageUtil/1.0/messageUtil-1.0.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:56 min
[INFO] Finished at: 2020-02-16T03:05:48Z
[INFO] ------------------------------------------------------------------------

確認

それでは実際に成果物を確認してみます。 CodeBuild実行環境用VPCのパブリックサブネットに、EC2インスタンスを起動してEFSをマウントして確認します。

1
2
3
4
$ sudo mkdir /efs
$ sudo mount fs-XXXXXXXX.efs.ap-northeast-1.amazonaws.com:/ /efs
$ ls -a /efs
.  ..  .m2

.m2ディレクトリが作られています。

先ほどのビルドログのインフォメーションにも出力されていた/efs/.m2/org/example/messageUtil/1.0/messageUtil-1.0.jarを確認してみます。

1
2
$ ls -l /efs/.m2/org/example/messageUtil/1.0/messageUtil-1.0.jar
-rw-r--r-- 1 root root 2131  2月 16 03:05 /efs/.m2/org/example/messageUtil/1.0/messageUtil-1.0.jar

ちゃんと出来てます!

おわりに

CodeBuildのAmazon EFSのサポートを試してみました。今回はビルドの仕様 (buildspec)をマネジメントコンソールで入力しましたが、ビルドするソースコードのZIPファイルのbuildspec.ymlで定義することも可能です。また成果物に関しても、EFSに出力しつつ今まで通りアーティファクトの項目で定義したS3バケットに出力することも可能です。

今回のアップデートによりCodeBuildでの出力先の選択肢が増えました。EFSを利用してファイル共有している環境など、S3からダウンロードやデプロイすることなく成果物を利用することができそうですね。この記事がどなたかのお役に立てば幸いです。

最近のBMX

前回の記事でご紹介したSkate/BMXの最大イベント「Simple Session」ですが、時差の問題で夜10時頃から朝4時頃まで生中継で観戦しており、その日の最後のイベントBMX Parkでは日本から参戦している中村輪夢選手が優勝しました。中村輪夢選手のライディングで1位になった時もも興奮しましたが、全ライダーのライディングが終わり優勝が決まった時にもさらに興奮してから眠りにつきました。また、Womenジャンルでも大池水杜選手が2位にランクインしました。 このままの勢いで今年の東京オリンピックで、2人だけではなく世界中のライダー達が大活躍するのが楽しみです!

Well Architected 動画セミナー
PRAWSの技術支援ならクラスメソッド