AWSでEC2等のサービスを容易にデプロイできるCodeDeployとは?

はじめに

2023年現在、スタートアップやベンチャー企業はもちろん、大企業においてもサービスの運用をオンプレミスからクラウドサービスへ移行する動きが出てきています。「クラウドファースト」という言葉も提唱される程で、企業だけではなく政府が利用するシステムにおいても第一の選択肢としてクラウドを利用することが推奨されています。「クラウド」と言う言葉が一般的に使われるようになったのは2010年前後ですが、当時はシステムの構築・運用にクラウドが利用されることは限定的で確立されていませんでした。しかし、その後AmazonのAWS(Amazon Web Services)、MicrsoftのMicrsoft Azure、GoogleのGCP(Google Cloud Platform)と名だたる企業が立て続けにクラウドサービスをリリースし、ネットワークの高速化やセキュリティ等の技術の進歩も相まって幅広く利用されるようになりました。

この記事では、AWSの便利なサービスの一つである「CodeDeploy」について紹介していきます。すでにクラウドエンジニア・インフラエンジニア・プログラマーとして働いており、これからAWSについて学びたいと考えている方、システムがAWSに切り替わってデプロイの仕方がわからないという方、CodeDeployを使ったデプロイの方法を知りたいと思っている方はぜひご覧ください。

AWSのサービスについておさらい

AWSには様々なサービスがありますが、中でもCodeDeployとも関連性が深い代表的なサービス「Amazon EC2」「AWS Fargate」「AWS Lambda」について紹介しておきます。

Amazon EC2は「Amazon Elastic Compute Cloud」の略で、AWSのリリース初期から継続して提供され続けている基本的な仮想サーバーサービスです。500以上のインスタンスやストレージ、ネットワーク、OSから開発するシステムに見合ったものを選択し、環境構築をすることが可能です。なお、クラウドサービスであるため環境構築といってもエンジニアによる実際の作業は必要とせず、基本的には画面上で必要なサービスを選択したら後はAWSに任せて待つだけとなります。

クラウドサービスの柔軟な拡張性が可能というメリットを生かしたオートスケーリングに対応している点も大きな特徴です。スケーリングとは、インスタンス(仮想サーバーの実態)の増減のことを表しますが、AWSでは必要に応じて自動でスケーリングすることが可能です。オンプレミス環境であれば日頃の監視データをエンジニアが確認し、判断を下した上で物理的にサーバーや設置するスペースを用意して環境構築や設定を行うという作業が発生しますが、EC2ではこれらの作業が不要となるため、大幅な工数やコストの削減が可能です。

セキュリティの部分に関しても、仮想のファイヤーウォール(セキュリティグループ)が用意されており、インスタンス上で行われる通信の制御が可能となっています。サーバーへのログインに関しては公開鍵暗号方式が推奨されており、公開鍵と暗号鍵の組み合わせによるセキュアなログイン管理が可能となっています。

また、データ処理や複雑な計算を高速で処理できるHPC(ハイパフォーマンスコンピューティング)や機械学習のトレーニングといった近年技術の進歩が著しい分野のシステム開発にも対応している他、AppleやWindowsといったプラットフォーム向けの開発環境もそれぞれに用意されているので、クラウドサービスの利用に迷ったらEC2を選択すれば間違いないと言っても良い程、実現できるサービスが豊富です。

続くAWS Fargate、AWS Lambdaですが、この2つはいずれもコンテナをサーバーレスで実行できるようにする機能です。この説明だけだとイメージが付きづらいかもしれませんが、クラウドのサービス形態におけるいわゆるSaaS(Software as a Service)、FaaS(Function as a Service)のことで、サーバー環境について意識することなくアプリケーションやサービスの提供が可能となる仕組みです。このことを「サーバーレス」と表現し、通常はインフラエンジニア等が担当するサーバーの運用・監視やメンテナンス、障害対応が不要となるため、その分システム開発に専念できるというメリットがあります。

