CodeCommitからEC2にデプロイするシンプルなパイプラインを作ってみた

2021.07.07

Codeシリーズちょっと試してみたいなということで、CodeCommit,CodeDeploy,CodePipelineを使ったチュートリアルをやってみたブログです。ざっくり1時間もあれば終わる内容となっているので、まだ触れたことのない人はCI/CD入門としてやってみてはいかがでしょうか。

チュートリアル: シンプルなパイプラインを作成する (CodeCommit リポジトリ) - AWS CodePipeline

どんな構成なのか

CodeCommitにコードをプッシュすると、CloudWatchEventsがプッシュを検知してパイプラインを起動します。CodePipelineは次のステップで定義されたデプロイフェーズ(CodeDeploy)を起動し、EC2へのデプロイを実行するという構成になっています。

最後のステップでは一度デプロイしたコードを修正して、自動でEC2に変更がデプロイされるかを確認するチュートリアルとなっています。

やってみる

基本的には手順に従って進めるだけでEC2へデプロイできる環境を作成できます。今回実施しているリージョンは東京です。

ステップ 1: CodeCommit リポジトリを作成する

CodeCommitのコンソールからMyDemoRepoという名前でリポジトリを作成します。

右上のURLクローンのタブからHTTPSのクローンを選択して、Gitリポジトリのクローンを作成するアドレスをコピーしましょう。

ローカルの任意のディレクトリで、以下コマンドを実行してクローンします。今回はtmpという一時フォルダを作成して、その中で実行します。

$ git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/MyDemoRepo
Cloning into 'MyDemoRepo'...
warning: You appear to have cloned an empty repository.

ステップ 2: CodeCommit リポジトリにサンプルコードを追加する

こちらのリンクからサンプルのコードをダウンロードします。

SampleApp_Linux.zip

解凍後、先ほどクローンしたMyDemoRepoのフォルダ内に以下のような構成で配置します。

/tmp
   └-- MyDemoRepo
       │-- appspec.yml
       │-- index.html
       │-- LICENSE.txt
       └-- scripts
           │-- install_dependencies
           │-- start_server
           └-- stop_server

これらのファイルをCodeCommitにアップロードしていきます。CodeCommitのコンソールとGitどちらからでもアップロードできるので、今回はgitのコマンドからアップロードします。

$ cd tmp/MyDemoRepo
$ git add -A
$ git commit -m "Add sample application files"
$ git push

成功していれば、CodeCommitコンソールからアップロードされたファイルの一覧を確認できます。

ここの中身で大事なのは、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

記述方法など詳しく知りたい方はドキュメントを参照して下さい。ここでは/index.htmlのファイルをEC2の/var/www/html/配下に配置すること、hoolのセクションでいくつかのスクリプトを実行するように定義していることを確認しましょう。

EC2/オンプレミスデプロイ用の AppSpec の「hooks」セクション

ステップ 3: EC2 Linux インスタンスを作成して CodeDeploy エージェントをインストールする

手順に沿ってまずはEC2にアタッチするロールを作成します。今回私はEC2InstanceDeployRoleという名前で作成しました。

次にEC2を作成していくのですが、以下を変更するように注意しましょう。

  • 自動割り当てパブリックIPを有効にする
  • IAMロールの設定は事前に作成したロールをアタッチする
  • ユーザーデータに以下を入力しておく
#!/bin/bash
yum -y update
yum install -y ruby
yum install -y aws-cli
cd /home/ec2-user
wget https://aws-codedeploy-us-east-2.s3.us-east-2.amazonaws.com/latest/install
chmod +x ./install
./install auto

ここではEC2起動時にCodeDeployエージェントをインストールするためのコマンドを入力しています。タグの設定画面ではNameタグMyCodePipelineDemoを忘れずに設定します。(今回のデプロイ対象の判別をするためにNameタグを指定するため。)

セキュリティグループには自分のIPからHTTPを開けるように設定して作成すれば完了です。

