はじめに
あなたが新しいアプリを開発していると想像してください。何週間もかけて新機能を実装し、リリースの準備が進んでいますが、まだテストやデプロイが残っています。チームメンバーは忙しく、テスト結果を一つ一つ確認するのに時間がかかり、ミスも出るかもしれません。そして、ついには本番環境へのデプロイ作業で予期せぬエラーが発生し、深夜まで対応を迫られることに…。
このような場面は、開発者にとって決して珍しくありません。そこで、こうした煩雑な作業を自動化するために導入されるのが CI/CD(継続的インテグレーション/継続的デリバリー) です。
CI/CDを活用することで、コードのテストやデプロイが自動化され、バグを早期に発見し、迅速かつ安全にリリースが行えるようになります。本記事では、CI/CDの基本概念と、それを簡単に実現できるツール GitHub Actions を使って、実際にAWSにアプリケーションをデプロイする手順を紹介します。
CI/CDとは?
CI/CDは、開発プロセスの自動化と効率化を目指した手法で、主に以下の2つのプロセスに分かれます。
CI (Continuous Integration)
コードを頻繁に統合し、自動テストを実行することでバグを早期に発見するプロセスです。これにより、開発者は個々のコード変更が全体に与える影響を迅速に把握できます。
CD (Continuous Deployment/Delivery)
テスト済みのコードを本番環境に自動的にデプロイするプロセスです。これにより、手作業によるデプロイミスを防ぎ、迅速かつ安定したリリースが可能になります。
CI/CDを活用することで、開発チームはコードの変更を早期にテストし、バグを防ぎながら、頻繁にリリースする体制を整えることができます。
GitHub Actionsとは?
GitHub Actionsは、GitHubが提供するCI/CDツールで、リポジトリの操作に連動してワークフローを自動で実行できる機能です。
GitHub Actionsの特徴は、以下の点にあります。
設定のシンプルさ
他のツール(JenkinsやGitLab CIなど)と比較して、GitHub Actionsは設定がシンプルで、GitHubリポジトリと直接統合されているため、追加のセットアップが少なく済みます。
柔軟な自動化
コードのプッシュやプルリクエストなど、特定のイベントに応じてワークフローを自動化できる点が魅力です。これにより、コードのテストやデプロイを簡単に自動化することができます。
AWSへのデプロイの準備
アプリケーションのホスティング先として AWS(Amazon Web Services) を選ぶ理由は、そのスケーラビリティ、信頼性、そして広範なサービスの組み合わせが開発者に提供されるためです。AWSは、世界中にデータセンターを持ち、信頼性の高いインフラを提供しています。また、AWSのさまざまなサービスは、迅速かつ効率的にアプリケーションをデプロイするために必要なツールを提供します。さらに、GitHub Actionsとの連携もスムーズで、CI/CDパイプラインを簡単に構築できます。
AWS環境の準備
AWSにアプリケーションをデプロイするための環境を整えるステップを紹介します。
デプロイ先の選定
-
EC2インスタンス
仮想サーバーとしてのEC2を使う場合、アプリケーションをインスタンス上でホスティングできます。
-
S3バケット
静的ウェブサイトやファイルのホスティングにはS3バケットが最適です。S3は高い耐久性と可用性を誇り、コストも抑えられます。
IAMユーザーの作成
デプロイを自動化するためには、AWSのリソースにアクセスできる IAMユーザー を作成します。このユーザーには、必要なサービス(S3やEC2など)にアクセスするための権限を設定します。次に、IAMユーザーのアクセスキーとシークレットキーを取得し、GitHub Actionsから利用できるように準備します。
GitHub Secretsの設定
GitHub Actionsを使用してAWSにデプロイするには、アクセスキーとシークレットキーをGitHubリポジトリのSecretsに設定する必要があります。これにより、GitHub Actionsは安全にAWSのリソースにアクセスできるようになります。
Secretsの追加方法
- GitHubリポジトリのページに移動します。
- 「Settings」タブをクリックし、「Secrets and variables」セクションで「New repository secret」を選択します。
- 以下のキーをそれぞれ追加します:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
これでGitHub ActionsからAWSに安全にアクセスできるようになります。
GitHub Actionsのセットアップ
GitHub Actionsは、CI/CDパイプラインを簡単に構築できるツールです。GitHubリポジトリに統合されており、ソースコードの変更に応じて自動的にビルド、テスト、デプロイを行います。特にAWSとの連携においてもシンプルかつ強力な機能を提供します。
GitHub Actionsを使う理由
GitHub Actionsを使用する大きな理由は、その シームレスな統合 と 柔軟なカスタマイズ性 です。リポジトリ上で直接CI/CDパイプラインを設定でき、他のツールや追加のプラットフォームを必要とせず、GitHub内で完結できます。
さらに、GitHub Actionsはさまざまな事前設定済みの アクション(ビルドやデプロイの自動処理)を提供しているため、初心者でも簡単に使い始めることができ、複雑な操作も不要です。また、エコシステムとして非常に広範であり、AWSやその他のクラウドサービスとの 高い互換性 を持っています。
ワークフローファイルの作成
GitHub ActionsでCI/CDのワークフローを設定するために、.github/workflows/deploy.yml
というYAMLファイルを作成します。以下のサンプルをベースに、AWSへのデプロイプロセスを構築します。
name: CI/CD Pipeline for AWS
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: コードのチェックアウト
uses: actions/checkout@v2
- name: AWS CLIのセットアップ
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1
- name: アプリケーションをビルド
run: |
echo "アプリケーションをビルド中..."
- name: S3にデプロイ
run: |
aws s3 sync ./dist s3://your-s3-bucket-name --delete
このワークフローでは、コードがmainブランチにプッシュされたときに、自動でAWS CLIを使ってS3バケットにアプリケーションをデプロイします。
デプロイ先の選択
S3バケットへのデプロイ
S3バケットは、静的サイトのホスティングに最適です。特に、ウェブアプリケーションや静的コンテンツをデプロイする場合、S3は高い可用性とコスト効率を提供します。ファイルをS3にアップロードするだけで簡単にホスティングが可能です。
EC2へのデプロイ
EC2インスタンスは、動的なウェブアプリケーションやサービスをホスティングする場合
に利用します。EC2にデプロイする場合、SSHを使用したアクセスや、特定のアプリケーション設定が必要になります。
自動テストの追加
自動テストとは?
自動テストは、プログラムの動作をあらかじめ決めたテストに基づいて確認するプロセスです。開発者が自分で一つ一つ確認する代わりに、あらかじめ決めたテストをプログラムが自動で行ってくれるため、ミスを減らし、早くバグを見つけることができます。
特に、CI/CDの流れの中では、自動テストがとても重要です。コードに新しい変更を加えたとき、その変更がほかの部分に悪い影響を与えていないかを確認する必要があります。手動で確認するのは時間がかかりますが、自動テストなら素早く、何度でも繰り返してチェックできます。
自動テストのメリット
-
早期のバグ発見
自動テストを導入することで、コードの変更が他の機能に与える影響を早い段階で確認でき、リリース前にバグを修正できます。 -
一貫性のあるテスト
手動テストでは見逃しがちな部分も、自動テストでは常に同じ手順でテストが行われるため、一貫した品質チェックが可能です。 -
テストの迅速化
コードがプッシュされるたびに自動でテストが実行されるため、テストにかかる時間が大幅に短縮されます。これにより、開発スピードも向上します。 -
信頼性の向上
自動テストが成功すれば、そのコードが一定の品質を満たしていることが保証されるため、リリースに対する信頼性が高まります。
テストの追加
CI/CDパイプラインにテストを組み込むことで、コード変更に伴う問題の発生を未然に防ぐことができます。例えば、Node.jsアプリケーションの場合、以下のようにテストを自動で実行する設定が可能です。
- name: テストの実行
run: npm test
この設定では、npm test
コマンドを使って、Node.jsアプリケーションに定義されたテストが自動的に実行されます。
テストに合格(パス)した場合、次のステップへと進みますが、テストが失敗した場合はその時点でCI/CDパイプラインが停止し、デプロイは中止されます。これにより、不具合が含まれたコードが本番環境にデプロイされるのを防ぐことができます。
ワークフローの実行と結果の確認
GitHub Actionsを使って自動化された一連の流れを実際に動かし、その結果を確認する方法を紹介します。コードをGitHubにプッシュ(アップロード)すると、CI/CDパイプラインが自動で開始され、テストやビルド、デプロイといった一連の作業が進んでいきます。これにより手作業が減り、効率的にリリースまでのプロセスを管理できます。
プッシュしてワークフローを実行
コードをmainブランチにプッシュすると、GitHub Actionsが自動的にCI/CDワークフローを実行します。ビルド、テスト、デプロイが順に行われ、最終的にアプリケーションがAWSにデプロイされます。すべての作業が自動で行われるため、手作業は最小限で済みます。
GitHub Actionsのログ確認
GitHubリポジトリの "Actions" タブを使って、ワークフローの進行状況を確認できます。ビルドやテスト、デプロイが正常に実行されたか、エラーが発生していないかをログで確認しましょう。もしエラーが発生した場合は、ログに表示されるエラーメッセージをもとに原因を調べ、修正して再度ワークフローを実行します。
エラーが起きてしまったら
GitHub Actionsを使ったCI/CDワークフローの構築や実行中に、エラーが発生することがあります。問題が発生したとき、よくあるエラーの原因を理解し、迅速に対処することが重要です。ここでは、よく見られるエラーとその解決策を紹介します。
よくあるエラー
-
権限エラー
IAMユーザーに適切な権限が設定されていない場合、デプロイが失敗します。たとえば、S3バケットにファイルを書き込むための権限や、EC2インスタンスにアクセスする権限が不足していることが原因です。IAMユーザーのポリシーを確認し、必要なアクセス権限(S3の書き込み権限やEC2の管理権限など)が付与されているかを確認しましょう。 -
AWS CLIの設定ミス
AWS CLIが正しく設定されていない場合、ワークフローの実行時にエラーが発生します。GitHub Secretsに保存したAWS_ACCESS_KEY_ID
とAWS_SECRET_ACCESS_KEY
が正しく設定されているかを確認し、値に誤りがないか見直してください。特に、AWSリージョンの設定も間違っていないかチェックしましょう。
まとめ
この記事では、GitHub Actionsを使ってAWSにアプリケーションをデプロイする方法を学びました。CI/CDの基本的な流れを理解し、実際に自動化されたパイプラインの設定を体験できたかと思います。
次のステップとしては、さらに複雑なパイプラインの設定や、セキュリティ対策の強化、エラーハンドリングの改善などに挑戦してみてください。これらを進めることで、開発プロセス全体がより堅牢で効率的になります。
初めてのCI/CD構築やAWSへのデプロイに挑戦したことは、大きなステップです。最初は難しく感じるかもしれませんが、少しずつ理解が深まるにつれて、どんどん自動化の力を実感できるようになるはずです。試行錯誤しながらも、自分のペースで進んでいってください。何度も挑戦することで、必ず成長できます。引き続き、頑張りましょう!
参考リンク
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2023.09.25
【わかりやすく解説】可用性とは?
可用性について解説しました。システムにおける可用性とは一体何なのか?初心者でもわかるように解説しております。
- AWS
- インフラエンジニア
2024.04.30
Koa.jsの解説と導入ハンズオン Express.jsの後継フレームワーク
Koa.jsはその軽量性とモダンなJavaScriptの特性を活用する設計により、Web開発者に高いパフォーマンスと優れたエラー処理能力を提供し、注目を集めています。Express.jsの開発者により作られ、最小構成で柔軟性に富むオープンソースのNode.js用Webフレームワークです。
- Node.js
- ハンズオン
- フレームワーク
2024.01.28
Undifferentiated Heavy Liftingとは?重労働から解放されるクラウド時代の新戦略
クラウドコンピューティングの文脈でよく使われるこの用語は、企業や開発者が自社のコアビジネスやイノベーションに集中する代わりに、基本的でありながら重要なインフラストラクチャやシステム管理などの作業に多くの時間とリソースを費やしている状況を指します。
- AWS
- インフラエンジニア