[アップデート]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
以下の弊社ブログもあります。
やってみる
ではやってみます。今回のアップデートのドキュメントを参照して、今回の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人だけではなく世界中のライダー達が大活躍するのが楽しみです!