6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

CodeBuild+CodeDeploy+CodePipelineでEC2に自動デプロイしてみた

Last updated at Posted at 2020-10-18

やってみたこと概要

image.png

  1. githubリポジトリが更新されるとパイプラインのSourceが実行される
    • デプロイするソース:vue-chat
    • Sourceの成果物はS3の「codepipeline-ap-northeast-1-…」バゲット
      vue-chat/SourceArtiに出力
  2. vue-chat/SourceArtiに出力されたソースをCodeBuildがビルド
    • 同バゲットvue-chat/BuildArtifにビルド済みソースを出力
  3. vue-chat/BuildArtifのビルド済みソースをCodeDeployが受け取りEC2に配置
  4. 配置されたソース内のappspec.ymlの内容が実行されてデプロイ完了

CodeBuild

AWSマネジメントコンソールでCodeBuildを選択しビルドプロジェクトを作成

githubのvue-chatリポジトリをビルドする設定

Buildspec

Buildspecは「ビルドコマンドの挿入」を選択し、以下のコマンドを記述

version: 0.2

phases:
  install:
    runtime-versions:
      nodejs: 10
  pre_build:
    commands:
      - npm update -g npm
      - npm install
  build:
    commands:
      - npm run build
artifacts:
  files:
    - '**/*'
  • phases
    • ビルド工程を記述する宣言
  • install
    • ビルド環境を宣言
  • pre_build
    • node.jsをCodeBuildのビルド環境にインストール
  • build
    • npmビルド実行
  • artifacts
    • ビルドしたソースを出力する宣言
  • files
    • 出力するソース('**/*'はソース一式 本来は'dist/*'が良さそう)

CodeBuildびアーティファクトの設定はマネジメントコンソールからもできるが
「セマンスティックバージョニングの有効化」にチェックをつけると
上記のBuildspecの内容が優先される
スクリーンショット 2020-10-18 22.20.21.png

IAMロール(CodeBuild)

CodeBuildのサービスロールに「AmazonS3OutpostsReadOnlyAccess」を追加して
ビルド済みソースをS3にアップロードできるようにする
スクリーンショット 2020-10-18 20.50.08.png

サービスロールはCodeBuild-ビルドプロジェクト-環境に記載されている
スクリーンショット 2021-12-20 0.20.22.png

ログ(CodeBuild)

CodeBuildのビルド実行ログはS3に出力するようにした
スクリーンショット 2020-10-18 22.24.24.png

CodeBuildでビルド実行するとS3には圧縮されたログファイルが出力される
スクリーンショット 2020-10-18 22.25.24.png

デプロイするEC2を作成

AmazonLinux2でEC2インスタンスを作成
スクリーンショット 2020-10-18 21.34.27.png

IAMロール(EC2)

CodeBuildがS3に出力したビルド済みソースをEC2に配置するために「AmazonS3ReadOnlyAccess」を設定
スクリーンショット 2020-10-18 21.39.29.png

CodeDeploy Agentインストール

CodeDeployからEC2にデプロイができるようにEC2にagentライブラリをインストール
下記コマンドはEC2デプロイのためにCodeDeployを導入するから引用しています

# ec2-userで実行
$ sudo yum update
$ sudo yum install ruby
$ sudo yum install aws-cli
$ cd /home/ec2-user
$ aws s3 cp s3://aws-codedeploy-ap-northeast-1/latest/install . --region ap-northeast-1
$ chmod +x ./install
$ sudo ./install auto
$ sudo service codedeploy-agent status

アプリケーション起動に必要なライブラリをインストール

今回はVue.jsプロジェクトを起動するのでvue-cliをEC2にインストール

$ npm install -g @vue/cli

CodeDeploy

デプロイプロジェクトを作成
スクリーンショット 2021-12-20 0.21.53.png

IAMロール(CodeDeploy)

CodeDeployのサービスロールは
CodeBuildで出力したビルド済みソースを受け取るため「AmazonS3ReadOnlyAccess」と
EC2にソースを配置するため「AmazonEC2FullAccess」を設定
(AmazonEC2RoleforAWSCodeDeployだとPermissionErrorになってしまった)

スクリーンショット 2020-10-18 21.25.25.png

githubプロジェクトにデプロイ設定

CodeDeployでデプロイするためにプロジェクトにデプロイ工程を記述したファイルを作成
スクリーンショット 2020-10-18 22.05.24.png

appspec.yml

デプロイするプロジェクトのルートディレクトリにappspec.ymlを作成

appspec.yml

version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html
hooks:
  ApplicationStart:
    - location: /scripts/codedeploy_start.sh
      timeout: 180
  • files.destination
    • S3のソースを配置する場所
  • ApplicationStart.location
    • アプリケーション配置後の処理を記述したshファイルを指定

アプリケーション起動shファイル

appspec.ymlで指定した「codedeploy_start.sh」を作成する
npmコマンドでVue.jsアプリケーションを実行するだけ

codedeploy_start.sh
#!/bin/bash

npm run serve

CodePipeline

上記で作成・設定した内容でパイプラインを作成
スクリーンショット 2020-10-18 22.18.03.png

パイプライン実行

これでリポジトリに変更をプッシュするだけでデプロイできちゃうのか(゚▽゚)ワクワク

しかし、現実は

CodeDeployが失敗。。。
スクリーンショット 2020-10-19 0.05.36.png

エラーを見てみるとnpm run serveした時にpackage.jsonが見つからなかった模様
スクリーンショット 2020-10-19 0.06.27.png

appspec.ymlからcodedeploy_start.shを実行した時のカレントディレクトリは/なので
codedeploy_start.shでcd 配置したソースのディレクトリを記述する必要がある

配置したソースのディレクトリにはパイプライン実行毎に振られるランダムなIDが含まれているのでどのように記述すれば良いか調査中
(配置ディレクトリ例:/opt/codedeploy-agent/deployment-root/3ee0a546-27db-4534-a055-098b9173f625/d-4ARZ3L0Q6/deployment-archive/vue-chat

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?