1. 目的
- devops関係の復習をしている。code系のサービスの知識が乏しいため、基礎的なハンズオンから始めて勉強する。
2. やったこと
- AWS公式チュートリアル「チュートリアル: シンプルなパイプラインを作成する (CodeCommit リポジトリ)」 を実施する。
- Developers.IOの記事「CodeCommitからEC2にデプロイするシンプルなパイプラインを作ってみた」に、上記公式チュートリアルの詳細な解説があり、それも見ながら実施する。
- チュートリアル内容は以下の通り。
- CodeCommitにリポジトリを作成し、デプロイしたいアプリケーション(※httpdを起動してindex.htmlを置くだけ…)をアップロードする。
- アプリケーションのデプロイ先となるEC2インスタンス(1個)を作成する。
- CodeDeployに「アプリケーション」を作成し、デプロイ先やデプロイ方法の設定を行う。
- CodePipelineに、ソースをCodeCommitのリポジトリ、デプロイをCodeDeployのアプリケーションとして「パイプライン」を作成する。
- 「パイプライン」を初回実行し、デプロイしたWEBサイトが表示されることを確認する。
- CodeCommitのリポジトリ内容(index.html)を更新する。CodeCommitの更新をトリガにパイプラインが再実行され、WEBサイトのコンテンツが更新されることを確認する。
3. 構成図
4. 手順
- 基本的にチュートリアルの手順通りに実施するが、詰まった点などを補足する。
事前準備
- 「Setup for HTTPS users using Git credentials」 に従い、CodeCommitにhttps経由でアクセスする環境を整備する。
- 「AWSCodeCommitPowerUser」権限を持つIAMユーザを作成する。
- 上記権限を持つIAMユーザの管理画面にて、「AWS CodeCommit の HTTPS Git 認証情報」の「認証情報の生成」を実施する。CodeCommitに接続するためのUsername/Passwordのセットが生成される。
Step 1: Create a CodeCommit repository
- CodeCommitの管理画面にて、新規レポジトリを作成する。
- 作業用インスタンスにgitをインストールし、ローカルリポジトリのセットアップを行う。git clone 実行時に、事前に作成した「AWS CodeCommit の HTTPS Git 認証情報」が必要になる。
[ec2-user@ip-10-0-0-130 ~]$ sudo yum install git
[ec2-user@ip-10-0-0-130 tmp]$ git --version
git version 2.32.0
[ec2-user@ip-10-0-0-130 tmp]$ git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/mksamba-XXXX
Cloning into 'mksamba-XXXX'...
Username for 'https://git-codecommit.ap-northeast-1.amazonaws.com': [username]
Password for 'https://xxxxxx@git-codecommit.ap-northeast-1.amazonaws.com': [password]
warning: You appear to have cloned an empty repository.
Step 2: Add sample code to your CodeCommit repository
- SampleApp_Linux.zip を保存して解凍する。
[ec2-user@ip-10-0-0-130 mksamba-XXXX]$ wget https://docs.aws.amazon.com/codepipeline/latest/userguide/samples/SampleApp_Linux.zip
[ec2-user@ip-10-0-0-130 mksamba-XXXX]$ unzip SampleApp_Linux.zip
[ec2-user@ip-10-0-0-130 mksamba-XXXX]$ rm SampleApp_Linux.zip
[ec2-user@ip-10-0-0-130 mksamba-XXXX]$ ls
appspec.yml index.html LICENSE.txt scripts
- リポジトリにファイルをアップロードする。
[ec2-user@ip-10-0-0-130 mksamba-XXXX]$ git add -A
[ec2-user@ip-10-0-0-130 mksamba-XXXX]$ git commit -m "Add sample application files"
[ec2-user@ip-10-0-0-130 mksamba-XXXX]$ git push
- appspec.yml (CodeDeployによるデプロイ内容を規定するファイル)の意味についてざっくり理解しておく。各行の意味は、「CodeDeploy Spec ファイルのリファレンス」を参照。
version: 0.0 # 現在0.0で固定
os: linux # EC2インスタンスが対象の場合、OS指定が必要
files: # リポジトリ内のindex.htmlを対象EC2の/var/www/htmlへコピー
- source: /index.html
destination: /var/www/html/
hooks:
BeforeInstall: # インストールの前に実行
- location: scripts/install_dependencies # スクリプトの中身は httpd のインストール
timeout: 300
runas: root
- location: scripts/start_server # スクリプトの中身は httpd の start
timeout: 300
runas: root
ApplicationStop: # デプロイ完了後、次回のデプロイの最初に実施
- location: scripts/stop_server # スクリプトの中身は httpd の stop
timeout: 300
runas: root
Step 3: Create an Amazon EC2 Linux instance and install the CodeDeploy agent
- アプリケーションをデプロイするターゲットとなるEC2インスタンスの作成、設定を行う。
- IAMポリシー(AmazonEC2RoleforAWSCodeDeploy, AmazonSSMManagedInstanceCore)を含むIAMロールを作成する。
- Amazon Linux 2 のインスタンスを作成し、上記のIAMロールを設定する。また、タグとして「Key: Name」、「Value: mksamba-MyCodePipelineDemo」を設定する。(デプロイ先としての指定にタグを用いるため)
Step 4: Create an application in CodeDeploy
- CodeDeployにアプリケーションを作成する。
- 「信頼されたエンティティ」として「CodeDeploy」を指定したIAMロールを作成する。
- マネージメントコンソールの「CodeDeploy > アプリケーション > アプリケーションの作成」にて、アプリケーションを作成する。
- 続けてデプロイグループを作成する。
- サービスロールとして、先の手順で作成したIAMロールを指定。
- デプロイタイプとして「インプレース」(1台のデプロイ先のEC2インスタンスにそのまま上書きデプロイしていく)を選択。
- 環境設定(デプロイ先)として、EC2インスタンスを選択し、タグ「Key: Name」、「Value: mksamba-MyCodePipelineDemo」を指定。
- デプロイ設定として、デフォルトの「CodeDeployDefault.AllAtOnce」を選択。選択肢毎の挙動は「EC2/オンプレミスコンピューティングプラットフォームの事前定義されたデプロイ設定」を参照。
- AWS Systems Manager を使用したエージェント設定にて、「今すぐ更新し、更新をスケジュール」を選択する。これによりCodeDeploy Agentのインストール、更新が行われる。
- Load balancerにて、「ロードバランシングを有効にする」のチェックを外す。
Step 5: Create your first pipeline in CodePipeline
- マネージメントコンソールの 「CodePipeline - パイプライン - 新規のパイプラインを作成する」にて、パイプラインを作成する。
- 新しいサービスロールを作成する。
- ソースとして、あらかじめ作成したCodeCommitのリポジトリを指定する。
- ビルドステージは今回はないのでスキップにする。(index.htmlを配置するだけのアプリケーションなので)
- デプロイとして、あらかじめ作成したCodeDeployのアプリケーション/デプロイグループを指定する。
- パイプラインを作成後、初回実行される。(ソースのCodeCommitのリポジトリの内容をCodeDeployでEC2インスタンスへ展開)
- デプロイ先のEC2インスタンスのEIPにhttpアクセスすると、無事デプロイしたコンテンツが表示される。
Step 6: Modify code in your CodeCommit repository
- 作業用インスタンスのローカルリポジトリでindex.htmlファイルを更新し、アップロードする。
[ec2-user@ip-10-0-0-130 mksamba-qiita-XXXX]$ vi index.html (中身を更新)
[ec2-user@ip-10-0-0-130 mksamba-qiita-XXXX]$ git commit -am "Updated sample application files"
[ec2-user@ip-10-0-0-130 mksamba-qiita-XXXX]$ git push
- CodeCommitのリポジトリの変更により、CloudWatch EventsによりCodePipelineのパイプラインが再実行される。完了後、EC2インスタンスにhttpアクセスすると、コンテンツが更新されていることが確認できる。
6. 所感
- 処理の流れが理解できて、ド初心者にはちょうどよいチュートリアルだった。コンテナへのデプロイなど、もう少し複雑な内容にチャレンジしたい。