Help us understand the problem. What is going on with this article?

AWSを使ったLINE BOTの開発(おまけで簡易CI/CDも)

はじめに

  • LINE BOTを作成し、実行環境にHerokuを使って使用していた。
  • 業務でAWSを使い始めたこともあり、実行環境をHerokuからAWSに移してみた。
  • ここでは、備忘録も兼ねて、移行の際に行った一部手順についてまとめた。
  • LINE BOTの作成方法や、AWSについては知っていることを前提とする。

構成図

  • 今回のシステムの構成図は以下の通り。

ORION.png

  • 以下の2箇所の構築方法について、次章以降でまとめていく。

ORION3.png

HTTPS化

  • 構成図でいうとこの部分。
  • EC2上で実行しているLINE BOT実行環境(Nginxコンテナ+Flaskコンテナ)へのHTTPS通信のために、ELBをEC2の前に置くことでHTTPS化を行った。
  • ドメイン作成、Route53によるドメイン登録は済んでいるものとして進める。

ORION1.png

セキュリティーグループの作成

  • EC2とELBのセキュリティーグループを作成し、各自に割り当てる。

ELB

  • ELBがAWS外からの通信の受け口となるため、インバウンドルールに以下を追加してセキュリティーグループを作成する。
  • 外からの通信はHTTPS通信のため、ポートは443とする。

sg-1.png

EC2

  • ELB→がEC2へのアクセスのため、インバウンドルールに以下を追加してセキュリティーグループを作成する。
  • ELBとEC2間はHTTP通信のため、ポートは80とする。
  • ELBのセキュリティーグループをソースに指定することで、対象のELB以外の通信は拒否することとなり、セキュリティーが高まる。

sg-2.png

SSL証明書の発行

ELBの作成

ポイント

  • 今回はHTTP通信にしたいので、リスナーは「HTTPS」「443」にすること。

elb1-2.png

  • ELBからEC2へはHTTP通信でかわまないので、ターゲットグループは「HTTP」「80」にすること。

elb5.png

Route 53でドメイン名とELBとの関連付け

  • ELB作成後は、Route 53でドメイン名とELBの関連付けを行う。

手順

  • 該当のホストゾーンの「レコードの作成」から「シンプルルーティング」を選択。

route1.png

  • 作成したELBを選択。

route2.png

  • Aレコードが作成される。

route3.png

Dockerイメージのビルドと格納

  • 構成図でいうとこの部分。
  • 簡易CI/CDを構成してみた。
  • LINE BOTを動かすのに必要ではないが、実行環境のEC2でDockerコンテナを使用しているので、そのDockerイメージのために設定を行った。

ORION2.png

構成手順

ECRでリポジトリの作成

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/CDの流れ

  • DockerイメージがECRに格納されるまでの大まかな流れは以下の通り。
    • Github上のリポジトリへpush(Dockerfile+buildspec.yml)
    • Code Buildによるビルドの実行
    • 成功するとECRにDockerイメージを格納
subretu
SE風味の会社員です( ˘ω˘ ) コロ助作れません( ˘ω˘ )
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした