見出し画像

AWS:簡易CD構成を試してみた

皆さん、こんにちは。ちゃみみです。

インフラ屋としてCI/CDについて敬遠していたのですが、色々なPJで問い合わせ含めて聞かれることが多くなったのでBuildは除いて(ダミーイメージとか作れんw)一旦、CodeCommit、CodeDeploy、CodePipelineを用いた簡易CI/CD環境を作成してみてどういった動きをしたのか、実際に見てみました。

色々ほじくっていくとクラ〇ソの記事とかで紹介されているものがあったんですが、かなり端折りすぎていて開発初心者のアタクシには着いていけない部分があったので自分なりに他記事などを読み進めてある程度形になったもの(他記事やクラ〇ソ記事の肉付けを行った)をこちらに記載していくので初心者はこちらを見たほうが理解は進みやすいかと思います。

行う内容やイメージ、想定した動作としてはざっくり以下です。
【構成後に期待した動き】
・CodeCommitにソースコードを格納しているのでソースコードに変更を加えてプッシュした際にPipelineなどが動き出し、自動でデプロイ処理が進むこと

【設定すること】
※VPCなどのNW構成は既に出来上がっている前提として。
・CodeCommitのリポジトリを作成する。
・CodeCommitを操作するためのEC2(①とする)を作成する。
・マネコンなどログインしているIAMユーザーにCodeCommitクレデンシャル情報を発行する。
・①上でリポジトリの中身などを整える。⇔AWS提供のサンプルファイルを格納する。
・CodeDeployとEC2に付与するIAMRoleを作成する。(設定値を変更はしますが1つのRoleでOK)
・CodeDeployAgentを導入するためのEC2(②とする)を作成する。
・②とともに付与するSGも作成して②に紐づける。
・CodeDeployでアプリケーションの作成とデプロイグループの作成を行う。
・CodePipelineでPipelineを作成する。

↓<Pipeline作成後に自動でCI/CDサイクルが動き出すのでデプロイできるか確認をする>

・ソースコードを編集し、CodeCommitにプッシュする。

【気を付けること】
・CodeCommitの接続クレデンシャルを発行するIAMユーザーには、CodeCommitフルアクセスのようなCodeCommitをきちんと触れるPolicyを付与しておく必要がある。
・IAMRoleのPrincipalがEC2だけじゃなくてCodeDeployも紐づける必要があるのでそれは手動で実施する必要がある。
・CodeCommitにアクセスするためのクレデンシャル情報があるのでこれを発行しておく。(慣れてないと知らないw)


【今回の簡易CI/CDで作るAWS構成イメージ】

それでは一つずつ、実施していきましょう。
まずは、CodeCommit上にリポジトリを作成します。


リポジトリ作成画面では、リポジトリ名を入力して説明欄や下のカッコにチェックを入れるのは今回は割愛してそのまま作成します。

※今回は、リポジトリ名をMyDemoRepoとして作成します。

次にGitコマンドでこのリポジトリをクローンして整理していくので以下のステップでCodeCommit用のEC2にコマンド含めて入力をしていきます。
GitコマンドでCodeCommitにアクセスするには、クレデンシャル情報の発行が必要なので先にAWSにログインしているIAMユーザーでこのクレデンシャルを発行します。

IAMのダッシュボード上に移動してログインしているIAMユーザーの認証情報まで移動すると下部にこっそりとありますのでこれを生成するとクレデンシャルが発行されますのでユーザー名とパスワードを控えておきましょう。
次に①EC2上でまずは、Gitをインストールします。以下のコマンドを実行します。

次にCodeCommitにアクセスするためにHTTPSクローン情報を取得します。

①EC2上でローカルの任意のディレクトリで以下のコマンドを実行してクローンをします。今回は、tmpという一時フォルダを作成してその中で実行します。

これが完了すると、tmp配下に作成したCodeCommitのリポジトリが追加されているのでそのリポジトリ内に移動して以下のディレクトリ構成でサンプルファイルを配置します。
サンプルファイルはこちら。※AWSからサンプルとして提供されているものになります。
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/samples/SampleApp_Linux.zip

AWSナレッジはこちらになります。ここを読み進めて頂いてステップ2に該当の↑ファイルがあります。
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/tutorials-simple-codecommit.html

サンプルファイルをダウンロード後に以下のような配置で設定します。

私がわかってないだけなのかもしれないのですが、CodeCommit上でディレクトリを作るというのがGUIだとどうしてもできなかったので①EC2上のコマンドでファイルをアップロードしていきます。

無事にアップできるとAWS上のCodeCommitにはイメージとしてこのような感じで反映されています。

