InterSystems IRIS デプロイガイド - AWS CloudFormation テンプレート - Windows編
目的
CloudFormationの記事は、Linux系のものが多いですが、Windowsでも自動化したいという需要がありそうですので、オリジナル記事を元に、CloudFormationを使用してミラークラスターをWindowsサーバにデプロイする例を実装してみました。また、簡単な実行例も追加しました。
ソースコード一式はこちらのGitレポジトリにあります。
前提条件と要件
オリジナル記事と同じです。S3バケットに用意するキット及びライセンスキーはWindows用である必要があります。
$ aws s3 cp IRIS-2020.1.0.215.0-win_x64.exe s3://$BUCKET
オリジナルとの差異
デプロイ先をWindowsに変更する際に、Linux版との互換性を維持したままで、いくつかの修正を加えました。
- yaml内のdefault値を削除
- ご自分の環境にあったデフォルト値を設定してください。
- Windows用に新たなYAMLを2個追加
- MirrorNode.yaml → MirrorNode_Windows.yaml
- MirrorCluster.yaml→ MirrorCluster_Windows.yaml
- LatestAmiIdForIRISParameterパラメータを新設。Windowsのキット(日本語版、英語版等)を選択可能にするために使用。
- Arbiterのセキュリティーグループを独立
- RDPアクセス用にSecurityGroupIngress(ポート:3389)を追加
- 外部ロードバランサにリスナポート:52773を追加。ターゲットグループにポート:52773を追加。
- 本来、Webアクセス用に別途ウェブサーバを用意すべきですが、ひとまず組み込みのApacheをターゲットにしてあります。
- 内部ロードバランサを追加。リスナポート:52773を登録。ターゲットグループにポート:52773を登録。
- サーバ間の通信など、VPC内部での通信の際に、 (CSP,ECPクライアントと異なり)ミラーを認識しない通信モジュールから、どちらがミラーのプライマリメンバなのかを意識せずにアクセス可能にするため。
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/el...
- サーバ間の通信など、VPC内部での通信の際に、 (CSP,ECPクライアントと異なり)ミラーを認識しない通信モジュールから、どちらがミラーのプライマリメンバなのかを意識せずにアクセス可能にするため。
- CFの出力項目に下記を追加
- HTTPEndpointを追加。外部ロードバランサ経由で管理ポータルにアクセスする際のURL。
- IntHTTPEndpointを追加。内部ロードバランサ経由で管理ポータルにアクセスする際のURL。
- Node01ViaBastionAlt,Node02ViaBastionAltを追加。
- SSH -J 実行時のWindows版OpenSSHクライアント固有の問題「posix_spawn: No such file or directory」エラーの回避策が手間なので、同じ効果を持つコマンドを表示しています。
- SE.ShardInstallerクラス修正
- CreateMirroredDB()に第2引数(データベース作成場所)を追加、これに伴う修正。
- CreateMirrorSet(), JoinAsFailover()のコメントアウト部を復活
##class(SYS.Mirror)CreateMirrorSet(),JoinAsFailover()実行時のECPAddressのデフォルト($system.INetInfo.LocalHostName())が、Windowsでは"EC2AMAZ-F1UF3QM"のようなWindowsホスト名になる。このホスト名では他のホストからDNSで名前解決できないので、JoinMirrorAsFailoverMember()がエラーになる。そのため、下記のIPアドレス取得部分を復活させた。set hostName=$system.INetInfo.HostNameToAddr($system.INetInfo.LocalHostName())
set mirror("ECPAddress") = hostName
カスタマイズ候補
MirrorNode_Windows.yamlでPSファイル等を作成しています。下記の箇所は、環境・目的に応じて変更してください。
-
Windows環境のローカライズ(timezone, firewall設定)
- c:\cfn\scripts\Setup-config.ps1
-
IRISキット名
- c:\cfn\scripts\Install-IRIS.ps1
$DISTR="IRIS-2020.1.0.215.0-win_x64"
- c:\cfn\scripts\Install-IRIS.ps1
-
ドライブの作成、割り当て
- 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
その他
1. LBのヘルスチェック値
LBのヘルスチェックのデフォルト値を使用しています。MirrorCluster_Windows.yamlのコメントを解除して適切な値に調整してください。
#HealthCheckTimeoutSeconds: 10
#HealthCheckIntervalSeconds: 10
#UnhealthyThresholdCount: 3
2. スタンドアローンでの起動
スタック作成時に、MirrorNode_Windows.yamlを指定すれば、スタンドアローン構成でIRISを起動することが出来ます。この場合、デプロイするサブネットにはパブリックサブネットを選択してください。
3. WindowsへのSSH
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 .ssh/aws.pem -W %h:%p ec2-user@54.95.171.248" Administrator@10.0.0.62
Administrator@10.0.0.62's password: RDP接続の際に取得したパスワード
(load pubkey ".ssh/aws.pem": invalid format が出ますが無視)
本当はLinuxライクにパスワード入力無しでsshしたいのですが、有効な方法が見つかりませんでした。どなたかご存じの方、教えてください!
4. cfn-init.logにPythonのエラーが出る場合
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
実行例
Windows10クライアント環境からの実行例です。IRISホスト用に以下のサブネットを用意しました。
-
パブリックサブネット
-
プライベートサブネット
-
ルートテーブル/ルート
-
ルートテーブル/サブネットの関連付け
yamlの編集
Gitレポジトリの内容をローカルにcloneし、必要な編集を加えます。
- 必須の内容
MirrorCluster_Windows.yamlのTemplateURL値(4箇所あります)をS3バケット名に合うように変更してください。
TemplateURL: https://my-cf-templates.s3-ap-northeast-1.amazonaws.com/MirrorNode_Windows.yaml
繰り返し実行する場合は、下記の要領でご自分用のデフォルト値を設定しておくと便利です。
BastionSubnetIdParameter:
Default: 'subnet-0f7c4xxxxxxxxxxxx,subnet-05b42xxxxxxxxxxxx'
InstanceSubnetIdParameter:
Default: 'subnet-0180bxxxxxxxxxxxx,subnet-03272xxxxxxxxxxxx,subnet-08e8fxxxxxxxxxxxx'
S3BucketNameParameter:
Default: my-cf-templates
注意
- LBを設定するので、BastionSubnetIdParameterには必ず、異なるAZに属する2つのsubnetを指定してください。
- LBを設定するので、InstanceSubnetIdParameterには必ず、異なるAZに属する3つのsubnetを指定してください。はじめの2つがIRISホスト、最後に指定したサブネットがArbiterホストが稼働するサブネットになります。
- IRISをインストールするホストは、インストール作業の際に外部ネットワークへのアクセスを行います。具体的にはs3アクセスのためにaws cliが必要なのですが、chocolateyを使用してaws cliをインストールしています。一時的な環境作成目的などで、NATゲートウェイ等を構成済みのプライベートサブネットを構築済みで無い場合は、ひとまずInstanceSubnetIdParameterにもパブリックサブネットを指定して試してみるのも良いかもしれません。(踏み台ホストの意味がなくなりますが...)
編集が済んだら、s3バケットにコピーしてください。
s3バケットの準備
バケットの内容は下記のようになります。
MirrorCluster_Windows.yamlのオブジェクトURLを記録しておきます。
https://my-cf-templates.s3-ap-northeast-1.amazonaws.com/MirrorCluster_Wi...
コンソールからCloudFormationの実行
- スタックを「新しいリソースを使用」して作成します。
操作の流れはCloudFormationを使ってAWSにICMをデプロイすると同じです。
テンプレートソースには「Amazon S3 URL」を選択し、さきほど記録したURLを指定します。
「スタックの詳細を指定」画面でパラメータを設定します。
パラメータ | 設定値例 |
---|---|
Password for SuperUser/_SYSTEM user | SYS1 |
S3 bucket with IRIS binaries | my-cf-templates |
Which VPC should this be deployed to? | vpc-0e538xxxxxxxxxxxx |
Subnets to deploy Bastion host (public) | subnet-0f7c4xxxxxxxxxxxx,subnet-05b42xxxxxxxxxxxx |
Subnets to deploy IRIS (private subnet recommended) | subnet-0180bxxxxxxxxxxxx,subnet-03272xxxxxxxxxxxx,subnet-08e8fxxxxxxxxxxxx |
Allowed CIDR block for external access to the instances | 0.0.0.0/0 |
EC2 instance type for IRIS nodes | m5.large |
SSH Key Pair name to connect to EC2 instances | aws |
IAM Role for EC2 instances | S3FullAccessForEC2 |
Which language version of Windows should be deployed to? | /aws/service/ami-windows-latest/Windows_Server-2019-Japanese-Full-Base |
「スタックオプションの設定」画面に特に設定はありません。実行がうまくいかない場合は、スタックの作成オプションの「失敗時のロールバック」を無効にしておくと、作成された環境がロールバックされずに残りますので、問題の解析がしやすくなります(不要になったら、忘れずに削除すること)。
「レビュー」画面にも特に設定はありません。
「スタックの作成」ボタンを押します。複数のネストされたスタックの作成が開始されます。
- 出力内容を確認します。
スタックのステータスがCREATE_COMPLETEになるまで待機します(15分ほどかかりました)。
出力を表示します。ギアアイコンで行の折り返し指定が出来ます。
キー | 値 | 説明 |
---|---|---|
BastionPublicIP | 13.115.71.170 | Basion Host public IP |
HTTPEndpoint | http://iwa-NLB-4b1e6859b5a84ec3.elb.ap-northeast-1.amazonaws.com:52773/c... | SMP Endpoint as an example for HTTP access |
IntHTTPEndpoint | http://iwa-Internal-NLB-ae03aa0055ea57e5.elb.ap-northeast-1.amazonaws.co... | Endpoint for internal HTTP access |
JDBCEndpoint | jdbc:IRIS://iwa-NLB-4b1e6859b5a84ec3.elb.ap-northeast-1.amazonaws.com:51773/DATA | JDBC Connection String |
Node01PrivateIP | 10.0.10.43 | Node 01 Private IP |
Node01ViaBastion | ssh -J ec2-user@13.115.71.170 ec2-user@10.0.10.43 -L 52773:10.0.10.43:52773 | Node 01 Connection via Bastion |
Node01ViaBastionAlt | ssh -i .ssh\aws.pem -L 52773:10.0.10.43:52773 ec2-user@13.115.71.170 | Node 01 Connection via Bastion, Alternative way. |
Node02PrivateIP | 10.0.11.219 | Node 02 Private IP |
Node02ViaBastion | ssh -J ec2-user@13.115.71.170 ec2-user@10.0.11.219 -L 52773:10.0.11.219:52773 | Node 02 Connection via Bastion |
Node02ViaBastionAlt | ssh -i .ssh\aws.pem -L 52773:10.0.11.219:52773 ec2-user@13.115.71.170 | Node 02 Connection via Bastion, Alternative way. |
HTTPEndpointをクリックして、管理ポータルが表示されることを確認します。LBが作動するまで、しばらく時間がかかるので、少し待たされるかもしれません。ユーザ名「SuperUser」,パスワードはパラメータで指定したものでログインしてください。
-
ミラーの状態の確認
管理ポータルのホーム画面の右端に「ミラー・モニターを表示」というリンクがありますので、クリックします。以下の画面のように表示されれば成功です。 -
動作確認方法
- 外部ロードバランサの確認
Windows10クライアントから下記のコマンドを実行しHTTP/1.1 200 OKが返ることを確認します。URLのホスト名は先ほど使用したHTTPEndpoint値のホスト名です。
C:\Users\iwamoto>curl http://iwa-NLB-4b1e6859b5a84ec3.elb.ap-northeast-1.amazonaws.com:52773/csp/mirror_status.cxw -v
* Trying 3.114.52.16...
* TCP_NODELAY set
* Connected to iwa-NLB-4b1e6859b5a84ec3.elb.ap-northeast-1.amazonaws.com (3.114.52.16) port 52773 (#0)
> GET /csp/mirror_status.cxw HTTP/1.1
> Host: iwa-NLB-4b1e6859b5a84ec3.elb.ap-northeast-1.amazonaws.com:52773
> User-Agent: curl/7.55.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/plain
< Connection: close
< Content-Length: 7
<
SUCCESS* Closing connection 0
- 内部ロードバランサの確認
ターミナルエミュレータ等で踏み台ホストにsshし、下記のコマンドを実行しHTTP/1.1 200 OKが返ることを確認します。URLのホスト名は先ほど取得したIntHTTPEndpoint値のホスト名です。
[ec2-user@ip-172-31-37-178 ~]$ curl http://iwa-Internal-NLB-ae03aa0055ea57e5.elb.ap-northeast-1.amazonaws.com:52773/csp/mirror_status.cxw -v
・
・
< HTTP/1.1 200 OK
・
・
- プライマリメンバを停止
プライマリメンバのIRISホスト(Node01)にRDP接続し、IRISを停止します。
その際、(推奨に従って)Node01をプライベートサブネットに作成した場合、直接RDP接続できませんので、下記のようなコマンドをWindowsで実行し、localhostから転送する必要があります。実際のコマンドは出力のNode01ViaBastionAltのポートを52773->3389に読み替えることで取得することができます。
C:\Users\iwamoto>ssh -i .ssh\aws.pem -L 3389:10.0.10.43:3389 ec2-user@13.115.71.170
また、Windowsのパスワードは、AWSコンソールからのRDP接続方法で取得しておかないといけません。
その上で、RDPでlocalhostに接続し、Administrator/取得したパスワード、でログインします。
ミラーの旧バックアップメンバがプライマリに切り替わったことがLBに認識されるまでは下記のエラーが出力されます。
curl: (7) Failed to connect to http://iwa-NLB-4b1e6859b5a84ec3.elb.ap-northeast-1.amazonaws.com port 52773: Connection refused
少々時間がかかります(さきほどのLBのヘルスチェック値による)が、その後、外部・内部ロードバランサの応答が共にSUCCESS(HTTP/1.1 200 OK)になることを確認します。
参考にしたサイト
下記のサイトを参考にしています。