その中でもAWS Fargateの特徴としては、料金がワークロードの使用量による従量課金制、自動スケーリングが可能、VPCネットワーキング、ELB、IAM、Cloud Watchといったその他AWSサービスとの連携が可能、オーバープロビジョニングやサーバー追加による料金が発生しないといった点が挙げられます。

一方のAWS Lambdaは、コードを記述すると容易にAWS上での実行が可能なサービスで、AWS上の様々なイベントをトリガーとして自動でコードを実行させることも可能となっています。処理に必要となるメモリ量の設定が可能ですが、コード実行時の実行時間やタイムアウトの時間、関数の呼び出し可能数等に制約があるため、利用の際は仕様を詳しく把握しておく必要があります。なお、課金はコードが実行されていない間には発生しないという仕組みになっています。

「デプロイ」とは何を指しているか?

システム開発においてデプロイという言葉は頻繁に使われるため、すでにエンジニアとして業務をしている場合は理解に困ることはないと思われますが、これから目指す方の中には具体的に何を指しているかがわからないということもあるでしょう。そのため、今回の内容を理解しやすくするためにも今一度デプロイについて解説しておきます。

デプロイ(deploy)を調べると日本語で「展開する、配置する」という意味が出てくることでしょう。システム開発においてデプロイと言った場合は、実行ファイルをサーバーに配置して実行できる状態に展開することを表します。開発を行う際は開発環境の他、テスト用の環境、本番環境をそれぞれ準備することがほとんどですが、テスト環境や本番環境に実行ファイルを配置することをデプロイと言います。

当然ながらデプロイが完了しないとその環境を使っての作業が行えないため、開発をオンスケジュールで行うためにも極力デプロイには時間をかけずスムーズに行いたいものです。そのため事前のデータチェックやシンプルな構成、ファイルの設置を心がけなければなりません。それでも失敗することは否めないため、失敗した場合に作業の中断が行える状況、ロールバックが行える状況を事前に確保しておくことが必要です。AWS上でこれらのデプロイ作業を代わりに実行してくれるのが、今回紹介するCodeDeployです。

デプロイにおいて同時に使われることの多い言葉として「インストール」「アクティベート」「ビルド」「リリース(ローンチ)」という言葉があります。インストールは「スマートフォンにアプリをインストール」と言うように、端末にソフトウェアやアプリを配置して展開することを表します。アクティベートは、インストールしたものを実際に利用できる状態へと起動することを表します。

ビルドはプログラミングが完了したコード群をコンピュータが実行できる状態へ変換し、それらデータを組み合わせて実行できる状態にすることです。コンピュータが理解できる言語へ変換することは「コンパイル」と呼びますが、さらに実行できる状態へ調整することも含めるとビルドと呼ばれるようになります。リリースも一般的になっている言葉で「サービスをリリースします」というように使われ、商品やサービスの提供開始を表します。なお、IT業界ではリリースではなくローンチと表現することも多く同義で使われますが、ローンチという言葉はサービスの提供開始だけではなく、新たな分野への新規参入やプロジェクトの立ち上げにおいても使われることがあります。

デプロイの手法

デプロイには様々な手法があり、今回取り上げるCodeDeployとも関連する部分があるため簡単に紹介しておきます。

一つ目は「ブルーグリーンデプロイメント」です。既存システムをブルー、新たに構築するシステムをグリーンとし、グリーンへの移行中にブルーの環境で運用し続けることを可能とする手法です。ブルーのデータはそのまま残っているため、グリーンの方に何らかの不具合があるためブルーに切り戻すということも可能です。デメリットとしては2環境を同時に存在させられるだけのリソースが必要という点が挙げられます。

二つ目は「イミュータブルデプロイメント」です。ブルーグリーンデプロイメントに似ていますが、こちらの場合は、グリーン環境に問題ないことがわかるとブルー環境は自動的に削除されるという特徴を持っています。そのためブルーグリーンデプロイメントに比べるとリソースを削減できる一方、万が一切り替え後に不具合が発生した場合にすぐにロールバックできないというデメリットがあります。

