Pipeline スターターキットで、AWS 上での継続的デリバリーをお試し
Chris Munns, David Nasi, Shankar Sivadasan, Susan Ferrell が、お送りします。
コーディングの段階からデプロイメントまでのソフトウェアデリバリプロセスを自動化するという継続的デリバリーは多くの開発チームにとって、パワフルな開発技法で究極的なゴールです。AWSは、AWS CodePipeline (継続的デリバリーサービス) やAWS CodeDeploy (自動化されたアプリケーションデプロイメントサービス)などのサービスを提供し、このゴール達成をサポートしています。コードに変更が発生した場合はいつでも、AWS CodePipeline によって、自動的にあなたが定義したデリバリープロセスを通じて、その変更が走っていきます。もし、これらのサービスを試してみたいが、リソースのセットアップに時間をかけたくない場合に利用できるスターターキットを作成しました。このスターターキットは、数ステップのサンプルアプリケーションをビルドし、デプロイする構築済みパイプラインをセットアップします。このスターターキットは、パイプラインと全リソースを米国東部(バージニア北部)リージョンに作成する AWS CloudFormation テンプレートを含んでいます。具体的に、CloudFormation テンプレートが作成するのは以下の通りです:
- 必要なルーティングテーブル、ルート、インターネットゲートウェイ、ネットワークACL を含む Amazon Virtual Private Cloud (VPC)
- Jenkins サーバ(インストールかつ設定済み)をホストする1台の Amazon EC2 インスタンス
- 単一の Amazon EC2 インスタンスにデプロイを行うデプロイグループを持つ、2つの CodeDeploy アプリケーション
- リソースを起動するのに必要な全ての IAM サービスとインスタンスロール
- サンプルアプリケーションをビルドし、デプロイする AWS CodePipeline のデリバリパイプライン。これには、 アーティファクトを保持するストアとして利用する Amazon S3 バケットの作成も含みます
事前に必要なもの:
- AWS アカウント (もし、まだ持っていない場合は、 こちら からサインアップできます)
- 米国東部(バージニア北部)リージョンにある Amazon EC2 キーペア(もし、まだ持っていない場合は、 こちらから作成の仕方を学べます)
- IAM, AWS CloudFormation, AWS CodeDeploy, AWS CodePipeline, Amazon EC2, Amazon S3 を利用できる管理者レベルの権限(もし、これらのサービスに対する権限設定が分からない場合は、本スターターキットについているTroubleshooting Problems(本ブログの末尾に記載しています) 内のサンプルポリシーを確認してください)
- 任意ですが、Github アカウントがあれば、サンプルアプリケーション用のレポジトリをフォークできます。もし、Github アカウントを作成したくない場合は、代わりにAmazon S3 バケットをスターターキットのテンプレートを保存するように設定できます。ただし、アプリケーションを編集したり、パイプラインを通じて自動的に走る変更を確認することはできません。
以上です! あとはスターターキットがあなたに変わって、全てを作成してくれます。
注意:このリソースで作成されたリソースは、AWS 無料利用枠の範囲を超えるため、アカウントに対しての課金が発生します。コストはどの程度の時間、CloudFormation のスタックとそれに含まれるリソースを残しておくかに依存します。
では、始めましょう。
提供されたサンプルアプリケーションをどこに配置したいか決めてください。AWS CodeDeploy では、現在、Amazon S3 バケットか GitHub レポジトリをソースコードの配置場所として選択できます。CloudFormation テンプレート起動時に、どちらの方法を利用するか選択できます。もし、GitHub レポジトリを選択した場合、少し追加のセットアップが必要になります。ただし、アプリケーション変更のテストや、変更が自動的にパイプラインにわたり走る様子の確認が簡単にできます。もし、スターターキットで、設定済のAmazon S3 バケットを選択した場合、セットアップをよりシンプルに行うことができますが、アプリケーションの編集などは出来ません。
ここからは、選択したステップに従ってください:
GitHub:
- GitHub にサインインし、サンプルアプリケーションレポジトリ、 https://github.com/awslabs/aws-codedeploy-sample-tomcat をフォークしてください
- https://github.com/settings/tokens に遷移し、スターターキットにて利用するためのトークンを生成します。トークンは、AWS CodePipeline: repo と admin:repo_hookを利用できる権限を要求します。詳細は、AWS CodePipeline User Guide を参照してください。トークン作成後に、そのトークンをコピーしたことを確認してください。
Amazon S3:
- スターターキットで設定されたバケットを利用する場合は行うことはありません。もし自分の所有するバケットを利用したい場合は、スターターキットに記載されている Troubleshooting Problems を参照してください。
をクリックして、AWS CloudFormation コンソールで、直接スターターキットテンプレートを起動していきます。米国東部(バージニア北部)リージョンで行っていることを確認してください。
注意:もし、自分のコンピュータにテンプレートをダウンロードし、AWS CloudFormation へ直接アップロードしたい場合は、この Amazon S3 バケット から可能です。aws-codedeploy-codepipeline-starter-kit.template ファイルを、ご自身が分かりやすい所に保存してください。
[Next]をクリックします。
Specify Details ページにて下記の通りに進めます:
- [Stack name] に、スタック名を入力します。覚えやすいように、短くてシンプルな名前を入力してください。
- [AppName] に、15文字以内(例:starter-kit-app)で、名前を入力します。名前は以下の制約があります。
- 小文字英数字、ピリオド、ハイフンのみ許可
- AWS アカウント内で一意。そのため、スターターキットを起動する際は、いつも新しいものを選択してください。
- The name must be unique in your AWS account, so be sure to choose a new name each time you use the starter kit.
- [AppSourceType] にて、ソースの配置場所をお客様の好みに応じて、 S3 もしくは GitHub を選択します。そして、下記をそれぞれ行います:
- 設定図済のAmazon S3 バケットをスターターキットのソースとして利用する場合は、すべてデフォルトのままとします(もし自分の所有するバケットを利用したい場合は、スターターキットに記載されている Troubleshooting Problems を参照してください)
- もし、 Github レポジトリを利用する場合は、[Application Source – GitHub] セクションにて、[GitHubUser]へGithub のユーザーアカウントを、入力します。[GitHubToken] に、作成したトークンを貼付けます。[GitHubRepoName] に、フォークしたレポジトリ名を入力します。 [GitHubBranchName] に、ブランチ(デフォルトは master) を入力します。
- [Key Name] に、自身が保有する Amazon EC2 キーペアを入力します。
- [YourIP] に、作成したリソースに対して、自分がアクセスする場所となるIPアドレスを入力します。
[Next]をクリックします。
(オプション)Option ページにて、[Key]に、Name と入力し、[Value] にスターターキット用に作成されるリソースだということを、自分が認識しやすい名前を入力します。この名前はタグとして、このスターターキットによって作成される全てのリソースに利用されます。もっとも、これはオプションです。あとから、これらのリソースを利用したり、編集したりする場合は、助けになるよいアイデアです。[Next] をクリックします。
Review ページにて、I acknowledge that this template might cause AWS CloudFormation to create IAM resources チェックボックスをオンにします。全ての設定を確認して、[Create] をクリックします。
CloudFormation がリソースを作成するのには、少々時間がかかるでしょう。この進行は、コンソールの Events タブで確認できます。
スタックが作成されると、 CREATE_COMPLETE というメッセージが、コンソールの [Status] カラムと Overview タブに現れます。
Congratulations!
これで、最初のパイプラインが作成され、すべてのリソースが完成しました。パイプラインは、それぞれ単一のアクションを行う4つのステージからなります。パイプラインは作成されるとすぐ、自動的に開始されます。
(もし、CloudFormation がリソース作成とパイプラインの作成に失敗した場合、リソース作成は自動的にロールバックされます。もっともよくある失敗の理由としては、Amazon S3 をソースロケーションとして選択した場合、指定したスタック名がCloudFormation では許可されたが、Amazon S3 のバケット名としては、一意でないということで許可されないことです。詳細は、本スターターキット(ブログ)末尾に記載されているTroubleshooting problems を確認してください。)
パイプラインを見るには、 AWS CodePipeline console (http://console.aws.amazon.com/codepipeline) へ遷移します。ダッシュボードには、先ほどの手順で選択したパイプライン名(例:starter-kit-app-Pipeline)をクリックします。既に開始されているかもしれませんが、パイプラインが view pipeline ページに表示されます。
それぞれの4つのステージ(source ステージ、 build ステージ 2つの deploymentステージ)で設定されたアクションが完了するまで、パイプラインの進捗を監視できます。
本パイプラインのフローは以下の通りです:
- Source ステージでは、アプリケーションをソースの配置場所(アプリケーションを保持するために作成された Amazon S3 バケット、もしくは指定したGitHub レポジトリ)から取得するアクションを担当します
- Build ステージでは、Amazon EC2 インスタンスにてホストされた Jenkins サーバにてアプリケーションのビルドを行うアクションを担当します
- 最初の Deploy ステージでは、AWS CodeDeploy を利用し、Amazon EC2 インスタンス上の Beta ウェブサイトにアプリケーションをデプロイするアクションを担当します
- 2つ目の Deploy ステージでは、再びAWS CodeDeploy を利用し、別のAmazon EC2 インスタンス上の 商用サイトにアプリケーションをデプロイするアクションを担当します
各ステージが完了した際は、青 (in progress) から緑 (success)へと変わります。
[Details]リンクをクリックすることで、Source ステージを除く各ステージの詳細を確認できます。例えば、下記のように Build ステージ内の Jenkins のビルドアクションへの Details リンクをクリックすることで、Jenkins のビルドの様子を表示するステータスページが開きます。
注意:パイプラインの初回実行時、ビルドへのリンクは、 Build #2 へ遷移します。 Build #1 は、AWS CloudFormation 内のJenkins 設定プロセスの中で、失敗して、そのまま残されています。
ビルドの詳細を見るには、ログファイルへのリンクをクリックします。アプリケーションをビルドするために、Jenkins が作成した Maven プロジェクトを確認するには、 [Back to Project] をクリックします。
Jennkins を利用する場合には、そのリソースをどの程度の長さ保持するかによらず、Jenkins をどうセキュアに設定するか検討することを我々は強く薦めます。Jenkins ダッシュボードから、[Manage Jenkins]-[Setup Security] を選択し、あなたの組織にとって最適なセキュリティオプションを選択します。より Jenkins セキュリティについて確認したい場合は、 Standard Security Setup を参照してください。
パイプラインステータスに Succeeded が表示されたら、ビルドし、デプロイしたアプリケーションを見ることが可能です。
- Prod ステージの ProdDeploy アクションのステータスエリアにて、Details をクリックします。AWS CodeDeploy コンソール内のデプロイメントの詳細が表示されます。
- Deployment Details セクションの Instance ID にあるデプロイに成功したインスタンスのインスタンスIDをクリックします。
- Amazon EC2 コンソールのDescription タブ内の Public DNS をコピーし、ご自身のWebブラウザに貼付けます。作成したアプリケーションのWebページが開きます。
Tip:各インスタンスのIPアドレスを AWS CloudFormation スタックの Outputs タブからも確認できます。
これで、パイプラインを作成し、試すことが出来ました。より多くのアクションや変更を既存のパイプラインに追加するために、更新のリリース、 ステージ間の遷移の有効化と無効化、パイプラインの編集を行うことが出来ます - あなたが行いたいことは、なんでも行うことが出来ます。このパイプラインは、あなたのものです。もし、GitHub レポジトリをソースコードの配置場所として選択していた場合は)GitHub レポジトリにあるソースコードを変更し、プッシュされた変更が、自動的にビルドされ、デプロイされる様子を確認できます。また、アプリケーションや AWS CodeDeploy のデプロイグループ、 Jenkins サーバといったパイプラインによって利用されているリソースへのリンクを探索できます。
次に実施すること
パイプラインと関連するリソースの探索が終わった後、次の2つのうちにいずれかを実施できます:
- (1つ目)スタックの削除を AWS CloudFormationのコンソールで行い、パイプラインやそのリソース、スタックそのものを削除してください。これは、これ以上パイプラインや関連リソースを利用する必要がない場合のオプションの選択肢です。利用していないリソースに対する支払いを止めたいならば、これ以上利用することの無いリソースのクリーンナップは、重要です。
スタックを削除するには:
- AWS CodePipeline にて、アーティファクトストアとして利用していたAmazon S3 バケットを削除します。このバケットは、CloudFormation スタックの一部として作成されていましたが、Amazon S3 はオブジェクトを含むバケットの削除を CloudFormation に許可してません。このバケットを削除するには、Amazon S3 コンソールを開き、demo から始まり、あなたのスタック名で終わるバケットを選択し、それを削除します。詳細はバケットを空にする、または削除するを確認してください。
- AWS CloudFormation コンソールでのスタックの削除のステップに従ってください。
- (2つ目)あなたが実際に面倒を見るアプリケーション開発を開始するためにパイプラインとそのリソースを変更してください。おそらく、Bespoke suits for dogs を作成するビジネスの準備ができていないでしょう(我々は犬が着飾るのが難しいと思い、だれもが犬の着付けにお金をかけたいと思っている訳でありません)。しかしながら、あなたは、AWS CodePipeline により継続的デリバリーのためのセットアップがされているアプリケーションを持っています。AWS CodePipelineは、例えば GitHub など、あなたが、ソフトウェア開発のためにすでに使っている他のサービスとの連携します。パイプラインの編集を行って、アクションやステージの削除を行ったり、あなたのアプリケーションにとってより正確にデリバリプロセスを反映する新しいアクションやステージを追加できます。さらに、もし自分の独自ソリューションを連携させたい場合は、カスタムリソースの作成を行うことも出来ます。
もし、パイプラインと関連リソースを残す場合は、以下の考慮ポイントを確認してください:
- スターターキットによって作成された IAM ポリシーとロールを確認し、必要であれば権限を変更してください
- AWS によって提供される管理ポリシーの1つを使って、あなたがアクセスさせたいIAMユーザーやグループに、AWS CodePipeline を利用するための権限を付与してください
- AWS CodeDeploy を利用し続けたい場合、AWS CodeDeploy を利用するための権限 を追加、削除し、作成されたIAM インスタンスプロファイルと サービスロールを確認し、デプロイグループ設定の確認、もしくは変更を行ってください
- もし、Amazon EC2 インスタンス上にホストされている Jenkins サーバを利用し続ける場合は、 Jenkins と EC2 インスタンスをセキュアに保つように確認してください。
皆様がスターターキットと本ブログを楽しむことを望んでいます。もし、何かフィードバックや質問がある場合はお気軽に、AWS CodePipeline forum へ投稿してください。
Troubleshooting Problems with the Starter Kit
もしスタック作成や削除に失敗した場合は、CloudFormation スタックの Events タブがトラブルシューティングに役立ちます。
Problem: AWS CodePipeline のカスタムアクションを作成しようとした際に、スタック作成に失敗した。
Possible Solution: あなた、もしくはAWS アカウント番号を共有する誰かが、スターターキットを既に使用し、同じアプリケーション名を指定している可能性があります。カスタムアクションは、AWSアカウント内で、一意の名前を持つ必要があります。他に可能性があることとしては、カスタムアクションを含むリソースを、あなた、もしくは他の誰かが削除してしまったことが挙げられます。削除したカスタムアクションの名前を使って、カスタムアクションを作成することはできません。いずれにしても、失敗したスタックを削除し、異なるアプリケーション名でスタック作成を再度行ってください。
Problem: エラーメッセージ無く、 AWS CloudFormation によるスタック作成が失敗した。
Possible Solution: おそらく、必要な権限が足りません。AWS CloudFormation テンプレートを使ったリソース作成には、下記のポリシーか、それに代わる権限が必要になります:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudformation:*",
"codedeploy:*",
"codepipeline:*",
"ec2:*",
"iam:AddRoleToInstanceProfile",
"iam:CreateInstanceProfile",
"iam:CreateRole",
"iam:DeleteInstanceProfile",
"iam:DeleteRole",
"iam:DeleteRolePolicy",
"iam:GetRole",
"iam:PassRole",
"iam:PutRolePolicy",
"iam:RemoveRoleFromInstanceProfile",
"s3:*"
],
"Resource": "*"
}
]
}
Problem: スタックにより作成された Amazon S3 バケットを削除しようとした際に、スタック削除に失敗した。
Possible solution: 1つ、もしくは複数のファイルやフォルダがスタックにより作成されたバケット内に残っている可能性があります。このバケットを削除するには、バケットを空にする、または削除するのインストラクションに従ってください。その後、 AWS CloudFormation スタックを削除します。
Problem: テンプレートで設定済みのものではなく、自分が保有する Amazon S3 バケットをパイプラインで使用するソースコードの配置場所として利用したい。
Possible solution: ご自身で米国東部(バージニア北部)リージョンにバケットを作成し、以下のステップに従ってください:
- サンプルアプリケーションを GitHub の https://github.com/awslabs/aws-codedeploy-sample-tomcat よりダウンロードし、米国東部(バージニア北部)リージョンに作成した Amazon S3 バケットへ suitsfordogs.zip をアップロードします
- AWS マネジメントコンソールにサインインし、Amazon S3 コンソール https://console.aws.amazon.com/s3 を開きます
- 利用可能なバケットのリストから、作成したバケットを選択し、プロパティタブを開き、バケットポリシーの追加もしくは、編集をクリックします。
- 下記の権限を許可するポリシーを持っていることを確認してください(詳細は、 バケット許可の編集を参照してください):
- s3:PutObject
s3:List*
s3:Get*
- s3:PutObject
- CloudFormation の詳細設定の際に、 Specify Details ページの AppSourceType にて、S3 を選択し、Application Source – S3 の情報をご自身のバケットとオブジェクトに入れ替えてください。
----------------------
本記事のオリジナル版はこちらです。日本語版は江川(@daiti0804)が担当しました。
最後に宣伝になりますが、AWS トレーニングでは、DevOps Engineering on AWS というトレーニングを提供し、DevOps の基本概念を理解して、AWS 上でアプリケーションを開発、デプロイ、継続的改善していく方法を学習できます。そこでは、「DevOps とは何か?」という基本的な部分の解説や、本スターターキットで利用している AWS CodeDeploy や AWS CodePipeline などを利用して、継続的デリバリーのプロセスを体験するラボが用意されています。興味がある方は、ぜひご利用ください。
コメント