Goalist Developers Blog

S3とAPI GatewayとLambdaで動くHRogチャートの開発環境

f:id:suzutt:20170217000629p:plain

こんにちは、鈴木です。

弊社の開発環境はプロジェクト、サービスによってまちまちですが、今回は弊社サービス「HRogチャート」の開発環境についての話です。

HRogチャートとは、求人データを瞬時に分析するBIツールです。興味のある方は是非、下の画像をクリックしてください。

HRogチャートでは、本番環境以外に開発用の環境が2つありますが、 本記事では2の開発環境について扱っていきます。

  1. ローカル開発環境
    開発メンバーおのおの(今は自分ひとりですが)の端末に構築する開発環境です。
    ローカル開発環境で動作確認後、Githubリポジトリにプッシュします。

  2. 開発環境
    リポジトリ上の最新のコードをビルドしたものを配置している環境です。
    当たり前ですがローカル開発環境よりも本番に近いアーキテクチャなので、本番に近い状態で動作確認をします。チームメンバー間で話をするときにも使うかと思います。(今は自分ひとりですが)
    ステージング環境に近いですが、開発メンバーしか使わないのでステージング環境ではないです(と思っています)。

開発環境に最新のコードをデプロイする作業は、Jenkinsを使用して自動化しています。
目新しいことはやっていませんが、同じアーキテクチャを採用していて、これから同じことをやる方の参考になればと思います。

本番環境と開発環境

それぞれ以下のような構成になっています。

本番環境

f:id:suzutt:20170217000741p:plain

開発環境

f:id:suzutt:20170217000944p:plain

開発環境は本番環境と比べて、主に以下の点で異なります。

  • Amazon CloudFrontを使用せず、直接S3で静的ウェブサイトのホスティングをしている(IAMでIP制限を掛けています)
  • API Gateway のURLが異なる
  • API Gateway のAPIキーが異なる
  • API Gatewayから呼び出すLambdaファンクションが異なる

開発環境自動デプロイでは、ざっくりいうとJenkinsでリポジトリをポーリングし、リポジトリが更新されていた場合、S3、Lambda上にプログラムを自動ビルド、デプロイを行い、開発環境を最新化してます。

使用ツール

開発環境自動デプロイには、以下のツールを使用しています。

  • Gradle 3.3
  • Jenkins 2.7.4
  • AWS CLI

ビルド・デプロイ手順

API GatewayのURL、APIキーの変更

デプロイ前に下記の情報を開発環境用に設定します。

  • API Gateway のURL
  • API Gateway のAPIキー

フロントエンドのプログラムをS3へデプロイ

AWS CLI を使って対象のバケットをクリーンした後に、JenkinsのS3 Plugin(0.10.11)を利用してS3へデプロイしています。

S3 Plugin - Jenkins - Jenkins Wiki

設定を抜粋します。

ビルド - シェルの実行

aws s3 rm s3://${バケット名} --recursive

ビルド後の処理 - Publish artifacts to S3 Bucket

項目
Source build/libs/*.jar
Destination bucket ${バケット名}
Bucket Region ${リージョン名}

AWS Lambdaへのデプロイ

Gradleでビルド後に、S3 PluginでS3にデプロイ後、JenkinsのAWS Lambda Plugin(0.5.8)を利用し、Lambdaへデプロイしています。

AWS Lambda Plugin - Jenkins - Jenkins Wiki

こちらも設定を抜粋します。

ビルド - Invoke Gradle script

項目
Tasks build

ビルド後の処理 - Publish artifacts to S3 Bucket

項目
Source build/libs/*.jar
Destination bucket ${バケット名}
Bucket Region ${リージョン名}

ビルド後の処理 - AWS Lambda deployment

AWSコンソールから登録するときと同様、以下の例のように値を入力します。

項目
AWS Region ${リージョン名}
Function Name Lambda
Role ${Lambdaファンクションに割り当てるロール}
Artifact Location ${対象のjarファイルのS3上のパス}
Handler Name ${Lambdaファンクションのハンドラ名 }
Memory Size 1024
Timeout 180
Runtime java8

まとめ

開発環境があることで、常に最新のコードで動く環境で動作確認できるという安心感が得られてたということが大きいです。あとは開発メンバーが増えた時に効いてくるのかなと思っています。

ただ、ジョブが複雑になってくるとJenkinsだと管理が大変になるので、その際は別のCIサービスを使おうかなと考えています。

それでは。