Amazon Web Services ブログ
AWS Service Catalog でプロビジョニング済み製品を新しい製品バージョンに更新し、AWS Step Functions、AWS Lambda、Amazon Athenaを使用して変更を報告する方法
製品の新しいバージョンを導入して設定のドリフトを減らした後、以前にプロビジョニング済み製品を最新の状態に保てるようなしくみを希望されているお客様がいました。たとえば、最新バージョンのデータベースエンジンに変更した Amazon Relational Database Service (Amazon RDS) データベースの新しい AWS Service Catalog バージョンがあるとします。RDS インスタンスの設定を手動で変更せずに、AWS Service Catalog を介して起動した既存の RDS データベースインスタンスを更新できるようにするとしましょう。
このブログ投稿では、AWS Service Catalog で製品を設定し、以前にプロビジョニング済みである製品を自動的に更新して、新しく導入したバージョンで最新の状態に保てるようにするソリューションをご紹介します。さらに、Amazon Athena を使用してバージョンの更新とステータスを追跡し、ソリューションからログファイルをクエリする方法も解説します。このソリューションは、ソリューションをデプロイしているのと同じ AWS アカウントでプロビジョニング済みの AWS Service Catalog 製品で機能します。
ソリューションの概要
このソリューションでは、AWS CloudFormation、Amazon CloudWatch、AWS Lambda、AWS Step Functions の AWS のサービスを組み合わせて使用します。Amazon CloudWatch Events を使って、スケジュールした時間に AWS Lambda 関数をトリガーします。CloudWatch Events は発生したイベントに応じて、AWS でさまざまなサービスをトリガーできます。スケジューリングした時間に、セルフトリガーするように設定することもできます。AWS Lambda を使用すると、サーバーのプロビジョニングや管理を必要とせずにコードの実行が可能になります。AWS Step Functions では、複数の AWS のサービスをサーバーレスワークフローに統合できます。
このソリューションのアーキテクチャ図は、次のようになります。
-
- この投稿で説明しているソリューションでは、CloudWatch Events ルールを使用して、AWS Lambda 関数を定期的にトリガーしています。ソリューションの CloudWatch イベントのスケジュールは、デフォルトで毎週木曜日の午後 10 時 (UTC) に実行するようになっています。このスケジュールは、AWS CloudFormation テンプレートのデプロイ中に調整できます。これについては、次のセクションで説明します。
- Lambda 関数は、AWS アカウントおよびソリューションがデプロイされているリージョンでプロビジョニング済み製品をスキャンします。各プロビジョニング済み製品において、Lambda 関数がプロビジョニング済み製品のバージョンが AWS Service Catalog で定義している最新バージョンであるかどうかを確認します。AWS Service Catalog 管理者が製品をソリューションで自動的に更新できるようにしたことも確認します。ハブアンドスポークモデルを設定している場合、適切なリージョンの各スポークアカウントにこのソリューションをデプロイする必要があります。
- これらの条件を満たすと、Lambda 関数は AWS Step Functions ステートマシンの実行をトリガーし、プロビジョニング済み製品を更新します。AWS Service Catalog の更新したプロビジョニング済み製品のオペレーションが、CloudFormation スタックの更新オペレーションをトリガーします。更新する AWS リソースによっては、このオペレーションが完了するまでに時間がかかる場合があります。このソリューションでは AWS Step Functions ステートマシンを使用することで、Lambda 関数の外部で独立して、複数の更新オペレーションのステータスを同時に実行および追跡できます。次の図は、ステートマシンの定義を示しています。
- Lambda 関数は JSON 形式でログファイルを生成し、Amazon S3 バケットに保存されます。ログファイルには、CloudFormation スタック更新のステータスと、更新オペレーションが失敗した場合のエラーメッセージが含まれます。
ご注意ください
CloudFormation スタックの更新により、テンプレートで行われた変更に基づいて AWS リソースが終了する可能性があります。この状況を回避するには、こちらをクリックして、Amazon RDS と Amazon ElastiCache (Memcache および Redis) のアップグレードのスタックリソースとバージョンの更新動作に関する詳細をご確認ください。
試してみましょう。
ステップ 1 – CloudFormation テンプレートをデプロイする
このブログ投稿の中で提供している CloudFormation テンプレートを使用して、ソリューションをデプロイできます。CloudFormation テンプレートがアカウントに作成する主な AWS リソースは、次のとおりです。
- Amazon CloudWatch Events ルール
- AWS Lambda 関数
- AWS Service Catalog TagOption
- AWS Step Functions ステートマシン
- IAM ロールとポリシー
CloudFormation テンプレートをデプロイするには
- AWS マネジメントコンソールにサインインし、AWS CloudFormation コンソールに移動します。
- 次に、以下にある [スタックの起動] のリンクを選択して、CloudFormation スタックを起動します。.
- [次へ] をクリックします。
- 詳細の指定ページで、CloudFormation スタックのスタック名と入力パラメーターを入力します。
-
ログの設定
- logS3Bucket – Lambda 関数から作成したログファイルの Amazon S3 バケット名
- logS3Key – ログファイルの logS3Bucket 下のフォルダー名として使用する Amazon S3 オブジェクトキー(デフォルト = ServiceCatalogLogs)
Service Catalog TagOption の設定
- tagOptionKey – プロビジョニング済み AWS Service Catalog 製品の最新バージョンへの自動更新を有効にするための TagOption キー(デフォルト = AutoUpdateProvisionedProduct)
- tagOptionValue – プロビジョニング済み AWS Service Catalog 製品の最新バージョンへの自動更新を有効にするための TagOption 値(デフォルト = true)
CloudWatch Event ルールの設定
- cronExpressionForEventRule – CloudWatch Event ルールをトリガーするスケジュールの Cron 式。前述のように、デフォルトでのスケジュールは毎週木曜日の午後 10 時 (UTC) ですが、要件に合わせて調整できます。
- [次へ] をクリックします。
- オプションページで、[次へ] をクリックします。
- レビューページで、次のメッセージの横に表示されるチェックボックスをオンにします。
- AWS CloudFormation がカスタム名で IAM リソースを作成する場合があることに同意します。
- [作成] をクリックします。CloudFormation テンプレートがソリューションの AWS リソースを作成します。
注: スタックの作成中に TagOptionNotMigratedException の例外が発生することがありますが、これはこのアカウントに対して TagOptions 移行プロセスが実行されていないためです。オペレーションを再試行する前に、コンソールを使用して移行プロセスを実行してください。
- AWS Service Catalog 管理者のアクセス許可を持つ IAM ユーザーを使って AWS マネジメントコンソールにサインインし、AWS Service Catalog コンソールに移動します。
- 「管理」セクションで [TagOption ライブラリ] を選択します。
- コンソールに次のエラーメッセージが表示されます。
- [タグのコピー] をクリックすると、TagOption 移行作業が開始します。
- 移行が完了すると、次のメッセージが表示されます。
- CloudFormation テンプレートをもう一度デプロイします。以前に TagOptionNotMigratedException エラーが原因で失敗した場合、今度は成功します。
ステップ 2 – TagOption を設定する
CloudFormation スタックの作成が完了したら、AWS Service Catalog TagOption を使用して、プロビジョニング済み AWS Service Catalog 製品の自動更新を有効にすることができます。新しいバージョンの導入の際、すべての AWS Service Catalog 製品が自動更新を必要とするわけではありません。そのような場合に、TagOption はこのソリューショの適用を選択できる柔軟性を提供します。
- AWS Service Catalog 管理者のアクセス許可を持つ IAM ユーザーを使って AWS マネジメントコンソールにサインインし、AWS Service Catalog コンソールに移動します。
- 「管理」セクションで、[製品リスト] を選択します。
- 管理製品ページで、プロビジョニング済み製品の自動更新を有効にする製品を選択します。
- 管理製品 – 管理製品の詳細ページで、[TagOptions] を選択します。
- [TagOption の追加] をクリックします。
- [TagOptions の追加/関連付け] ポップアップウィンドウで、ステップ 1 で CloudFormation スタック入力パラメータとして入力したキーと値に対応するチェックボックスをオンにして、[保存] をクリックします。
- 必要に応じて、このセクションの手順を他の AWS Service Catalog 製品に対しても繰り返します。自動更新を有効にしたくないAWS Service Catalog の製品の場合、TagOption を製品に関連付ける必要はありません。
TagOption を適用した AWS Service Catalog 製品が複数のポートフォリオに配布されている場合、製品が属するポートフォリオに関係なく、自動更新が行われます。ハブアンドスポークモデルを使用している場合、TagOption をスポークレベルで製品に関連付ける必要があります。
ステップ 3 – ポートフォリオへの AWS Lambda ロールアクセスを設定する
- AWS Service Catalog 管理者のアクセス許可を持つ IAM ユーザーを使って AWS マネジメントコンソールにサインインし、AWS Service Catalog コンソールに移動します。
- 「管理」セクションで、[ポートフォリオリスト] を選択します。
- ポートフォリオリストページで、プロビジョニング済み製品の自動更新を有効にした製品を含むポートフォリオを選択します。
- ポートフォリオリスト – ポートフォリオ詳細ページで、[ユーザー、グループ、ロール] を選択します。
- ユーザー、グループ、ロール を追加の順に選択します。
- [ポートフォリオ名] のユーザー、グループ、ロールのアクセスを追加するページで [ロール] タブを選択し、ServiceCatalogMonitorRole、ServiceCatalogMonitorUpdateRole、ServiceCatalogMonitorCheckUpdateRole、ServiceCatalogMonitorLogRole ロールのチェックボックスをオンにして、[アクセスの追加] をクリックします。このロールは、ソリューション CloudFormation スタックが作成します。ポートフォリオへのアクセス権をロールに付与することにより、Lambda 関数はポートフォリオと製品に関連する必要なサービスカタログ定義を取得できます。
- 必要に応じて、このセクションの手順を他の Service Catalog ポートフォリオに対しても繰り返します。
ステップ 4 – Lambda 関数を実行する
CloudWatch Event ルールのトリガーを待たずにソリューションの動作を確認したい場合は、次のようにして手動でメインの Lambda 関数をトリガーできます。
- AWS マネジメントコンソールにサインインし、AWS Lambda コンソールに移動します。
- ServiceCatalogMonitor-Main 関数を選択します。
- ServiceCatalogMonitor-Main ページで、[テスト] を選択します。
- テストイベントの設定ページで [新しいテストイベントの作成] をクリックし、イベントテンプレートでデフォルトの [Hello World] オプションのままにします。イベント名を入力し、[作成] をクリックします。
このソリューションでデプロイした Lambda関数 は JSON 形式でログファイルを作成するため、スキャンされたプロビジョニング済み製品、プロビジョニング済み製品が最新バージョンからプロビジョニングされているかどうか、製品の更新のステータス(自動更新を設定している場合)を確認できます。Amazon Athena は、標準 SQL を使用して Amazon Simple Storage Service (Amazon S3) のデータを簡単に分析できるインタラクティブなクエリサービスです。次のステップでは、Amazon Athena を使用してログファイルをクエリする方法を詳しく見ていきます。
ステップ 5 – Amazon Athena を使ったログファイルの表示(オプション)
Lambda 関数が作成するログファイルは、次の形式になります。
{
"AutoUpdateProvisionedProduct": “”,
"Errors": "",
"ProvisionedProductName": "",
"AccountNo": "",
"ProductId": "",
"LaunchedBy": "",
"ProductName": "",
"StackName": "",
"LatestVersionName": "",
"ScannedTime": "",
"ProvisionedVersion": "",
"UpdateTimestamp": "",
"LatestVersionId": "",
"UpdateStatus": "",
"ProvisionedProductId": "",
"ProvisionedVersionName": ""
}
Amazon Athena テーブルを設定し、標準の SQL クエリを使って、次のようにログファイルのデータをクエリすることができます。
-
- AWS マネジメントコンソールにサインインし、Amazon Athena コンソールに移動します。
- 既存のデータベースを選択するか、新しいデータベースを作成します。
- 次の DDL で Amazon S3 の場所を更新し、テーブルを作成します(LOCATION の形式は「s3://< logS3Bucket>/<logS3Key>」です)。
CREATE EXTERNAL TABLE `central_service_catalog`(
`productname` string,
`scannedtime` timestamp,
`provisionedproductname` string,
`provisionedversion` string,
`provisionedversionname` string ,
`latestversionid` string ,
`latestversionname` string ,
`accountno` string,
`launchedby` string ,
`autoupdateprovisionedproduct` string,
`productid` string ,
`provisionedproductid` string,
`stackname` string,
`updatestatus` string,
`errors` string,
`updatetimestamp` timestamp)
ROW FORMAT SERDE
'org.openx.data.jsonserde.JsonSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
''
TBLPROPERTIES (
'has_encrypted_data'='false')
Amazon Athena でのデータベースとテーブルの作成の詳細については、こちらをクリックしてください。
-
- 以下は、SQL を使用してテーブルの結果をクエリする例です。
SELECT * FROM <dbname>."central_service_catalog"
order by scannedtime desc, accountno, productname, provisionedproductname
実際に確認する
ソリューションがデプロイ後にどのように機能するかを示すため、ポートフォリオと、MySQL 5.5.39 Amazon RDS データベースインスタンスである MySQL-RDS と呼ばれる AWS Service Catalog 製品(このブログ執筆時点で入手可能)の例を手動でセットアップしました。MySQL-RDS 製品の CloudFormation テンプレートで、AWS::RDS::DBInstance リソースの AllowMajorVersionUpgrade プロパティを true に指定し、メジャーバージョンのアップグレードを実行できるようにしました。
このソリューションの Lambda 関数には、製品の AWS CloudFormation テンプレート(この例では Amazon RDS)の基盤となる AWS リソースをそれぞれ使用するためのアクセス許可があることを確認する必要があります。これを行うために、必要な Amazon RDS アクセス許可を持つ IAM ロールを MySQL-RDS 製品の起動制約として適用しました。
ポートフォリオと製品をセットアップした後、前のセクションのステップ 2 と 3 で解説したように、CloudFormation テンプレートをデプロイして必要な設定を実行しました。
-
- CloudFormation テンプレートをデプロイした後、MySQL-RDS 製品の TagOption とポートフォリオへのロールアクセスを設定しました。
- このデモンストレーションのために、製品をプロビジョニングし、それを MySQL と呼びました。これは、MySQL-RDS 製品バージョン 1.0 からプロビジョニングされます。
- インスタンスのデータベースエンジンは MySQL 5.5.39 です。
- 次に、更新済み CloudFormation テンプレートで MySQL-RDS 製品の新しいバージョンを作成し、MySQL 5.6.39 を使用しました。
- ServiceCatalogMonitor-Main Lambda 関数を手動でトリガーしました。
- Lambda 関数をトリガーした後、AWS CloudFormation コンソールに移動し、プロビジョニング済み製品の CloudFormation スタックが更新されているのを確認できました。
- AWS Step Functions コンソールで ServiceCatalogMonitorStepFunction ステートマシンの新しい実行が作成されて、実行状態になりました。
- 実行名を選択すると、実行の詳細を確認できます。
- Step Function の実行が完了した後、RDS DB インスタンスは MySQL 5.6.39 にアップグレードされました。
- Lambda 関数はログファイルを作成し、CloudFormation スタックのパラメータで指定した S3 バケットに保存しました。
- Amazon Athena では、次の SQL クエリを使用して、Amazon S3 バケット内のログファイルの結果をクエリできます。
SELECT * FROM sampledb."central_service_catalog" order by scannedtime desc, accountno, productname, provisionedproductname
結果は次のようになります。
ソリューション全体がエンドツーエンドでどのように機能するか、また Amazon Athena でログファイルの結果を簡単にクエリできる方法を理解するのに、このデモンストレーションがお役に立てば幸いです。
まとめ
このブログ投稿では、CloudWatch Events ルール、AWS Lambda、AWS Step Functions を使用して、最新バージョンの製品が導入された場合に AWS Service Catalog のプロビジョニング済み製品を最新の状態に保つ方法をご紹介しました。AWS Service Catalog TagOption を使用することで、プロビジョニング済み製品の自動更新の有効化を選択できます。このため、ソリューションを AWS 環境に柔軟に適用できます。さらに、Amazon Athena を使ってソリューションからログファイルに簡単にクエリを実行し、AWS Service Catalog でプロビジョニング済み製品と更新のステータスを追跡することもできます。
ここで解説した方法で、 AWS Service Catalog ユーザーに、既存の IT サービスの更新を自動化するためのアイデアを提案できればうれしいです。これらの方法は、セルフサービスの利便性をユーザーに提供するだけでなく、IT 標準へのコンプライアンスも保証します。この記事にあるソリューション実装に関してご質問があれば、AWS Service Catalog フォーラムで新しいスレッドを立てるか、AWS サポートにお問い合わせください。
注: AWS Lambda コードパッケージと CloudFormation テンプレートを含む zip ファイルは、US-east-1 リージョンの Amazon S3 バケットでホストされています。他のリージョンにソリューションをデプロイする場合は、AWS Lambda コードパッケージ(service-catalog-monitor.zip)をダウンロードして、選択するリージョンの S3 バケットでホストし、ソリューションをデプロイする前に CloudFormation テンプレートの各 Lambda 関数の S3Bucket プロパティを更新して S3 バケットを指すようにしてください。
著者について
クラウドアーキテクトの Pimpuk Sansuth は、ASEAN を拠点に AWS プロフェッショナルサービスを提供しています。AWS エンタープライズのお客様と連携し、クラウド導入のお手伝いすることが大好きです。