ここで作成したEC2に対してCodeCommitでアップロードしたコードをデプロイして、index.htmlを表示していくことになります。

ステップ 4: CodeDeploy でアプリケーションを作成する

CodeDeployを実装する前に、CodeDeploy用のIAMロールを作成します。

信頼されたエンティティとしてCodeDeployを選択して、ユースケースもCodeDeployを選んで進めます。

あらかじめポリシーは設定されるので、ロール名を決めて作成しましょう。

アプリケーションの作成

アプリケーションはCodeDeployで一番最初に作成するリソースです。デプロイ対象のシステム単位で作成し、この配下にデプロイグループなどを紐づけていきます。

CodeDeploynのコンソールからアプリケーション名とデプロイ先のプラットフォームを入力するだけで作成できます。今回はEC2に対してデプロイするので、EC2/オンプレミスを選択します。

デプロイグループの作成

そのままアプリケーション内の画面へ遷移するので、デプロイグループの作成を進めましょう。

手順通りに進めていけば特に詰まるところはないはずです。ここでデプロイ単位を確認しておくと、環境設定から手順ではNameタグを指定して、該当のタグが存在しているEC2に対してデプロイを実行するように設定しています。

チュートリアルではEC2は1台のみなのでNameタグによるデプロイを行っています。複数台のEC2にまとめてデプロイを実行したい場合は、EC2に共通でデプロイ用のタグを付与する、AutoScalingグループを対象にしてデプロイするなど環境に応じて設定しましょう。

AutoScalingグループを利用したデプロイについてもチュートリアルが用意されているので、そちらも確認しておくと理解が深まります。

チュートリアル: CodeDeploy を使用して、Amazon EC2 Auto Scaling グループにアプリケーションをデプロイする - AWS CodeDeploy

CodeDeployを利用してAutoScalingグループにサンプルアプリケーションをデプロイして確認する | DevelopersIO

ステップ 5: CodePipeline で最初のパイプラインを作成する

デプロイに必要なリソースの準備ができたので、パイプラインを作成して自動化を行っていきます。パイプラインの作成する中で、ビルドのステージは必要ないためスキップして作成しましょう。これまで作成したリソースを選んでいくだけなので、手順通りに実施すれば特に難しい部分はありません。

ステップ 5: CodePipeline で最初のパイプラインを作成する

パイプラインを作成すると、その直後から動き出してCodeCommitからCodeDeployにデプロイされます。成功しましたと表示されれば問題なく構築できているはずです。

CodePipelineを作成して実行すると、実は裏でS3バケットが作成されてZipに圧縮されたファイルをアップロード、CodeDeployでファイルを取得してデプロイするという動きがされています。

そのファイルはリビジョンと呼ばれ、CodeDeployのリビジョンタブから格納されているS3を参照すると、Zipファイルに圧縮されたコードを確認できました。

デプロイ内容を確認

EC2のパブリックDNSをブラウザのアドレスバーに入力して確認してみると、以下のように表示されていれば無事にデプロイできています。

ステップ 6: CodeCommit リポジトリ内のコードを変更する

最後に先ほど表示できた画面を変更して、再度デプロイしていきます。

テキストエディタなどで、ローカルリポジトリのindex.htmlを変更して保存したものを再度CodeCommitにプッシュしてみます。CodeCommitへのプッシュによりイベントが発火されてCodePipelineがCodeDeployまで実行してくれます。再度同じパブリックDNSを確認してみると、変更内容が適用された画面を表示できました。

これで一通りのデプロイまでの流れを試すことができました。これでチュートリアル終了なので、作成したリソースの削除を忘れないようにしましょう。

まとめ

チュートリアルを通じて簡単にCodeCommit,CodeDeploy,CodePipelineを使ったデプロイ環境を構築できました。その中でもappspec.ymlの記入例やデプロイに必要な設定など、基本的な設定項目を学ぶことができる良いハンズオンだと感じました。ぜひこれからコードシリーズ触ってみたいという人は試してみてはいかがでしょうか。

参考