AWS CodeDeployでGitHubからEC2へインプレースデプロイする | アントレプログラマー

AWS CodeDeployでGitHubからEC2へインプレースデプロイする

AWS

こんにちは、ニキです。

この記事では以下のような疑問を解消します。

  • EC2用のIAMロールはどのように更新すればいい?
  • CodeDeploy用のIAMロールはどのように作成すればいい?
  • EC2用のCodeDeployアプリケーションを作成するには?
  • EC2にインプレースデプロイするCodeDeployデプロイグループを作成するには?
  • GitHubからEC2へのCodeDeployデプロイを作成するには?

CodeDeployはデプロイを自動化するサービスです。

デプロイ先として以下の3つのコンピューティングプラットフォームを使用できます。

  • EC2/オンプレミス
  • AWS Lambda
  • Amazon ECS

以下の2つのデプロイタイプがあります。

  • インプレイスデプロイ
  • Blue/Green デプロイ

リビジョン(ソースコード)の取得先として、以下を利用できます。

  • S3バケット
  • GitHub
  • BitBucket

この記事では、CodeDeployを理解する点に重きを置いているので、簡単のためにEC2へのインプレースデプロイを採用しています。また、一般的なユースケースとして利用されることの多いGitHubをリビジョンとして使用します。

Takaharu Niki

・Webエンジニア6年目。
・バックエンドを中心に、フロントエンドやDevOps業務も経験。
・現在は、自社サービス企業のテックリードとして従事。

Takaharu Nikiをフォローする

EC2用のIAMロールを更新

IAMのコンソール画面へ移動し、許可を追加 から ポリシーをアタッチ を選択します。

AWSCodeDeployRoleをチェックし、許可を追加 を選択します。

EC2/オンプレミスのデプロイには、AWSCodeDeployRole ポリシーをアタッチします。これは、サービスロールで以下を実行するためのアクセス許可を提供します。

  • インスタンスのタグを読み取る、または Amazon EC2 Auto Scaling グループ名により Amazon EC2 インスタンスを識別します。
  • Amazon EC2 Auto Scaling グループ、ライフサイクルフック、スケーリングポリシーの読み取り、作成、更新、削除を行います。
  • Amazon SNS トピックに情報を公開します。
  • CloudWatch アラームに関する情報を取得します。
  • Elastic Load Balancing を読み、更新します。
引用 https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/getting-started-create-service-role.html

これでEC2用のIAMロールの更新は完了です。

CodeDeploy用のIAMロールの作成

次に、CodeDeploy用のIAMロールを作成します。

ロールを作成 を選択します。

以下にチェックを入れて、次へ を選択します。

  • 信頼されたエンティティタイプ: AWSのサービス
  • ユースケース: CodeDeploy

AWSCodeDeployRoleを許可に追加して、ロールを作成 を選択します。

これで、CodeDeploy用のIAMロール作成は完了です。

後ほど、デプロイグループを作成する際に使用します。

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

CodeDeployのコンソール画面へ移動し、アプリケーションの作成 を選択します。

以下の項目を設定します。

  • アプリケーション名: 任意の名前
  • コンピューティングプラットフォーム: EC2/オンプレミス

項目を設定したら、アプリケーションの作成 を選択します。

アプリケーションが作成されたので、続いてデプロイグループを作成します。

EC2にインプレースデプロイするCodeDeployデプロイグループを作成

デプロイグループの作成 を選択します。

  • サービスロール:先ほど作成したサービスロールを選択します。
  • デプロイタイプ:今回はインプレースを選択します。
  • 環境設定
    • Amazon EC2 インスタンス にチェックを入れます。
    • デプロイ先のEC2に設定しているタグを、キー・値に指定します。
  • AWS Systems Manager を使用したエージェント設定:今すぐ更新し、更新をスケジュール にチェックを入れます。手動でインストールする手間が省けます。
  • デプロイ設定:CodeDeployDefalut.AllAtOnce を選択します。要件に合わせて変更します。
  • Load balancer:ロードバランシングを有効にする のチェックを外します。今回はロードバランサに繋がっていないEC2を前提にしているので、チェックを外しています。Webサーバーを想定している場合は、ダウンタイムを発生させないためにチェックを入れます。

デプロイグループの作成 を選択します。

デプロイグループが作成されたので、続いてデプロイを作成します。

GitHubからEC2へのCodeDeployデプロイを作成

appspec.yml

GitHubのリポジトリのルートディレクトリに以下のようなappspec.ymlを含めます。

  • source: デプロイするリソースのパスを指定します。
  • destination: デプロイ先を指定します。
version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html/

デプロイの作成

デプロイの作成を選択します。

GitHubのトークンは事前に登録しておきます。

GitHubのトークンの登録がまだの場合は、以下の公式ページが参考になります。GitHub App の登録マニュアルです。

GitHub App の登録 - GitHub Docs
GitHubAppは、個人用アカウントまたは所有している組織で登録できます。

以下の項目を設定した後、GitHubに接続 を選択します。

  • デプロイグループ:先ほど作成した、デプロイグループ
  • リビジョンタイプ:アプリケーションはGitHubに格納されています。
  • GitHubトークン名:登録済みのトークン名を指定します。

