Amazon Web Services ブログ

ハイブリッドノード管理のためのAWS Systems Manager ハイブリッドアクティベーションを自動化する

このブログは、Justin Thomas (Cloud Support Engineer with AWS Premium Support) によって執筆された内容を⽇本語化したものです。原⽂はこちらを参照して下さい。

AWS Systems Manager は、AWS およびオンプレミスインフラストラクチャ上のサーバーを可視化および制御するための AWS サービスです。Systems Manager を使用すると、ハイブリッド環境の管理が簡単に行えます。

ハイブリッド環境のサーバーと仮想マシン (VM) を Systems Manager マネージドインスタンスとしてセットアップするには、マネージドインスタンスのアクティベーションを作成します。オンプレミスのサーバーと VM 向けの Systems Manager ハイブリッドアクティベーションを作成および管理することは、手作業かつ冗長的な作業になります。ハイブリッドアクティベーションには、アクティベーションの有効期限とサーバーの登録制限数があります。どちらかの値を超えると、そのハイブリッドアクティベーションを使用したサーバー登録ができなくなります。ハイブリッドアクティベーションは手動で再作成する必要があり、新しい認証情報を使用するようにサーバーを更新する必要もでてきます。ポイントとなるのは、Systems Manager ハイブリッドアクティベーションの作成と管理を自動化して、このタスクに必要な運用を減らすことです。

ソリューション概要

このソリューションは、AWS CloudFormation スタックを使用します。Cloudformation スタックは、ソリューションに必要な AWS リソースをお客様のアカウントに作成します。作成されるリソースは以下の通りです。

  • Amazon API Gateway: プライベートタイプの REST APIで、AWS Lambda 関数と統合します。オンプレミスサーバーから API Gateway に GET リクエストを実行すると、ハイブリッドアクティベーションのコードと ID の組み合わせが返されます。
  • AWS Lambda: Lambda 関数は、API Gateway を介してオンプレミスサーバーにハイブリッドアクティベーションのコード/ID の組み合わせを提供します。既存のアクティベーションコードの有効期限が切れているか、登録制限に達していることが判明した場合、新しいアクティベーションコードが作成されます。
  • Amazon DynamoDB: 状態を保存するために、クライアントからのリクエストを処理している場合、Lambda はテーブルを「Locked」状態に更新します。リクエストの処理が完了すると、テーブルが「Unlocked」に更新されます。
  • Amazon VPC エンドポイント: オンプレミスネットワークから API Gateway URL にプライベートにアクセスするための API Gateway の VPC エンドポイントです。
  • AWS Systems Manager パラメータストア: ハイブリッドアクティベーション ID/コードを保存します。

ソリューション概要

以下は処理の簡単な流れです。

  1. Web クライアントは、プライベート API Gateway エンドポイント (GET など) を呼び出します。
  2. オンプレミスサーバーから接続する場合、オンプレミス DNS サーバーは、VPC エンドポイントのプライベート IP アドレスを取得するために VPC DNS にリクエストを転送するように設定する必要があります。DNS サーバーは IP アドレスを解決し、Web クライアントに送り返します。
  3. リクエストは、API Gateway の VPC エンドポイントのプライベート IP アドレスに送信されます。
  4. API Gateway のリソースポリシーがチェックされ、リクエストが API Gateway の VPC エンドポイントから送信されているかどうかが確認されます。ポリシーに一致しないリクエストは、ブロックされます。
  5. API Gateway は、統合リクエストを通じて Lambda にリクエストを渡します。
  6. Lambda は DynamoDB の状態キーを「Locked」に更新し、リクエストを処理していることを示します。
  7. Lambda はパラメータストアから認証情報を取得し、クライアントに送り返します。

ウォークスルー

前提条件

このウォークスルーを行うための前提条件は以下の通りです。

Step1: API Gateway の VPC エンドポイントを作成

最初のステップでは、API Gateway の VPC エンドポイントを作成します。また、エンドポイントにアタッチするセキュリティグループを作成して、TCP ポート 443 を許可します。CloudFormation を使用してこれを自動化するには、次の手順を使用します。