三つ目は「シンボリックデプロイメント」です。こちらは上記2つとは異なり、サーバー環境は1つのみとなります。サーバーはひとつであるものの、仮想環境の中で既存システム環境、新システム環境の両方を存在させた状態でデプロイを実施するというのがシンボリックデプロイメントです。そのためサーバーにかけるコストを削減できますが、複数環境を運用できるだけのリソースを確保しておく必要があること、どちらかの環境に不具合が発生した場合にもう一方の環境も影響を受ける可能性があることを頭に入れておく必要があります。デプロイ後は、シンボリックリンクを使って新システムへ移行します。

四つ目は「ローリングデプロイメント」ですが、こちらはサーバーへの負荷を軽減する目的、あるいは一部機能を稼働させたままデプロイしたい場合に採られることが多い手法で、システムのデータを複数のサーバーに分割して配置し、一つずつデプロイを進めることとなります。一つずつ進めるため、一部機能は稼働したままでの作業が可能になるといった仕組みです。便利な方法ではありますが、複数のサーバーにデータを分割されているため、途中でエンジニアの引き継ぎ等が発生する場合に作業進捗の認識に誤りがあって、古いデータをデプロイし直してしまうというようなことが発生しないよう、十分に進捗管理をしておく必要があります。

CodeDeployについて

CodeDeployは、ビルドされたアプリケーションをAmazon EC2、AWS Fargate、AWS Lambda、さらにはオンプレミス環境に対して自動でデプロイさせることが可能なフルマネージドサービス(サーバーの管理自体は代行してもらえるサービス)です。自動で行うため通常エンジニアが費やすデプロイへの工数を削減できるだけではなく、人為的な作業ミスを防ぎ、開発を効率的に進める手助けとなります。

AWSの公式サイトでも紹介されていますが、CodeDeployの特徴を掴むにはそのメリットを把握するのが早いため、3つのメリットについて紹介します。

一つ目のメリットは、自動でデプロイができるという点ですが、一度自動化すると様々な環境に対して繰り返しデプロイが可能となります。また、例えばAmazonEC2へデプロイする場合においては、AWS Auto Scalingと連携することでアプリケーションの稼働状況をモニタリングし、必要に応じて自動的に容量を調整することも可能です。これらのことは、もちろんオンプレミス環境へのデプロイにおいても言えます。

二つ目はダウンタイムの削減です。CodeDeployでは、「デプロイの手法」の項目で紹介した「ブルーグリーンデプロイメント」が可能です。そのため旧環境を稼働させたままデプロイを進めることが可能となり、ダウンタイムを発生させません。EC2への更新を行う際にその更新を段階的に実施して一部機能が利用可能なまま実施するといったこともできます。またデプロイ状況のモニタリングも行えるため、頻繁に失敗を繰り返す場合は途中でデプロイを中止することも可能です。ロールバック機能もあるため、停止するだけではなく以前のバージョンを再デプロイして切り戻すことも可能という可用性も備えています。

三つ目は一元管理(バージョン管理)機能です。AWSコンソールマネジメント、AWSコマンドラインインターフェース、SDKといった機能を合わせて利用することでデプロイの開始から完了までの様子をモニタリングし、問題点を早い段階で見つけられるようになります。また、デプロイグループの機能があり、これを利用することで複数環境へのアプリケーションへのデプロイが可能となります。さらには、バージョン管理システムのようにデプロイ履歴が保存されて確認ができるようになっているため、どのバージョンがデプロイされているか、どのバージョンが不具合の原因になっているか、どの時点のものに戻せば良いか等の確認が可能となります。

以上が大きなメリットとなりますが、その他にもデプロイ中の情報を素早く確認可能な通知機能がある点や、言語やアーキテクチャに依存しないため導入しやすい点、オプションが豊富である点、CodeDeployのAPIによって様々なソフトウェア配信ツールと連携したデプロイが可能といったメリットも持ち合わせています。

CodeDeployの利用方法

それでは、最後にCodeDeployを使ってEC2のインスタンスへデプロイする方法について紹介します。今回は初級編として全体の流れが把握しやすいように解説するため、細かい部分は省く場合もあることをご了承ください。