CodeDeployでデプロイ内容が記述されているがこのappspec.ymlファイルで詳しく知りたい方はAWSナレッジ(参考URL:https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html#appspec-hooks-server)を参照ください。


ここまでで①EC2でできることは終わりましたので次は②EC2の作成をしていきます。
②EC2を作成する際に以下の点に注意します。
・自動割り当てパブリックIPを有効にする
・ユーザーデータに以下の内容を入力し、EC2を起動する

EC2の作成自体は大きな部分は割愛しますが、以下の点を考慮してください。
ネットワーク
→構成図に記載の通りになりますが、InternetGatewayがアタッチされたVPCを選択
サブネット
→インターネットからアクセスできるパブリックサブネットを選択
IAMロール
→事前に作成したロールを付与

この事前に作成したIAMロールですが以下を参考に作成してください。

付与するポリシーはこちらです。
【AWSCodeDeployRole】
【AmazonS3FullAccess】

タグをつける付けないはお任せします~
Role名については、今回は、CodeDeployRoleとしました。

で、ここまでIAMRole自体は作成を終えます。
加えて、一旦EC2作成ではこのIAMRoleを付与を行ってください。
付与後に再度このRoleの編集画面へ移動し、信頼関係を修正します。

デフォルトで作成時はこのような構文になっているかと思います。

これを以下に変更します。

Serviceの「codedeploy.amazonaws.com」は、CodeDeployでもこのRoleを使えるようにするということなのでこれを入れないとCodeDeployで使用することができません。
加えて、この一文を加える作業をEC2付与前にした場合に私のほうで検証すると、EC2にIAMRoleを付与するときにこのRoleが見つけることができずに苦労した経緯があり、一旦付与後に再編集を行うことでスムーズに事を進めることを目的としています。

次にやっとCodeDeploy側での作業となりますが、初めにアプリケーションの作成をしていきます。
アプリケーションの作成自体はそこまで難しくないので以下の設定を入力して作成します。

次にこれに紐づけるデプロイグループを作成します。

デプロイグループ名は、任意になりますが、今回はMyDemoApplicationDeployとします。
サービスロールでは、既に事前に作成済みとなる「CodeDeployRole」を選択します。
デプロイタイプは、今回はBlue/Greenではなくインプレースで作成をします。

環境設定では、今回はEC2にデプロイする形となるためAmazonEC2インスタンスを選択しタグなどで対象を紐づける形となるため今回は単純にEC2に付与してあるNameタグで②EC2を選択します。
SSM設定では、↑がデフォルトではありますが今回使用予定はないので「なし」を選択します。

デプロイ設定では、今回は「CodeDeployDafault AllAtOnce」を選択します。ELBは今回構成していないのでチェックを外し、他の詳細設定については、今回の試行では設定せずに作成をします。

最後、CodePipelineの作成となりますが、パイプライン名は一旦MyApplicationPipelineとしサービスロールは既存のものを作成しているわけではないので新しいサービスロール(AWS側で自動で作ってもらえます)を選択し、高度な設定では以下の設定とします。
・アーティファクトストア@デフォルトのロケーション
・暗号化キー@デフォルトのAWSマネージド型キー

ソースステージを追加する設定では以下の画像のように設定をします。
・ソースプロバイダー@AWS CodeCommit
・リポジトリ名@CodeCommitに今回の検証用に作成したリポジトリ名
・ブランチ名@masterしか作成していないはずなのでこちらを選択
・検出オプション@Amazon Cloudwatch Events
・出力アーティファクト形式@CodePipelineのデフォルト

※ソースステージを追加設定を終えるとビルドステージの設定に入りますが、今回CodeBuildの設定をしているわけではないので必ずスキップしてください。

デプロイステージを追加する設定では、以下の内容で設定をします。
・デプロイプロバイダー@AWS CodeDeploy
・リージョン@アジアパシフィック(東京)
・アプリケーション名@先ほどCodeDeploy設定フェーズで今回の検証用で作成したアプリケーションを選択
・デプロイグループ@先ほどCodeDeploy設定フェーズで今回の検証用で作成したデプロイグループを選択

最終の設定確認を終え、パイプラインを作成をします。

パイプラインが実行されると以下のような感じでDeployまで自動でタスクが実行されます。


ここまで完了すると、②EC2のパブリックDNSをブラウザのアドレスバーに入力して確認すると以下のように表示されます。

次にCodeCommitリポジトリ内のコードを変更します。
編集する場所は、index.htmlを変更して保存し、再度CodeCommitにプッシュすることでCodePipelineが動き出しDeployが始まります。
完了後に再度パブリックDNSをクリックして確認すると変更内容が反映されているかと思います。
以下画像は、クラ〇ソさんから拝借

以上が簡易CI/CDの流れになります。
中々なじみが薄い方には難しい部分もあるかと思いますが、CI/CDってこんな感じなんだ~と思っていただければ。。w

参考にしたURLはこちらになりますので細かい点は確認いただいても良いかと思います。


2022年08月18日

以下、宣伝です。
仲間も募集中なので、気になる方は↓の記事を覗いてみてくださいませ。
いい会社だと思いますよ。


いいなと思ったら応援しよう!