🙄

S3に保存したアプリケーションをCodeDeployとCodePipelineを使用してEC2へデプロイする

2022/02/08に公開

構成図

前提

  • VPC、サブネット等のネットワーク周りが作成済み
  • プライベートサブネットへEC2インスタンスが起動済み
  • 外部からの通信用に、ALBとターゲットグループが作成済み

作業の流れ

  1. IAMロール作成
  2. VPCエンドポイント作成
  3. S3バケット作成
  4. EC2インスタンスへCodeDeployエージェントインストール
  5. CodeDeploy作成
  6. CodePipeline作成
  7. EC2インスタンスへデプロイ

1. IAMロール作成

EC2インスタンス用ロール

ポリシーにマネージドポリシーとカスタムポリシーを1つずつアタッチ。
・マネージドポリシー
  AmazonEC2RoleforAWSCodeDeploy
・カスタムポリシー
  以下のポリシーを記載して保存。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "codedeploy-commands-secure:GetDeploymentSpecification",
                "codedeploy-commands-secure:PollHostCommand",
                "codedeploy-commands-secure:PutHostCommandAcknowledgement",
                "codedeploy-commands-secure:PutHostCommandComplete"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

CodeDeploy用ロール

マネージドポリシーを1つアタッチ。
・マネージドポリシー
  AWSCodeDeployRole

ロール作成後、信頼関係が以下となっていることを確認。

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

2. VPCエンドポイント作成

作成するのは以下となります。

  • com.amazonaws.ap-northeast-1.codedeploy
  • com.amazonaws.ap-northeast-1.codedeploy-commands-secure
  • com.amazonaws.ap-northeast-1.s3

作成の際に、エンドポイントを紐づけるサブネットが選択できるので、
EC2インスタンスが起動しているプライベートサブネットを選択。

3. S3バケット作成

バケットは2種類作成します。

  • アプリケーションの保存用
  • CodePipelineの入出力データ用

4. EC2インスタンスへCodeDeployエージェントインストール

既に起動済みのインスタンスへ接続し、CodeDeployエージェントをインストールしていく。
詳しいインストール方法は、こちらを参照。
実行するコマンドは以下。

インストール完了後、VPCエンドポイントを介して動作させる為に以下のファイルを編集する。

  • /etc/codedeploy-agent/conf/codedeployagent.yml
    ファイル内の末尾に :enable_auth_policy: true を記述して保存
codedeployagent.yml
:log_aws_wire: false
:log_dir: '/var/log/aws/codedeploy-agent/'
:pid_dir: '/opt/codedeploy-agent/state/.pid/'
:program_name: codedeploy-agent
:root_dir: '/opt/codedeploy-agent/deployment-root'
:verbose: false
:wait_between_runs: 1
:proxy_uri:
:max_revisions: 5
:enable_auth_policy: true

保存後は念の為、CodeDeployエージェントを再起動しておく。

5. CodeDeploy作成

必要な準備が完了したのでCodeDeployの設定を行っていく。

アプリケーションの作成

  • アプリケーション名は任意名
  • プラットフォームは今回の構成では【EC2/オンプレミス】を設定する。

デプロイグループの作成

アプリケーション作成後、【デプロイグループの作成】から設定を行う。

  • デプロイグループ名は任意名
  • サービスロールは最初に作成したCodeDeploy用ロールを選択

  • デプロイタイプは今回【インプレース】を選択
  • デプロイ対象のEC2の判別に今回はタグを使用する為、「4. EC2インスタンスの設定」でインスタンスに設定したタグと同様のものを設定する。

  • CodeDeployエージェントは手動でインストール済みの為、【なし】
  • デプロイ設定はシステムの要件に合わせて選択していきます。

  • ロードバランサーはALBを選択し、事前に作成したターゲットグループを設定する。

全て入力後、デプロイグループを作成をクリックしてCodeDeployの作成は完了となります。

6. CodePipeline作成

最後にCodePipelineを設定していきます。

  • パイプライン名は任意名
  • サービスロールは【新しいサービスロール】を選択することで自動で作成してくれます。

  • アーティファクトストアはCodePipelineの入出力データを保存するS3バケットを指定する。
    今回は事前に作成したバケットを指定します。
  • 暗号化キーはAWSのマネージドキーとします。

ソースステージでは、アプリケーションの保存先を指定していきます。
今回の構成では以下を選択。

  • ソースプロパイダー:S3
  • バケット:手順3で作成したバージョニングが有効化されているバケット
  • オブジェクトキー:保存するアプリケーションのファイル名
  • 検出オプション:Cloudwatch Events

ビルドステージは今回、Codebuildなどのサービスを使用していない為、スキップ。

デプロイステージは、インスタンスにデプロイする方法を指定します。
今回の構成では、以下を選択。

  • デプロイプロパイダー:CodeDeploy
  • リージョン:東京
  • アプリケーション名:CodeDeployで作成したアプリケーションを選択
  • デプロイグループ:CodeDeployで作成したデプロイグループを選択

最後に設定内容の確認があるので、問題なければ作成してCodePipelineの設定は完了です。

7. EC2インスタンスへデプロイ

自動デプロイの準備が出来たので、実際にデプロイしていきます。

S3にアプリケーションをアップロード

アプリケーション保存用のS3バケットの【アップロード】からアプリケーションファイルをアップロードしていきます。
今回は、公式で配布されているサンプルアプリケーションを使用しています。

アプリケーションのアップロードが完了したことをトリガーにCodePipelineが起動して
EC2インスタンスへのデプロイが実行される。

デプロイが完了したらブラウザでALBのDNS名にアクセスしてみます。
Congratulations と書いてあるサンプルページが表示されればデプロイは完了です。

まとめ

今回、業務で触れた経験を自分へのメモ代わりという意味合いも含めて
初めて記事を作成してみましたが、説明の不足や表現のおかしい点などが
ありましたら申し訳ありません。
今後も少しずつ投稿していけたらなと思っていますので
私の経験が誰かのお役に立てれば幸いです。

参考記事

Discussion