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

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/

コメントでご指摘をいただき、アップデートの内容が間違っていたため修正いたしました。今回のAWS CodeBuildがAmazon EFSのサポートに関しては、CodeBuildのEFSマウントの際にbuildspec.ymlにmountコマンドの記述が不要になったアップデートになります

何が変わったのか?

今までCodeBuildでEFSを利用する際は、buildspec.yml内でmountコマンドを定義する必要がありました。今回のアップデートによりbuildspec.yml内ではなく、CodeBuildのビルドプロジェクトでEFSのマウントの定義が実施可能になりました!

前提

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

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

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

チュートリアルを通してCodeBuildを理解する #reinvent

やってみる

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

EFSの作成

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

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

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

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

CodeBuildプロジェクトの作成

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

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

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

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

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

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

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

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

つぎにファイルシステムの項目でマウントするEFSの情報を入力します。

  • 識別子:任意のEFSの識別名
  • ID:EFSのファイルシステムID
  • ディレクトリパス - オプショナル:空欄
  • マウントポイント:/mount
  • マウントオプション - オプショナル:空欄

この時入力した識別子は、後ほど必要になりますのでメモしておいてください。

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

今まで

今までは以下のようにbuildspec.yml内でEFSのDNS名の指定や、マウントポイントの作成、mountコマンドでEFSをマウントする記述が必要でした。

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`

これから

今回のアップデートにより以下のようにbuildspec.yml内でmountコマンドを書く必要がなくなり、実施したいbuild関連の処理だけを記述することができるようになりシンプルになりました!

version: 0.2
phases:
  install:
    runtime-versions:
      java: corretto11    
  build:
    commands:
      - mvn install -Dmaven.repo.local=$CODEBUILD_EFS_1

この際にEFSをファイルシステムの項目で入力した識別子にCODEBUILD_を付けた大文字の環境変数で指定が可能です。今回、識別子をEFS_1にしているので環境変数はCODEBUILD_EFS_1になります。

ビルド実行前後のタイムスタンプも取得するように追記してエディタに以下の内容を貼り付けます。

version: 0.2
phases:
  install:
    runtime-versions:
      java: corretto11    
  build:
    commands:
      - echo Build started on `date`
      - mvn install -Dmaven.repo.local=$CODEBUILD_EFS_1
  post_build:
    commands:
      - echo Build completed on `date`

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

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

注意点

新規にビルドプロジェクトを作る際に、サービスロールで新しいサービスロールを選択するとビルドプロジェクト名から自動的にIAMロールが生成されます。そのまま他の入力項目に不備がある状態でビルドプロジェクトを作成するをクリックするとIAMロールとIAMポリシーが先に作成されるようです。 そのため、入力項目の不備を修正し、再度ビルドプロジェクトを作成するをクリックすると以下のエラーで作成出来ませんでした。

その場合は、サービスロールで既存のサービスロールを選択し作成されたIAMロールのARNを入力するか、一旦IAMロールとIAMポリシーを削除してからビルドプロジェクトを作成してみて下さい。

ビルド

ビルドプロジェクトの詳細でビルドの開始をクリックし実行しましょう。ビルドの開始画面ではそのままビルドの開始をクリックします。

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

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

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

[INFO] Installing /codebuild/output/src558689199/src/target/messageUtil-1.0.jar to /mount/org/example/messageUtil/1.0/messageUtil-1.0.jar
[INFO] Installing /codebuild/output/src558689199/src/pom.xml to /mount/org/example/messageUtil/1.0/messageUtil-1.0.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:52 min
[INFO] Finished at: 2020-02-19T09:40:18Z
[INFO] ------------------------------------------------------------------------

確認

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

$ sudo mkdir /efs
$ sudo mount fs-XXXXXXXX.efs.ap-northeast-1.amazonaws.com:/ /efs
$ ls -1 /efs
backport-util-concurrent
classworlds
com
commons-cli
commons-io
commons-lang
junit
org

ディレクトリが作られています!

ビルドログの/mount部分を置き換えて成果物を確認してみます。

$ ls -l /efs/org/example/messageUtil/1.0/messageUtil-1.0.jar
-rw-r--r-- 1 root root 2129  2月 19 09:40 /efs/org/example/messageUtil/1.0/messageUtil-1.0.jar
$ ls -l /efs/org/example/messageUtil/1.0/messageUtil-1.0.pom
-rw-r--r-- 1 root root 849  2月 11 22:00 /efs/org/example/messageUtil/1.0/messageUtil-1.0.pom

ちゃんと出来てます!

おわりに

CodeBuildのAmazon EFSのサポートを試してみました。以前からbuildspec.ymlでmountコマンドを記述することでEFSをマウントは可能でしたが、今回のアップデートでビルド処理とは直接関係の無い処理をbuildspec.ymlに書く必要がなくなりとても見やすくなりましたね。この記事がどなたかのお役に立てば幸いです。

最近のBMX

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