AWSのCodePipelineとCodeDeployを利用して、GitHubからEC2に自動でデプロイする

EC2へのデプロイを簡略化するために、GitHubにプッシュした際にEC2に自動でデプロイする手順をまとめます。

自動でデプロイするには、AWSのCodePipelineとCodeDeployを利用します。

IAMロールを作成

まずはIAMロールを作成します。
IAMの画面からロールを作成します。

以下のように、ユースケースでEC2を選択します。

IAMの作成

以下のポリシーをアタッチします。

  • AWSCodeDeployRole
  • AmazonS3FullAccess(CodePipelineのログがS3に保存されるため)
CodeDeployのポリシーをアタッチ
S3のポリシーをアタッチ

続いて、ロール名とロールの説明を入力して、作成を完了します。

作成が完了したら、信頼関係の編集を行います。
サービスの部分に、「codedeploy.amazonaws.com」を追加します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "codedeploy.amazonaws.com",
          "ec2.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

▼公式ドキュメント
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/getting-started-create-service-role.html

EC2にCodeDeployエージェントをインストール

EC2でCodeDeployを使用するために、CodeDeployエージェントをインストールします。

$ sudo yum install ruby
$ wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install
$ ll
合計 20
-rw-rw-r-- 1 ec2-user ec2-user 17482  5月  7 21:53 install

$ chmod +x ./install
$ ll
合計 20
-rwxrwxr-x 1 ec2-user ec2-user 17482  5月  7 21:53 install

$ sudo ./install auto
$ sudo service codedeploy-agent status
The AWS CodeDeploy agent is running as PID 6831

EC2のIAMロールを作成したIAMロールに変更します。

EC2のIAMロールを変更

CodeDeploy用の設定ファイル

CodeDeployでの自動デプロイを行うにはデプロイ元(GitHub)に「appspec.yml」という設定ファイルが必要です。

最低限、デプロイを行うためには、以下のようにソースディレクトリとデプロイ先を指定します。

version: 0.0
os: linux
files:
  - source: /
    destination: /usr/share/nginx/html/hoge

詳しくは以下の公式ドキュメントをご覧ください。
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file.html

CodeDeployの設定

まず、CodeDeployを設定します。

CodeDeployの画面で、アプリケーションを作成します。

CodeDeploy
アプリケーションを作成

続いて、デプロイグループを作成します。

デプロイグループの作成

続いて、デプロイを作成します。

GitHubのアカウント名を入力して、「GitHubに接続」ボタンをクリックします。

デプロイの作成

すると、GitHubのページに飛ぶので、接続を承認します。
接続が成功すると、以下のように表示されます。

GitHubに接続

リポジトリ名とコミットIDを入力します。
リポジトリ名は アカウント名/リポジトリ名 の形式になります。

デプロイが作成されると、EC2へのデプロイが始まります。
成功と表示されれば完了です。

デプロイ

CodePipelineの設定

上記では手動でデプロイを作成しましたが、GitHubにプッシュした際に自動でデプロイを実行するために、CodePipelineの設定を行います。

左サイドメニューから「パイプライン」をクリックします。
以下のようにCodePipelineの情報が表示されます。

CodePipeline

パイプラインを作成します。
パイプライン名を入力すると、ロール名が自動で入力されます。

パイプラインを作成する

ソースステージの追加で、GitHubを指定します。
初回は、「GitHubに接続する」ボタンをクリックします。

ソースステージを追加

接続名に任意の名前を入れて、「GitHubに接続する」ボタンをクリックすると、GitHubのページに飛ぶので、接続を承認します。

GitHubの接続を作成する

接続できたら、アプリをインストールするので、「新しいアプリをインストールする」ボタンをクリックします。

GitHubに接続する

GitHubのページに飛ぶので、対象のリポジトリを選択して、「Install」ボタンをクリックします。

GitHubに接続するコネクタをインストールする

AWSの画面に戻り、GitHubアプリ欄に数字が入るので、「接続」ボタンをクリックします。

GitHubに接続する

「接続する準備が完了しました」と表示され、完了です。

ソースステージを追加する

対象のリポジトリとブランチを指定します。

対象のリポジトリを指定

続いて、ビルドステージの追加です。
必要であれば指定してください。
本記事では、PHPの例で記載していますので、スキップしました。

ビルドステージを追加

続いて、デプロイステージを追加します。
上記でCodeDeployにて作成したアプリケーションとデプロイグループを選択します。

デプロイステージを追加する

最後に確認画面が表示されて、作成完了です。
作成完了すると、自動でパイプラインが起動します。

また、実際にGitHubにプッシュした場合も、自動でデプロイが行われて、以下のように結果が表示されます。

パイプラインによるデプロイが完了

もし、エラーが発生した場合はコンソールでエラーの内容を確認します。
また、コンソール上ではエラーの内容が詳細に表示されない場合もあるので、その場合は下記にログが出力されていると思うので、ご確認ください。

/var/log/aws/codedeploy-agent/codedeploy-agent.log