API Gateway の VPC エンドポイントがすでに存在する場合は、このステップをスキップして、既存の VPC エンドポイント ID を書き留めておいてください。

  1. CloudFormation テンプレートをダウンロードします。
  2. 希望するリージョンの AWS CloudFormation コンソールにアクセスしてください。
  3. スタックの作成を選択し、新しいリソースを使用 (標準) を選択します。
  4. スタックの作成ページで、テンプレートのアップロードを選択します。前のステップでダウンロードしたテンプレートを選択し、次へを選択します。
  5. スタック名を指定します。たとえば、apigateway-vpcendpoint-setup などです。
  6. CloudFormation スタックには、次のスクリーンショットに示すように、いくつかのパラメーター設定が必要です。
    • (訳注) AllowedIPRange: TCP 443 で VPC エンドポイントへのインバウンドアクセスを許可するCIDR
    • (訳注) SubnetsForVpcEndpoint: VPC エンドポイントを作成するサブネット
    • (訳注) VpcIdForApiGateway: API Gateway 用のVPC ID

CloudFormation スタックのパラメータ設定例

  1. スタックオプションの設定ページで次へを選択します。
  2. 設定オプションを確認し、スタックの作成を選択します。
  3. スタックのステータスが CREATE_COMPLETE であることを確認します。
  4. スタックが作成されたら、スタックの 出力セクションを参照し、VPC エンドポイント ID をコピーします。

Step2: KMS キーの作成

このステップでは、パラメータストアを暗号化するための AWS Key Management Service (AWS KMS) キーを作成します。ここでは、パラメータストアを使用してアクティベーションコードとアクティベーション ID を格納します。KMS キーを作成する手順は以下の通りです。

  1. こちらから AWS KMS コンソールを開きます。
  2. ナビゲーションペインで、カスタマー管理型のキーを選択し、キーの作成を選択します。
  3. キータイプは対称を選択し、次へを選択します。
  4. その他の設定内容を確認して、キーを作成します。
  5. 作成したら、キー ID を書き留めます。

Step3: API gateway と Lambda の作成

最後のステップでは、プライベート API と Lambda 関数を作成してデプロイします。CloudFormation を使用してこれを自動化するには、次の手順を使用します。

  1. CloudFormation テンプレートをダウンロードします。
  2. 希望するリージョンの AWS CloudFormation コンソールにアクセスしてください。
  3. スタックの作成を選択し、新しいリソースを使用 (標準)を選択します。
  4. スタックの作成ページで、テンプレートのアップロードを選択します。前のステップでダウンロードしたテンプレートを選択し、次へを選択します。
  5. スタック名を指定します。たとえば、apigateway-lambda-setup などです。
  6. CloudFormation スタックには、次のスクリーンショットに示すように、いくつかのパラメーター設定が必要です。
    • (訳注) ApiGatewayStageName: デプロイする API Gateway のステージ名
    • (訳注) KmsKeyId: パラメータストアを暗号化するための KMS キーの ID
    • (訳注) VpcEndpointForApiGateway: API Gateway 用の VPC エンドポイント

CloudFormation スタックのパラメータ設定例

  1. パラメータの詳細を確認し、「AWS CloudFormation が IAM リソースを作成する可能性があることを認めます」というチェックボックスをオンにします。次に、スタックの作成を選択してリソースの構築を開始します。
  2. スタックが作成されたら、スタックの出力セクションを参照し、API Gateway の呼び出し URL をコピーします。

CloudFormation スタックの出力

  1. 登録が必要なオンプレミスサーバーから、curl/wget または他の Web クライアントを使用して、コピーした URL にアクセスします。アクティベーション ID/コードの組み合わせは JSON 形式で返されます。次の例では、Linuxターミナルで、curlとオプションのjqパッケージコマンドを使用して、出力を成形しています。
[root@ec2amaz-r1rvyg ~]# curl -s https://o2h4ocy7q6.execute-api.us-east-1.amazonaws.com/lambdastage | jq '.'
{
  "ActivationId": "e50a8437-23dd-4326-9e79-5e3b7573493e",
  "ActivationCode": "vVcH9zJX4ROy2XTsh5cb"
}

この例の URL は、自身の環境の CloudFormation スタック出力の URL に置き換える必要があることに注意してください。