事前準備としては、デプロイを行うに当たってEC2のインスタンスの用意はもちろん、今回はGitHubをアプリケーションのアップロード先として利用するためGitHubのアカウントを作成し、gitコマンド、aws-cli(コマンドラインインターフェース)が利用できるようにしておきましょう。なおEC2においては、IAM(Identity and Access Management)ロールのアタッチ、ssh・httpといったプロトコルでのアクセスが可能な状態にしておく必要もあります。

まずは、GitHubでアップロード可能な状態となるようにリポジトリを作成して初期コミットを行っておきましょう。作成したアカウントでGitHubへログインし、パブリックのリポジトリを新規作成してください。続いて、コマンドラインで作業用のディレクトリを作成してそのディレクトリに移動したら、「touch README.md」でREADMEを作成します。その後「git init」を実行し、「git add README.md」でREADMEを追加します。次にコミットを「git commit 」で実施したら、「git remote add」でリモートリポジトリを追加し、「git push」でそのリモートリポジトリにプッシュを行います。これでリポジトリの準備は完了となるので、デプロイしたいアプリケーションをリポジトリへアップロードしましょう。もしGitHubの操作方法がわからない場合は、あらかじめGitHubの学習をしておくことをおすすめします。

なお、CodeDeployではデプロイの仕様書のような役割を持つ「appspec.yml」というファイルが必要になります。すでに用意されている場合にはそれをそのまま利用できますが、ない場合はAWS公式ドキュメント「AWS CodeDeploy」のユーザーガイド内にある「AppSpec ファイル例」のページに掲載されている書き方を参考に作成しましょう。

続いてEC2のインスタンスへCodeDeployAgentをインストールします。まずは「sudo yum install ruby」「sudo yum install wget」でRubyとパッケージをインストールしましょう。これらがインストールできたら実際にCodeDeployAgentをダウンロード・インストールすることになるため、希望のリージョンのものをダウンロードしてください。リージョンについてはAWSのユーザーガイド内「CodeDeploy リソースキットのリファレンス」に詳細が記載されています。ダウンロードが完了したら実行権限を付与しつつインストールを開始してください。インストール後に「udo service codedeploy-agent status」を実行することでエージェントの起動有無を確認できます。

次はCodeDeploy上でのサービスロール作成となります。「vim trust-policy.json」で任意のポリシーを作成し、サービスロールを作成します。サービスロールを作成したら、忘れずにポリシーをアタッチしましょう。

ここまで完了したら、CodeDeploy上でのアプリケーション作成、デプロイを行うことになります。「aws deploy create-application –application-name (アプリケーション名)」でアプリケーションの作成ができたら、デプロイグループの作成に移ります。デプロイグループ作成の詳細については省略しますが、ここでデプロイ処理を行う対象が指定できるようになります。その後、GitHubと連携する設定を行ったうえでデプロイの作成をします。GitHubへの接続ができる状態になると「Authorize AWS CodeDeployという画面が表示されるので、「Authorize aws-codesuite 」をクリックします。「O Authリクエストを処理してます」と表示されるので「確認」をクリックします。リポジトリ名、コミットIDが表示されるので「デプロイの作成」をクリックして完了を待ちます。開始直後の「ステータス」は「進行中」となっていますが、ここが「成功」になればデプロイ完了となります。一度デプロイが成功したらGitHubとの連携ができたことになるため、今後はコマンドのみで実行が可能となります。

まとめ

AWSのCodeDeployは慣れるまでには時間がかかるものの、自動でのデプロイが可能、デプロイ時のダウンタイムを最低限に留めることが可能、オンプレミスへのデプロイも可能、臨機応変にデプロイの停止やロールバックが可能、バージョン管理も可能といった多くのメリットがあることがわかっていただけたことでしょう。

冒頭でも述べた通りクラウドサービスが利用される幅は拡大傾向にあり、特にAWSは世界的なシェア率が高いサービスです。そのため、ぜひ今回の記事をきっかけにCodeDeployの使い方をマスターして、様々な分野の開発プロジェクトで活躍できるエンジニアを目指してみてはいかがでしょうか。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

前の記事

EFSとWordPress

次の記事

ROSとAWS RoboMakerについて