CodeCommitからEC2にデプロイするシンプルなパイプラインを作ってみた
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 リポジトリにサンプルコードを追加する
こちらのリンクからサンプルのコードをダウンロードします。
解凍後、先ほどクローンした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
の記入例やデプロイに必要な設定など、基本的な設定項目を学ぶことができる良いハンズオンだと感じました。ぜひこれからコードシリーズ触ってみたいという人は試してみてはいかがでしょうか。