VPC エンドポイントポリシーを使用することで、上記で作成したプライベート API のセキュリティを向上させることができます。VPC エンドポイントポリシーは、インターフェイス VPC エンドポイントにアタッチして、エンドポイントへのアクセスを制御できる IAM リソースポリシーです。VPC エンドポイントポリシーは、API Gateway リソースポリシーと併用できます。リソースポリシーは、API にアクセスできるプリンシパルを指定するために使用されます。エンドポイントポリシーは、VPC エンドポイント経由で呼び出すことができるプライベート API を指定します。

詳細は「API Gateway でプライベート API 用の VPC エンドポイントポリシーを使用する」を参照してください。

自動アクティベーションのサンプルスクリプト

SSM エージェントをインストールする際、Shell/PowerShell スクリプトで CloudFormation で作成した API Gatewayの呼び出し URL を設定できます。テストと検証のために、Redhat ベースのサーバーまたは Windows Server で以下のサンプルスクリプトを保存して実行できます。大規模にデプロイするには、サーバーの起動時にスクリプトを実行します。

Linux:

– ハイブリッドアクティベーション認証情報を取得し、取得した認証情報を使用して SSM エージェントをインストールし、us-east-1 リージョンに登録するシェルスクリプト

#!/bin/bash
sudo yum erase amazon-ssm-agent --assumeyes

credentials=$(curl -s https://cla9phiczg.execute-api.us-east-1.amazonaws.com/lambdastage)
activationcode=$(echo $credentials | jq -r '.ActivationCode')
activationid=$(echo $credentials| jq -r '.ActivationId') 

mkdir /tmp/ssm
curl https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm -o /tmp/ssm/amazon-ssm-agent.rpm
sudo dnf install -y /tmp/ssm/amazon-ssm-agent.rpm
sudo systemctl stop amazon-ssm-agent
sudo -E amazon-ssm-agent -register -code $activationcode -id $activationid -region us-east-1
sudo systemctl start amazon-ssm-agent

この例のURLは、自身の環境のCloudFormationスタックの出力のURLに置き換えてください。

Windows:

– ハイブリッドアクティベーション認証情報を取得し、取得した認証情報を使用して SSM エージェントをインストールし、us-east-1 リージョンに登録する PowerShell スクリプト

$credential = Invoke-WebRequest -URI https://cla9phiczg.execute-api.us-east-1.amazonaws.com/lambdastage | Select-Object -ExpandProperty Content
$credentialPSObject = $credential | ConvertFrom-Json
 
$code = $credentialPSObject.ActivationCode
$id = $credentialPSObject.ActivationId
$region = "us-east-1"
$dir = $env:TEMP + "\ssm"
 
New-Item -ItemType directory -Path $dir -Force
cd $dir
(New-Object System.Net.WebClient).DownloadFile("https://amazon-ssm-$region.s3.$region.amazonaws.com/latest/windows_amd64/AmazonSSMAgentSetup.exe", $dir + "\AmazonSSMAgentSetup.exe")
Start-Process .\AmazonSSMAgentSetup.exe -ArgumentList @("/q", "/log", "install.log", "CODE=$code", "ID=$id", "REGION=$region") -Wait
Get-Content ($env:ProgramData + "\Amazon\SSM\InstanceData\registration")
Get-Service -Name "AmazonSSMAgent"

この例のURLは、自身の環境のCloudFormationスタックの出力のURLに置き換えてください。

クリーンアップ

環境をクリーンアップするには、Systems Manager からサーバーの登録を解除します。次に、ウォークスルーで作成した AWS CloudFormation スタックを削除します。削除するには、まず API Gateway と Lambda の作成のステップで作成した CloudFormation スタックを削除し、続いて API Gateway の VPC エンドポイントを作成のステップで作成した CloudFormation スタックを削除します。最後に、ウォークスルーで作成した KMS キーを削除します。

まとめ

このブログでは、Systems Manager ハイブリッドアクティベーションの作成を自動化する方法を説明しました。このソリューションを採用することで、ハイブリッド環境デバイスを Systems Manager にすばやく登録し、ハイブリッドアクティベーションに関わる運用負荷をを最小限に抑えることができます。

著者について

Justin Thomas

Justin Thomas は、AWS プレミアムサポートのクラウドサポートエンジニアです。彼は AWS Systems Manager、Linux、シェルスクリプティングを専門としています。仕事以外では、Justin は友人や家族と時間を過ごしたり、新しい食べ物を試したり、映画を見たりすることを楽しんでいます。

 

翻訳は Solutions Architect の上野が担当しました。原文はこちらです。