AWS

AWS CodePipeline で EC2インスタンスに自動でデプロイする方法と注意点

・CodePipelineサービスを用いてEC2インスタンスにデプロイ方法の紹介
・デプロイに必要な関連サービスと設定ファイルも簡単に記載

Ruby on Railsを学習して物が出来上がったあと、Herokuにデプロイする方法は腰が重くそれならAWSのサービスで代替可能か、あとはCI/CDにも興味があるためCodePipelineにたどり着いた次第です。

今回はAWSが用意したCodePipelineのチュートリアルを読みつつ、ちゃんと理解した方が良い部分などをアウトプットしたいと考えています。
Ruby on Railsアプリケーションのデプロイは後日紹介する予定です。

CodePipelineチュートリアルを進める前の紹介

AWSチュートリアル

チュートリアルは下記リンクとなります。

https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/tutorials-simple-codecommit.html

構成図

構成図

構成図にも記載ある通り、CodePipelineの中には「CodeCommit」、「CodeBuild」、「CodeDeploy」の3つを組み合わせて、「CodePipeline」でCI/CDを実現します。
ただし、ソースコードをリポジトリにコミットして、コミットしたソースコードをEC2インスタンスに設置する場合のみでしたら 「CodeCommit」、「CodeDeploy」 のみで充足します。

JavaとかKotlinのようにビルドが必要なものは「CodeBuild」を使わざるを得ないです。

チュートリアルでは単純なHTMLの設置とapacheサーバの導入をしているだけですので 「CodeBuild」 は利用していません。

CodeCommitにリポジトリを作成する

これ以降はチュートリアルの順番に沿って紹介となります。

まずはCodeCommitでリポジトリを作成します。作成したリポジトリにgitコマンドでプッシュするようです。

基本的にはここにソースコードが格納されるのですが、後続に行う「CodeDeploy」で使う設定ファイルも一緒に格納する必要があります。

チュートリアルに用意されているサンプルコードだと下記コード体系になります。
★マーク部分が 「CodeDeploy」 で使うファイルです。
ファイルの中身は 「CodeDeploy」 の項で簡単にですが紹介しています。

 MyDemoRepo(リポジトリ)
│-- appspec.yml★
│-- index.html
│-- LICENSE.txt
└-- scripts★
    │-- install_dependencies★
    │-- start_server★
    └-- stop_server★

デプロイ先のEC2インスタンスにCodeDeployエージェントをインストール

「CodeDeploy」 のデプロイメント作業に必要なソフトウェアをEC2にインストールします。

チュートリアルではSSH接続は考慮していないためEC2の設定に自信が無い場合はSSHキーペアを使わないインスタンスを新規作成する方が良いと思います。

CodeDeploy にアプリケーションを作成

CodeDeployにデプロイ先インスタンス、デプロイ設定などを設定するアプリケーションを作成します。

デプロイ先インスタンスはタグで設定するためEC2にタグを設定した方が良いです。

デプロイ設定はチュートリアルでは1つのインスタンスに反映できる既存のを設定します。

CodePipeline にCodeCommitとCodeDeployを設定

CodeCommitとCodeDeployの設定が終わればあとはCodePipelineにそれが動くように設定するのみです。

ソースステージではCodeCommitを
デプロイステージではCodeDeployを設定します。

CodePipelineを作成したらそのまま実行されます。

デプロイステージの動きとしては、サンプルコードにもある「appspec.yml」が実行されます。

version: 0.0
os: linux
files:
  - source: /index.html
    destination: /var/www/html/
hooks:
  BeforeInstall:
    - location: scripts/install_dependencies
      timeout: 300
      runas: root
    - location: scripts/start_server
      timeout: 300
      runas: root
  ApplicationStop:
    - location: scripts/stop_server
      timeout: 300
      runas: root

4行目がソースステージで選択したリポジトリのファイルを設定して移動先を5行目で設定しています。
6行目以降の処理はデプロイステージで定義しているイベントで行う処理を記載しています。

サンプルコードでは、ApplicationStopイベントでapacheの停止、BeforeInstallイベントでapacheインストールと実行を行っています。

他詳細については下記サイト様が役立ちました。

https://dev.classmethod.jp/articles/code-deploy-appspec/

CodePipeline実行エラーが出た場合

CodePipeline の初回実行時下記のエラーが発生しました。

Make sure the encryption key is available, and then try again.
Error:The KMS default master key for CodeCommit ‘alias/aws/codecommit’ is unavailable in your account

特に何もせず、時間をおいて再度実行したら成功しましたので表示された方は気をつけていただければと思います。

参考にしたサイト様

https://brownmorning.net/it/homepage/step05/

最後に

以上でCodePipelineのチュートリアル説明終了となります。
チュートリアルでは初回正常終了後、ソースコードを変更してプッシュしたあとに自動でCodePipelineが動くことも確認しています。

CI/CD的な環境を望む場合は非常に便利ですが、デプロイ用の設定ファイルをリポジトリ直下に用意する必要があります。
個人的にはDockerやVSCode Remote Developmentの設定もあるため混乱する恐れがあるのでディレクトリ分けが出来れば良いなぁと思いました。