はじめに
- LINE BOTを作成し、実行環境にHerokuを使って使用していた。
- 業務でAWSを使い始めたこともあり、実行環境をHerokuからAWSに移してみた。
- ここでは、備忘録も兼ねて、移行の際に行った一部手順についてまとめた。
- LINE BOTの作成方法や、AWSについては知っていることを前提とする。
構成図
- 今回のシステムの構成図は以下の通り。
- 以下の2箇所の構築方法について、次章以降でまとめていく。
HTTPS化
- 構成図でいうとこの部分。
- EC2上で実行しているLINE BOT実行環境(Nginxコンテナ+Flaskコンテナ)へのHTTPS通信のために、ELBをEC2の前に置くことでHTTPS化を行った。
- ドメイン作成、Route53によるドメイン登録は済んでいるものとして進める。
セキュリティーグループの作成
- EC2とELBのセキュリティーグループを作成し、各自に割り当てる。
ELB
- ELBがAWS外からの通信の受け口となるため、インバウンドルールに以下を追加してセキュリティーグループを作成する。
- 外からの通信はHTTPS通信のため、ポートは443とする。
EC2
- ELB→がEC2へのアクセスのため、インバウンドルールに以下を追加してセキュリティーグループを作成する。
- ELBとEC2間はHTTP通信のため、ポートは80とする。
- ELBのセキュリティーグループをソースに指定することで、対象のELB以外の通信は拒否することとなり、セキュリティーが高まる。
SSL証明書の発行
- AWS Certificate Managerを使用して証明書を発行。
- 作成手順については以下のサイトを参照。
https://recipe.kc-cloud.jp/archives/11084
ELBの作成
- ELBは3種類のロードバランサーをサポートしていて、今回はHTTPS通信を行うアプリケーションのため「ALB」を使用。
- 作成手順については以下のサイトを参照。
https://dev.classmethod.jp/articles/alb-backend-https/
ポイント
- 今回はHTTP通信にしたいので、リスナーは「HTTPS」「443」にすること。
- ELBからEC2へはHTTP通信でかわまないので、ターゲットグループは「HTTP」「80」にすること。
Route 53でドメイン名とELBとの関連付け
- ELB作成後は、Route 53でドメイン名とELBの関連付けを行う。
手順
- 該当のホストゾーンの「レコードの作成」から「シンプルルーティング」を選択。
- 作成したELBを選択。
- Aレコードが作成される。
Dockerイメージのビルドと格納
- 構成図でいうとこの部分。
- 簡易CI/CDを構成してみた。
- LINE BOTを動かすのに必要ではないが、実行環境のEC2でDockerコンテナを使用しているので、そのDockerイメージのために設定を行った。
構成手順
ECRでリポジトリの作成
- 作成手順については以下のサイトを参照(基本的にはDockerイメージ格納用のリポジトリを作成するだけ)
https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html
CodeBuildでビルドプロジェクトの作成
- 設定方法については以下のサイトを参照。
https://dev.classmethod.jp/articles/20170225-codebuild-docker/ - ソースプロパイダ(Dockerfileなどのソースを格納するプロバイダ)はGitHub。
- 以下、ソースプロパイダの種類によるビルド実行について(2種類しか検証できていないです・・・)
ソースプロパイダ | 挙動 |
---|---|
GitHub | Webhookの設定が可能で、「push→CodeBuild起動→ビルドの実行」が可能 |
CodeCommit | 「push→CodeBuild起動→ビルドの実行」を行うにはCodePiplineが必要 |
- ビルドを実行するための仕様や設定を書いたbuildspec.ymlを作成する必要があり、書き方のサンプルは以下を参照。
buildspec.yml
version: 0.2
phases:
install:
runtime-versions:
docker: 18
pre_build:
commands:
- echo $IMAGE_REPO_NAME
- echo $IMAGE_TAG
- echo $AWS_ACCOUNT_ID
- echo $AWS_DEFAULT_REGION
- echo Logging in to Amazon ECR...
- $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
- docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker image...
- docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
実際のCIの流れ
- DockerイメージがECRに格納されるまでの大まかな流れは以下の通り。
- Github上のリポジトリへpush(Dockerfile+buildspec.yml)
- Code Buildによるビルドの実行
- 成功するとECRにDockerイメージを格納