👌

GitHubからAWSにCodePipelineとCodeDeployで資材を配置してみる

2022/02/16に公開

概要

GitHub から AWS に対して CodePipeline と CodeDeploy を用いて、EC2 に資材を配置(自動デプロイ)してみます。
まずは、ビルドの必要のないアプリケーション(HTML など)のインプレース(単純ファイル置き換え)での EC2 へのデプロイ構成になります。

手順

EC2 用 IAM ロールの作成

EC2 に対して、CodeDeploy に対する接続権限を与えるためのロールを作成します。

  1. IAM-ロール-ロールを作成を選択します。
  2. ユースケース-一般的なユースケース-EC2を選択し、次へを押下します。
  3. AWSCodeDeployRoleを選択して、次へを押下します。
  4. ロール名に任意の名前を設定します。(例:codedeployrole)

CodeDeploy 用 IAM ロールの作成

CodeDeploy に対して付与するロールを作成します。

  1. IAM-ロール-ロールを作成を選択します。
  2. ユースケース-他の AWS のサービスのユースケース-CodeDeployを選択し、次へを押下します。
  3. AWSCodeDeployRoleが表示されていることを確認します。
  4. AmazonS3FullAccessを追加で設定します。
  5. そのまま次へを押下します。
  6. ロール名に任意の名前を設定します。(例:codedeploy-servicerole)

EC2 の作成

先ほど作成した IAM ロールを紐づける形で EC2 を作成します。

  1. EC2-インスタンスからインスタンスを起動を選択します。
  2. Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Typeを選択します。(無料利用枠の最新版を選択。何でもよいです)
  3. t2.microを選択します。(無料利用枠のものを選択。何でもよいです)
  4. インスタンスの詳細を設定します。
    1. 任意のネットワーク、サブネットを選択します。但しインターネットから接続が可能であることが必要です。
    2. 自動割り当てパブリックIP有効であることを確認します。
    3. IAMロールで先ほど作成したロールを選択します。(例:codedeployrole)
    4. 次のステップへを押下します。
  5. ストレージの追加設定
    1. 何もせず次のステップへを押下します。
  6. タグの追加設定
    1. タグの追加を押下し、以下の設定を追加します。
      1. キーNameCodeDeployDemoを追加します。
      2. キーdeploy01を追加します。※この値は何でもよいですが、後程デプロイ対象の特定に用います。
    2. 次のステップへを押下します。
  7. セキュリティグループの設定
    1. デフォルトで 22 番ポートが0.0.0.0/0(すべて)から接続可能になっていることを確認します。
    2. 追加で 80 番ポート(HTTP)を、0.0.0.0/0(すべて)から接続可能に設定します(デプロイ後の Web サーバ動作をブラウザで確認する場合)
    3. 確認と作成を押下します。
  8. 確認~作成
    1. 作成するインスタンス内容を確認し、起動を押下します。
    2. キーペアを選択し、チェックボックスにチェックを入れてインスタンスの作成を押下します。

CodeDeployAgent のインストール

  1. EC2 インスタンスに SSH で接続します。
    1. ssh -i [キーファイル(xxx.pemファイル)のパス] ec2-user@[EC2インスタンスのパブリックIPアドレス] ※TeraTerm からの接続でも OK
  2. AWS 公式ドキュメントに従って CodeDeployAgent をインストールします。

参考(1)
実行したインストール手順

shell
ssh -i [キーファイル(xxx.pemファイル)のパス] ec2-user@[EC2インスタンスのパブリックIPアドレス]
sudo yum update
sudo yum install ruby
sudo yum install wget
cd /home/ec2-user
wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto

確認手順

shell
sudo service codedeploy-agent status

以下の内容が表示されれば OK です。

確認結果

shell
The AWS CodeDeploy agent is running as PID 3666

参考(2)
AWS 公式ドキュメントでは現在、上記手順コマンドラインによる手順より、AWS Systems Managerを用いたインストールが推奨されています。

https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/codedeploy-agent-operations-install-ssm.html

試せていませんが、AWS Systems Managerを使用する手順を試してみたほうが良いかもしれません。
 ※初期セットアップがもろもろ必要そうです。

GitHub リポジトリの作成

GitHub にてリポジトリを作成しておきます。

例:リポジトリ名:codedeploytest

ローカルリポジトリの作成~初回プッシュ

ローカル環境で Git リポジトリを初期化して Remote に追加しておきます。

ローカルのパス(例):/home/[ユーザ名]/codedeploytest/

shell
cd ~
mkdir codedeploytest
cd codedeploytest
touch README.md
git init
git add README.md
git commit -m "My first commit"
git branch -M main
git remote add origin https://github.com/[ユーザ名]/codedeploytest.git
git push -u origin main

※GitHub リポジトリ URL は作成したリポジトリを設定してください。
 ※GitHub のユーザ名、E-mail、Personal Access Token などは必要に応じて設定します。

CodeDeploy 用サンプル資材の入手

AWS が用意している CodeDeploy 用のサンプル資材がありますので、その資材を入手します。

以下のページを参考に、資材を取得してローカルディレクトリに展開し、GitHub にプッシュします。
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/tutorials-github-upload-sample-revision.html

参考:実施した手順

