[小ネタ]スタックで作成したVPCとサブネットのIDを取得しながらAD ConnectorをCLIで作成する

2020.11.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、コンサル部の鈴木(純)です。

AD Connectorを使う機会があったので、CloudFormationで書こうと思ったらまさかの非対応。

マネコンから作っても大した手間ではないのですが、CLIからできるならそっちの方がいいかなとシェルにしました。

作ったスクリプト

とりあえず作成したシェルスクリプトは以下。

# ADConnector作成シェル

DNS_NAME='cm-test.local' # ディレクトリの DNS 名
CUSTOMER_USER_NAME='adconnector' # サービスアカウントのユーザー名
USER_PASSWORD='P@ssword' # サービスアカウントのパスワード
SIZE='Small'
CUSTOMER_DNS_IPS='xx.xx.xx.xx' # DNS IP アドレス
NETWORK_STACK='NetworkStack' # VPCとサブネットを作成しているスタック名

# ネットワークスタックのOutputsから値を取得
VpcId=$(aws cloudformation describe-stacks --stack-name $NETWORK_STACK --profile $PROFILE | jq -r '.Stacks[] | .Outputs[] | select(.OutputKey == "Vpc") | .OutputValue ')
SubnetId1=$(aws cloudformation describe-stacks --stack-name $NETWORK_STACK --profile $PROFILE | jq -r '.Stacks[] | .Outputs[] | select(.OutputKey == "PrivateSubnetAZ1") | .OutputValue ')
SubnetId2=$(aws cloudformation describe-stacks --stack-name $NETWORK_STACK --profile $PROFILE | jq -r '.Stacks[] | .Outputs[] | select(.OutputKey == "PrivateSubnetAZ2") | .OutputValue ')

aws ds connect-directory --name $DNS_NAME\
                         --password $USER_PASSWORD\
                         --size $SIZE\
                         --connect-settings VpcId=$VpcId,SubnetIds=$SubnetId1,$SubnetId2,CustomerDnsIps=$CUSTOMER_DNS_IPS,CustomerUserName=$CUSTOMER_USER_NAME

必要なパラメータは基本的に変数を用意しているので、値を入れていきます。

前提

  • 当たり前ですが、AD Connectorを利用する前提を満たしている必要があります。以下ドキュメントの条件を確認しておきましょう。

  • インプットとなるパラメータで必要になるサービスアカウントのユーザーの作成方法は以下のエントリで紹介されています。

  • 一部jqを使っているコマンドがあるので、使う際にはインストールしておきましょう。

AD Connector作成シェルの詳細

あまり説明するところもないですが、少しだけ説明します。

AD Connectorでは以下のパラメータが必須です。

  • VPC ID
  • Subnet ID
  • Size
  • ディレクトリの DNS 名
  • DNS IP アドレス(2つ目はオプション)
  • サービスアカウントのユーザー名
  • サービスアカウントのパスワード

これらのパラメータに変数を用意してあげて、AD ConnectorのCLIに入れてあげています。

DNS_NAME='cm-test.local' # ディレクトリの DNS 名
CUSTOMER_USER_NAME='adconnector' # サービスアカウントのユーザー名
USER_PASSWORD='P@ssword' # サービスアカウントのパスワード
SIZE='Small'
CUSTOMER_DNS_IPS='xx.xx.xx.xx' # DNS IP アドレス
NETWORK_STACK='NetworkStack' # VPCとサブネットを作成しているスタック名

ここのパラメータは必須のNETWORK_STACK以外はAD Connectorに必須のパラメータです。それぞれ利用する環境に合わせて値を修正してください。

# ネットワークスタックのOutputsから値を取得
VpcId=$(aws cloudformation describe-stacks --stack-name $NETWORK_STACK --profile $PROFILE | jq -r '.Stacks[] | .Outputs[] | select(.OutputKey == "Vpc") | .OutputValue ')
SubnetId1=$(aws cloudformation describe-stacks --stack-name $NETWORK_STACK --profile $PROFILE | jq -r '.Stacks[] | .Outputs[] | select(.OutputKey == "PrivateSubnetAZ1") | .OutputValue ')
SubnetId2=$(aws cloudformation describe-stacks --stack-name $NETWORK_STACK --profile $PROFILE | jq -r '.Stacks[] | .Outputs[] | select(.OutputKey == "PrivateSubnetAZ2") | .OutputValue ')

ここはCloudFormationで作成したVPCとサブネットをスタックのアウトプットから取得していますが、必要ない方は以下のように書き換えてもいいと思います。

VpcId='vpc-xxxxxxxxxxxxxxxxx'

今回はVPCとサブネットをCloudFormationで作成していて、なるべくマネコンからの操作を減らしたかったのでスタックのOutputパラメータを参照するようにしています。

CLIからスタックのアウトプットパラメータを取得する方法は以下のエントリで紹介してるので参考にしてください。

aws ds connect-directory --name $DNS_NAME\
                         --password $USER_PASSWORD\
                         --size $SIZE\
                         --connect-settings VpcId=$VpcId,SubnetIds=$SubnetId1,$SubnetId2,CustomerDnsIps=$CUSTOMER_DNS_IPS,CustomerUserName=$CUSTOMER_USER_NAME

実際にCLIを実行している部分です。--connect-settingsも見やすく改行したかったんですが、うまくいかなかったので仕方なくそのまま。

こちらは各値に入れた変数を展開しているだけなのでそのままで大丈夫です。

補足

他に修正したくなった時には以下のリファレンスを参照しましょう。