別ウィンドウが開いたら、Grantを選択したあとに、Authorize aws-codesuiteを選択します。

確認 を選択します。

GitHub側では以下のように、Third-party application access policyにAWS CodeDeployが登録されます。

個人アカウントのApplicationにもAWS CodeDeployが登録されます。

リポジトリ名とコミットIDを指定します。

必要に応じて設定します。今回はデフォルトのままにします。

最後に、デプロイの作成 を選択します。

後はデプロイの成功を待つだけです。結果はコンソール上で確認できます。

CodeDeployのデプロイ結果の確認

デプロイが成功したあと、実際にデプロイされているかを確認してみます。

/opt/codedeploy-agent/deployment-root/以下に、各デプロイごとのリソースが保存されます。

sh-5.2$ ls /opt/codedeploy-agent/deployment-root/a09cef19-9803-4929-a50b-04f386347778/d-G9QS4R391/
bundle.tar          deployment-archive/

appspec.ymlで指定した場所にデプロイされています。

sh-5.2$ ls /var/www/html/
README.md  appspec.yml

CodeDeployのデプロイ時のトラブルシューティング

デプロイ中に以下のようなエラーが出る場合があります。

The overall deployment failed because too many individual instances failed deployment, too few healthy instances are available for deployment, or some instances in your deployment group are experiencing problems.

AWS公式のトラブルシューティングページを参考に、設定漏れがないかを確認します。

EC2/オンプレミスのデプロイに関する問題のトラブルシューティング - AWS CodeDeploy
CodeDeployを使用してEC2/オンプレミスコンピューティングプラットフォームにデプロイするときに発生する可能性があるデプロイの問題をトラブルシューティングします。

それでも解決しない場合は、どのライフサイクルイベントで失敗したのかと、詳しいエラーを確認します。

デプロイのライフサイクルイベント の View events を選択して、画面遷移します。

今回は以下のようなエラーから、具体的なアクションを確認できました。

  • CodeDeployエージェントのログを確認
  • CodeDeployエージェントが実行中かを確認
  • CodeDeployエージェントがCodeDeployサーバーへ接続可能かを確認
CodeDeploy agent was not able to receive the lifecycle event. Check the CodeDeploy agent logs on your host and make sure the agent is running and can connect to the CodeDeploy server.

上記のエラー原因以外にも、appspec.ymlが存在しない場合にも同様のエラーが発生します。

CodeDeployからGitHubトークンを削除する

CLIから削除する必要があります。

存在するGitHubトークンを確認します。

sh-5.2$ aws deploy list-git-hub-account-token-names
{
    "tokenNameList": [
        "entreprogrammer-jp"
    ]
}

対象を指定して、GitHubトークンを削除します。

sh-5.2$ aws deploy delete-git-hub-account-token --token-name entreprogrammer-jp
{
    "tokenName": "entreprogrammer-jp"
}

GitHubが削除されているかを確認します。

sh-5.2$ aws deploy list-git-hub-account-token-names
{
    "tokenNameList": []
}

トラブルシューティング

EC2の許可ポリシーがないと、以下のエラーになります。

sh-5.2$ aws deploy list-git-hub-account-token-names

An error occurred (AccessDeniedException) when calling the ListGitHubAccountTokenNames operation: User: arn:aws:sts::825046422689:assumed-role/ForEc2/i-0156ee00c68414447 is not authorized to perform:codedeploy:ListGitHubAccountTokenNames on resource: arn:aws:codedeploy:ap-northeast-1:825046422689:githubaccounttoken:* because no identity-based policy allows the codedeploy:ListGitHubAccountTokenNames action

IAMロールに許可ポリシーを追加します。

許可を追加 – インラインポリシーを作成 を選択します。

CodeDeployに対して実行できるアクションを指定します。

以下のアクセスを許可し、次へを選択します。

JSONだと以下のように編集します。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "VisualEditor0",
			"Effect": "Allow",
			"Action": [
				"codedeploy:DeleteGitHubAccountToken",
				"codedeploy:ListGitHubAccountTokenNames"
			],
			"Resource": "*"
		}
	]
}

ポリシー名を指定して、ポリシーの作成 を選択します。

これで、EC2からCodeDeployへのポリシーを追加できました。

以下のように操作できるようになります。

sh-5.2$ aws deploy list-git-hub-account-token-names
{
    "tokenNameList": [
        "entreprogrammer-jp"
    ]
}

まとめ

この記事では以下のような疑問を解消できるように、執筆しました。

  • EC2用のIAMロールはどのように更新すればいい?
  • CodeDeploy用のIAMロールはどのように作成すればいい?
  • EC2用のCodeDeployアプリケーションを作成するには?
  • EC2にインプレースデプロイするCodeDeployデプロイグループを作成するには?
  • GitHubからEC2へのCodeDeployデプロイを作成するには?
Takaharu Niki

・Webエンジニア6年目。
・バックエンドを中心に、フロントエンドやDevOps業務も経験。
・現在は、自社サービス企業のテックリードとして従事。

Takaharu Nikiをフォローする
AWS
Takaharu Nikiをフォローする
アントレプログラマー
タイトルとURLをコピーしました