shell
aws s3 cp s3://aws-codedeploy-ap-northeast-1/samples/latest/SampleApp_Linux.zip . --region ap-northeast-1
unzip SampleApp_Linux.zip
rm SampleApp_Linux.zip
git add .
git commit -m "Added sample app"
git push

awsコマンドを通すために、AWS CLI を事前にインストールしておく必要があります。AWS CLI インストール手順は以下を参考にしてください。
https://zenn.dev/ttani/articles/aws-cli-setup

参考:CodeDeploy のファイル配置の仕様

デプロイの動作定義(appspec.yml)

ルートディレクトリ直下に必ずappspec.ymlファイルを配置する必要がある。

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
  • filesで同期させる元ファイル(source)と、配置先を定義(destination)を設定する。
  • hooksで CodeDeploy 実行時の任意の合間に実行する処理を定義する。
  • ApplicationStopは既存のアプリが停止したときに動作する(初回は動かない)

CodeDeploy の設定

AWS コンソールに接続し、CodeDeploy の設定を行います。

  1. AWS コンソールで、CodeDeploy-デプロイ-開始方法-アプリケーションの作成を選択します。
  2. アプリケーションの作成で次の設定を行います。
    1. アプリケーション名:任意の名前を設定します。(例:test-codedeploy
    2. コンピューティングプラットフォーム:EC2/オンプレミスを選択します。
    3. アプリケーションの作成を押下します。
  3. アプリケーションの作成を行ったら、続いてデプロイグループの作成を行います。
    1. デプロイグループの作成を押下します。
    2. デプロイグループの作成で次の内容を設定します。
      1. デプロイグループ名:任意の名前を設定します。(例:test-deploygroup
      2. サービスロール:事前に作成したサービスロールを選択します。(例:codedeploy-servicerole
      3. デプロイタイプ:インプレースを選択します。
      4. 環境設定:Amazon EC2 インスタンスを選択します。
      5. タググループ:キーdeploy01を設定します。※EC2 作成時に設定したデプロイ対象特定用のタグを設定します。
      6. AWS Systems Manager を使用したエージェント設定:AWS CodeDeploy エージェントのインストールは今すぐ更新し、更新をスケジュールのままとします。ベーシックスケジューラも14日間のままとします。
      7. デプロイ設定:AllAtOnceのままとします。
      8. Load balancer:今回はロードバランサを使用していないのでチェックを外します。
      9. デプロイグループの作成を押下し、作成を実行します。
  4. 単体でデプロイを実行してみます。
    1. 対象のデプロイグループでデプロイの作成を押下します。
    2. リビジョンタイプを、アプリケーションは GitHub に格納されていますを選択します。
    3. GitHub トークン名で GitHub アカウント名を指定し、GitHubに接続するを実行します。
    4. リポジトリ名について、GitHub で作成したリポジトリを`[アカウント名]/[リポジトリ名]で設定します。
    5. コミットIDについて、GitHub からコミット履歴を確認し、最新のコミット ID を確認して設定します。
    6. デプロイの実行を押下します。

うまくいけば、デプロイのステータスが「成功」になります。
サーバにコンソール接続し/var/www/html/index.htmlファイルが配置されていれば OK です。

補足:GitHub の OAuth トークンがエラーとなり削除したい場合
コンソール画面から削除することができません。次の方法で削除し、再登録します。

一覧確認

shell
aws deploy list-git-hub-account-token-names

削除実行

shell
aws deploy delete-git-hub-account-token --token-name <GitHubアカウント名>

CodePipeline の設定

続いて、GitHub に Push したら自動デプロイされるように CodePipeline を構成していきます。

  1. AWS コンソールでCodePipelineを開きパイプラインを作成するを押下します。
  2. パイプラインの設定を行います。
    1. パイプライン名:任意の名前を設定します。(例:test-pipeline
    2. ロール名は自動で作成されるので、次にを押下します。
    3. ソースプロバイダーとしてGitHub(バージョン2)を選択します。
    4. 接続するを押下し、任意の接続名を設定します。(例:GitHubConnection
    5. 接続を行い、GitHub 側の画面で認可を行います。
    6. 新しいアプリをインストールするを選択し、連携対象のリポジトリを選択します。
    7. 接続ボタンを押下します。
    8. リポジトリ名から、対象のリポジトリを選択します。(既に接続済みのものから選択できます)
    9. ブランチ名から、mainを選択します。
    10. 出力アーティファクト形式CodePipeline のデフォルトを選択します。
    11. ビルドステージを追加するは、ビルドステージをスキップを選択します。
    12. デプロイプロバイダーの選択で、AWS CodeDeployを選択します。
    13. アプリケーション名デプロイグループについては、事前に作成したものを選択します。(test-codedeploytest-deploygroup
    14. 確認画面で、内容を確認し、パイプラインを作成するを押下します。

ここまでで設定は終了です。

動作確認

GitHub に HTML 資材を変更し PUSH を行います。
PUSH をトリガとして CodePipeline と、CodeDeploy が動作し、資材が Web サーバに配置されます。

次のような画面が非表示されます。(文字色を少し変更してみている)

所感

今回はまだ、CodeBuild 等は使っていない、ビルドレスのアプリケーションのインプレースでのデプロイまでをやってみました。
実際にはビルド連携や、Blue/Green デプロイといった考慮も必要になってきますので、そのあたりもやっていければと思います。

株式会社トッカシステムズ

Discussion