CloudFormationの記事は、Linux系のものが多いですが、Windowsでも自動化したいという需要がありそうですので、オリジナル記事を元に、CloudFormationを使用してミラークラスターをWindowsサーバにデプロイする例を実装してみました。また、簡単な実行例も追加しました。
ソースコード一式はこちらのGitレポジトリにあります。
更新: 2021年3月1日 ワンライナーで踏み台ホスト経由でWindowsに公開鍵認証する方法を追記しました
更新: 2022年11月29日 QuickStartの形式に合わせて大幅に変更しました。以前の内容はこちらに保存してあります。
更新: 2022年12月21日 踏み台ホストの使用を止め、代わりにAWS System Manager(SSM)を有効化しました。プライベートサブネット上のインスタンスへのアクセスが簡素化されます。以前の内容はこちらに保存してあります。
QuickStartのデプロイ方法に従います。
非公開のS3バケットにIRISのキット及びライセンスキーをアップロードします。
- IRISをWindowsにデプロイする場合
S3BucketName=<my bucket>
aws s3 mb s3://$S3BucketName
aws s3 cp iris.key s3://$S3BucketName
aws s3 cp ISCAgent-2022.1.0.209.0-lnxrh7x64.tar.gz s3://$S3BucketName
aws s3 cp IRIS-2022.1.0.209.0-win_x64.exe s3://$S3BucketName
- IRISをLinux(AmazonLinuxあるいはRedHat7/x64)にデプロイする場合
S3BucketName=<my bucket>
aws s3 mb s3://$S3BucketName
aws s3 cp iris.key s3://$S3BucketName
aws s3 cp ISCAgent-2022.1.0.209.0-lnxrh7x64.tar.gz s3://$S3BucketName
aws s3 cp IRIS-2022.1.0.209.0-lnxrh7x64.tar.gz s3://$S3BucketName
- IRISをLinux(Ubuntu/x64)にデプロイする場合
S3BucketName=<my bucket>
aws s3 mb s3://$S3BucketName
aws s3 cp iris.key s3://$S3BucketName
aws s3 cp ISCAgent-2022.1.0.209.0-lnxrh7x64.tar.gz s3://$S3BucketName
aws s3 cp IRIS-2022.1.0.209.0-lnxubuntu2004x64.tar.gz s3://$S3BucketName
このテンプレートは、AmazonLinuxを使用しています。RedHat7もしくはUbuntuを利用する場合は、別途「カスタマイズ候補」のチャプターの作業が必要です
また、事前にAWS上に用意されているテンプレートではなく、カスタマイズを行ったテンプレートを使用するので、下記を実行します。
QSS3BucketNameはS3BucketNameと同じでも、異なっていても構いません。
$ git clone https://github.com/IRISMeister/AWSIRISDeployment.git --recursive
$ cd AWSIRISDeployment
Windowsにデプロイする場合
QSS3BucketName=<my bucket>
aws s3 cp quickstart-intersystems-iris-windows s3://$QSS3BucketName/quickstart-intersystems-iris-windows --recursive
aws s3 cp submodules/quickstart-aws-vpc/templates s3://$QSS3BucketName/quickstart-intersystems-iris-windows/submodules/quickstart-aws-vpc --recursive
aws s3 cp submodules/quickstart-linux-bastion/templates s3://$QSS3BucketName/quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion --recursive
aws s3 cp submodules/quickstart-linux-bastion/scripts s3://$QSS3BucketName/quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion --recursive
Linuxにデプロイする場合
QSS3BucketName=<my bucket>
aws s3 cp quickstart-intersystems-iris s3://$QSS3BucketName/quickstart-intersystems-iris --recursive
aws s3 cp submodules/quickstart-aws-vpc/templates s3://$QSS3BucketName/quickstart-intersystems-iris/submodules/quickstart-aws-vpc --recursive
aws s3 cp submodules/quickstart-linux-bastion/templates s3://$QSS3BucketName/quickstart-intersystems-iris/submodules/quickstart-linux-bastion --recursive
aws s3 cp submodules/quickstart-linux-bastion/scripts s3://$QSS3BucketName/quickstart-intersystems-iris/submodules/quickstart-linux-bastion --recursive
以下、既存VPCにWindows版IRISのミラー構成をデプロイする際の実行例です。
VPCを新規作成する場合は、下記のVPC関連の事前準備は不要です。
既存VPC上に、以下のリソースを事前に用意しました。
デプロイ実行時にNATゲートウエイが無いと、スタックの作成に失敗します。必ず用意してください。
S3BucketName=iwamoto-cf-templates
aws s3 mb s3://$S3BucketName
aws s3 cp ISCAgent-2022.1.0.209.0-lnxrh7x64.tar.gz s3://$S3BucketName
aws s3 cp iris.key s3://$S3BucketName
aws s3 cp IRIS-2022.1.0.209.0-win_x64.exe s3://$S3BucketName
git clone https://github.com/IRISMeister/AWSIRISDeployment.git
cd AWSIRISDeployment
# キットファイル格納先と同じbucketを使用しています
QSS3BucketName=iwamoto-cf-templates
aws s3 cp quickstart-intersystems-iris-windows s3://$QSS3BucketName/quickstart-intersystems-iris-windows --recursive
aws s3 cp submodules/quickstart-aws-vpc/templates s3://$QSS3BucketName/quickstart-intersystems-iris-windows/submodules/quickstart-aws-vpc --recursive
aws s3 cp submodules/quickstart-linux-bastion/templates s3://$QSS3BucketName/quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion --recursive
aws s3 cp submodules/quickstart-linux-bastion/scripts s3://$QSS3BucketName/quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion --recursive
このような内容になります。
aws s3 ls s3://$QSS3BucketName --recursive
2022-06-15 07:48:57 675737136 IRIS-2022.1.0.209.0-win_x64.exe
2022-10-12 01:09:57 16139988 ISCAgent-2022.1.0.209.0-lnxrh7x64.tar.gz
2022-03-29 07:11:24 546 iris.key
2022-11-25 09:15:50 0 quickstart-intersystems-iris-windows/
2022-11-25 09:16:05 0 quickstart-intersystems-iris-windows/scripts/
2022-11-28 05:34:49 6008 quickstart-intersystems-iris-windows/scripts/MirrorInstaller.xml
2022-11-28 13:34:52 0 quickstart-intersystems-iris-windows/submodules/
2022-11-28 13:34:52 0 quickstart-intersystems-iris-windows/submodules/quickstart-aws-vpc/
2022-11-28 13:34:52 0 quickstart-intersystems-iris-windows/submodules/quickstart-aws-vpc/templates/
2022-11-28 13:34:52 59966 quickstart-intersystems-iris-windows/submodules/quickstart-aws-vpc/templates/aws-vpc.template.yaml
2022-11-28 13:34:52 0 quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion/
2022-11-28 13:34:52 0 quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion/scripts/
2022-11-28 13:34:52 531 quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion/scripts/auditing_configure.sh
2022-11-28 13:34:52 881 quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion/scripts/banner_message.txt
2022-11-28 13:34:52 11763 quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion/scripts/bastion_bootstrap.sh
2022-11-28 13:34:52 0 quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion/templates/
2022-11-28 13:34:52 24068 quickstart-intersystems-iris-windows/submodules/quickstart-linux-bastion/templates/linux-bastion.template
2022-11-25 09:16:16 0 quickstart-intersystems-iris-windows/templates/
2022-11-28 09:35:42 6059 quickstart-intersystems-iris-windows/templates/iris-cluster-arbiter-node.template.yaml
2022-11-28 09:35:42 21529 quickstart-intersystems-iris-windows/templates/iris-cluster-iris-node.template.yaml
2022-11-28 09:35:42 13736 quickstart-intersystems-iris-windows/templates/iris-cluster-main.template.yaml
2022-11-28 09:35:43 10403 quickstart-intersystems-iris-windows/templates/iris-entrypoint-new-vpc.template.yaml
繰り返し実行することを考慮して、パラメータを全て指定した状態のテンプレートを作成しておくと便利です。
vi test-iris-cluster-main-windows.yaml
編集後のファイルをうっかり公開してしまわないよう注意してください
編集時の注意
- BastionSubnetIdParameterには、異なるAZに属する2つのpublic subnetを指定してください。
- InstanceSubnetIdParameterには、異なるAZに属する3つのsubnetを指定してください。はじめの2つがIRISホスト、最後に指定したサブネットがArbiterホストが稼働するサブネットになります。
- IRISをインストールするホストは、インストール作業の際にインターネットへのアクセスを行います。具体的にはs3アクセスのためにaws cliが必要(amazon linuxと違ってUbuntuにはプリインストールされていません)なのですが、その他にもchocolateyを使用してaws cliをインストールしています。NATゲートウェイ等を構成済みのプライベートサブネットを構築済みで無い場合は、こちらを参考にして一時的に追加してください。
NATゲートウェイは存在するだけでコストが発生します。(VM起動直後のS/Wインストール時など)必要な時に作成し、不要になったらすぐ削除したかったので、別のCFテンプレートにしています。
- スタックを「新しいリソースを使用」して作成します。
テンプレートソースには「テンプレートファイルのアップロード」を選択し、先ほど編集したファイル(test-iris-cluster-main-windows.yaml)を指定します。
「スタックの詳細を指定」画面でパラメータを設定します。
パラメータ | 設定値例 |
---|---|
BastionSubnetIdParameter | subnet-0f7c4xxxxxxxxxxxx,subnet-05b42xxxxxxxxxxxx |
IRISPasswordParameter | SYS1 |
InstanceSubnetIdParameter | subnet-0180bxxxxxxxxxxxx,subnet-03272xxxxxxxxxxxx,subnet-08e8fxxxxxxxxxxxx |
QSS3BucketName | iwamoto-cf-templates |
QSS3BucketRegion | ap-northeast-1 |
QSS3KeyPrefix | quickstart-intersystems-iris-windows/ |
S3BucketNameParameter | iwamoto-cf-templates |
SshKeyParameter | aws |
VpcIdParameter | vpc-0e538xxxxxxxxxxxx |
「スタックオプションの設定」画面に特に設定はありません。実行がうまくいかない場合は、スタックの作成オプションの「失敗時のロールバック」を無効にしておくと、作成された環境がロールバックされずに残りますので、問題の解析がしやすくなります(不要になったら、忘れずに削除すること)。
「レビュー」画面で、「The following resource(s) require capabilities:」で、下記にチェックをいれる必要があります。
- AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。
- AWS CloudFormation によって、次の機能が要求される場合があることを承認します: CAPABILITY_AUTO_EXPAND
「スタックの作成」ボタンを押します。複数のネストされたスタックの作成が開始されます。
- 出力内容を確認します。
スタックのステータスがCREATE_COMPLETEになるまで待機します(15分ほどかかりました)。
スタック(アップロードしたスタックではなく、ネストされたxxx-IRISStack-xxxx)の出力を表示します。ギアアイコンで行の折り返し指定が出来ます。
Stack | キー | 値 | 説明 |
---|---|---|---|
IRIStack | JDBCEndpoint | jdbc:IRIS://xxxx-NLB-xxxxx.elb.ap-northeast-1.amazonaws.com:51773/DATA | JDBC Connection String |
IRIStack | Node01InstanceId | i-xxxxxxxxxx | Node 01 Instance ID |
IRIStack | Node01PrivateIP | 10.0.12.85 | Node 01 Private IP |
IRIStack | Node02InstanceId | i-xxxxxxxxxx | Node 02 Instance ID |
IRIStack | Node02PrivateIP | 10.0.10.159 | Node 02 Private IP |
これらの出力値を記録しておいてください。
Node01ホスト(ミラープライマリサーバ)の管理ポータルに接続します。下記のコマンドを実行します。
- 踏み台ホストを使用しない場合
セッションマネージャのポート転送を利用します。事前にAWS CLIのインストール・構成とSSMプラグインのインストールが必要です。私はWindows10+WSL2(Ubuntu)を使用していますので、下記を実行しました。
$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb" -o "session-manager-plugin.deb"
$ sudo dpkg -i session-manager-plugin.deb
$ export instanceid=i-xxxxxxxxxx
$ aws ssm start-session --target $instanceid \
--document-name AWS-StartPortForwardingSession \
--parameters '{"portNumber":["52773"],"localPortNumber":["52773"]}'
SSHトンネルを作成する方法もあります。
- 踏み台ホストを使用する場合
BastionPublicIP=54.168.xxx.xxx
Node01PrivateIP=10.0.12.85
ssh -i aws.pem -L 52773:$Node01PrivateIP:52773 ec2-user@$BastionPublicIP
この時点で、http://localhost:52773/csp/sys/UtilHome.csp で管理ポータルにアクセスできます。アカウントはSuperUser、パスワードはスタックのパラメータで指定したものを使用します。ミラーの状態を確認するために、管理ポータルのホーム画面の右端に「ミラー・モニターを表示」というリンクがありますので、クリックします。以下の画面のように表示されていれば正常です。
RDP接続する場合は、(推奨に従って)Node01をプライベートサブネットに作成している場合、ssh同様、RDPも直接接続できません。フリートマネージャーをRDPの代替えとして利用可能です。
フリートマネージャーを使しない場合は、下記のようなコマンドをローカルで実行し、localhostから転送する必要があります。
- 踏み台ホストを使用しない場合
$ export instanceid=i-xxxxxxxxxx
$ aws ssm start-session --target $instanceid \
--document-name AWS-StartPortForwardingSession \
--parameters '{"portNumber":["3389"],"localPortNumber":["33389"]}'
- 踏み台ホストを使用する場合
ssh -i aws.pem -L 33389:$Node01PrivateIP:3389 ec2-user@$BastionPublicIP
Windowsのパスワードは、AWSコンソールからのRDP接続方法で取得します。 その上で、RDPでlocalhost:33389に接続し、Administrator/取得したパスワード、でログインします。
- 踏み台ホストを使用しない場合
SSMのセッションマネージャを使用します。
あるいは、~/.ssh/configを設定することで、SSM経由でSSHアクセスすることも可能です。
$ export instanceid=i-xxxxxxxxxx
$ ssh -i aws.pem ec2-user@$instanceid
- 踏み台ホストを使用する場合
BastionPublicIP=54.168.xxx.xx
Node01PrivateIP=10.0.12.85
ssh -i aws.pem -L 52773:$Node01PrivateIP:52773 ec2-user@$BastionPublicIP
ssh -i aws.pem -L 33389:$Node01PrivateIP:3389 ec2-user@$BastionPublicIP
ssh -i aws.pem -oProxyCommand="ssh -i aws.pem -W %h:%p ec2-user@$BastionPublicIP" ec2-user@$Node01PrivateIP
or
ssh -i aws.pem -oProxyCommand="ssh -i aws.pem -W %h:%p ec2-user@$BastionPublicIP" ubuntu@$Node01PrivateIP
BastionPublicIPは、事前に用意した踏み台ホストの公開IPです。
- 外部ロードバランサ経由のアクセス
この時点で、JDBC経由でアクセス可能になっているはずです。JDBCEndpointを使用してアクセスします。
手順は省略します。実行にはJDBCドライバが必要です。
iris-cluster-iris-node.template.yamlでPSファイル等を作成しています。下記の箇所は、環境・目的に応じて変更してください。
-
Windows環境のローカライズ(timezone, firewall設定)
- c:\cfn\scripts\Setup-config.ps1 注意) firewallを無効に設定しています
-
ドライブの作成、割り当て
- Resourcesセクション
Resources: NodeInstance: Properties: BlockDeviceMappings:
- c:\cfn\scripts\drives.diskpart.txt
-
IRISインストール先など
- c:\cfn\scripts\Install-IRIS.ps1
$irisdir="h:\InterSystems\IRIS" $irissvcname="IRIS_h-_intersystems_iris" $irisdbdir="I:\iris\db\" $irisjrndir="J:\iris\jrnl\pri" $irisjrnaltdir="K:\iris\jrnl\alt"
このpsファイルは、実行時に作成される/temp/envs.ps1と組み合わせれば、IRISの無人インストール用のスクリプトとして機能します。
-
プリインストールするソフトウェア
- c:\cfn\scripts\Install-choco-packages.ps1
s3からファイルを入手する場合、awscliは必須です。利便性のためnotepadplusplus, google chromeを追加インストールしています。
- c:\cfn\scripts\Install-choco-packages.ps1
-
O/Sの指定
現在、O/Sは利便性によりAmazon Linuxを指定してあります。
O/SをRedHatに変更するには下記ファイルの内容を変更してください。
quickstart-intersystems-iris\templates\iris-cluster-iris-node.template.yaml
LatestAmiIdParameter:
Type: AWS::EC2::Image::Id
Default: ami-0be4c0b05bbeb2afd
O/SをUbuntuに変更するには下記ファイルの内容を変更してください。
quickstart-intersystems-iris\templates\iris-cluster-iris-node.template.yaml
LatestAmiIdParameter:
Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
Default: /aws/service/canonical/ubuntu/server/focal/stable/current/amd64/hvm/ebs-gp2/ami-id
IRISKitNameParameter:
Type: String
Default: IRIS-2022.1.0.209.0-lnxubuntu2004x64
デプロイ先をWindowsに変更する際に、Linux版との互換性を維持したままで、いくつかの修正を加えました。
-
Windowsの起動に時間がかかるため、デフォルトのInstance typeをm5.largeからm5.xlargeに変更。gp2をgp3に変更。IOPSを指定。
-
LatestAmiIdForIRISParameterパラメータを新設。Windowsのキット(日本語版、英語版等)の指定。
-
IRISKitNameParameterパラメータを新設。キット名の指定。
-
RDPアクセス用にSecurityGroupIngress(ポート:3389)を追加
-
SE.ShardInstallerクラス修正
- CreateMirrorSet(), JoinAsFailover()を変更
##class(SYS.Mirror).CreateMirrorSet(),JoinAsFailover()実行時のECPAddressのデフォルト($system.INetInfo.LocalHostName())が、Windowsでは"EC2AMAZ-F1UF3QM"のようなWindowsホスト名になる。このホスト名では他のホストからDNSで名前解決できないので、JoinMirrorAsFailoverMember()がエラーになる。そのため、下記を追加。
CreateMirrorSet()
set mirror("ECPAddress") = hostName // Windows on AWS need this
JoinAsFailover()
set MirrorInfo("ECPAddress") = hostName // Windows on AWS need this
- CreateMirrorSet(), JoinAsFailover()を変更
-
Roleを追加
キット用S3バケットに対するs3:GetObject
ec2:Describe*
ec2:DeleteRoute
ec2:CreateRoute
ec2:ReplaceRoute
セッションマネージャ有効化のため
AmazonSSMManagedInstanceCore
- Linux用のcloud-initのUserData(初回起動時に実行されるshell)にO/SがUbuntu,RedHat7の場合分けを追加
- 踏み台ホストをデプロイしない代わりにAWS System Managerを有効化
LBのヘルスチェックのデフォルト値を使用しています。quickstart-intersystems-iris-windows\templates\iris-cluster-main.template.yamlのコメントを解除して適切な値に調整してください。
#HealthCheckTimeoutSeconds: 10
#HealthCheckIntervalSeconds: 10
#UnhealthyThresholdCount: 3
以下、テンプレートと作成されるAWSリソースの関係です。
テンプレート名 | 作成されるリソース |
---|---|
iris-cluster-iris-node.template.yaml | スタンドアロン |
iris-cluster-iris-main.template.yaml | ミラー環境 |
iris-entrypoint-new-vpc.template.yaml | VPC+ミラー環境 |
AWS System Managerを有効化しているため、いずれも踏み台ホストは作成しません。必要であれば、このテンプレートを参考にして作成しください。
環境の明滅を繰り返し実行する可能性がある場合、パラメータを全て指定した状態のテンプレートを別途作成しておくと便利です。
テンプレート名 | O/S | 用途 |
---|---|---|
test-iris-cluster-iris-node-linux.yaml | Linux | スタンドアロン |
test-iris-cluster-iris-node-windows.yaml | Windows | スタンドアロン |
test-iris-cluster-iris-main-linux.yaml | Linux | ミラー環境 |
test-iris-cluster-iris-main-windows.yaml | Windows | ミラー環境 |
test-iris-entrypoint-new-vpc-linux.yaml | Linux | VPC+ミラー環境 |
test-iris-entrypoint-new-vpc-windows.yaml | Windows | VPC+ミラー環境 |
例えば、スタンドアローン構成でIRISを起動したい場合は、下記のファイルを編集します。
$ #デプロイするサブネット(InstanceSubnetIdParameterの値)には既存のパブリックサブネットを指定してください
$ vi test-iris-cluster-iris-node-linux.yaml
スタック作成時に、test-iris-cluster-iris-node-windows.yamlを指定すれば、スタンドアローン構成でIRISを起動することが出来ます。
SSMのセッションマネージャを使用します。
踏み台ホストの使用を止めたため、下記内容は無効になりました。下記の方法を試す場合は、別途、こちらのようなテンプレートを利用して踏み台ホストを作成してください。
IRIS稼働ホストにOpenSSHをインストールすれば、踏み台ホスト経由で、IRISホストにSSHする事が可能です。ただし、Linux版に比べて、Windows版のIRISではCLIで実行できることが限られているため、効果は限定的です。
IRIS稼働ホストで実行。
PS C:\Users\Administrator> Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
PS C:\Users\Administrator> Start-Service sshd
Windowクライアントからアクセスする際には、Windows版OpenSSHクライアント固有の問題「posix_spawn: No such file or directory」を回避するために、Git同梱のBashを使用しました。
user@DESKTOP-XXXX MINGW64 ~ ssh -oProxyCommand="ssh -i aws.pem -W %h:%p ec2-user@54.95.xxx.xxx" Administrator@10.0.0.62
Administrator@10.0.0.62's password: RDP接続の際に取得したパスワード
(load pubkey "aws.pem": invalid format が出ますが無視)
また、ひと手間いりますが、踏み台ホストの.ssh/authorized_keys(パブリックキー)を、デプロイ先のWindowsにコピーすれば、ワンライナーで公開鍵認証できます。
user@DESKTOP-XXXX MINGW64 ~ ssh -i aws.pem -oProxyCommand="ssh -i aws.pem -W %h:%p ec2-user@54.95.xxx.xxx" Administrator@10.0.0.62
Adminグループには特別の設定が必要でした。こちらのConfiguring the Serverを参考にしました。
cfn-init.logに下記のようなエラーが出ることがあるようです。
2021-02-12 02:50:32,957 [ERROR] -----------------------BUILD FAILED!------------------------
2021-02-12 02:50:32,957 [ERROR] Unhandled exception during build: 'utf8' codec can't decode byte 0x83 in position 8: invalid start byte
回避されることを期待して、Install-IRIS.ps1に、以下の命令を追加しています。
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
下記のサイトを参考にしています。
- https://aws.amazon.com/jp/quickstart/architecture/intersystems-iris
- https://dev.classmethod.jp/articles/about-windows-cfn-init-non-ascii-encoding-error/
- https://dev.classmethod.jp/articles/aws-cloudformation-setup-windows-server-2016/
- https://aws.amazon.com/jp/premiumsupport/knowledge-center/cloudformation-drive-letters-windows/
- https://www.concurrency.com/blog/may-2019/key-based-authentication-for-openssh-on-windows