記事
Tomohiro Iwamoto · 2021年2月16日 13m read

InterSystems IRIS デプロイガイド - AWS CloudFormation テンプレート - Windows編

目的

CloudFormationの記事は、Linux系のものが多いですが、Windowsでも自動化したいという需要がありそうですので、オリジナル記事を元に、CloudFormationを使用してミラークラスターをWindowsサーバにデプロイする例を実装してみました。また、簡単な実行例も追加しました。
ソースコード一式はこちらのGitレポジトリにあります。

更新: 2021年3月1日 ワンライナーで踏み台ホスト経由でWindowsに公開鍵認証する方法を追記しました

前提条件と要件

オリジナル記事と同じです。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を登録。
  • 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
      注意) firewallを無効に設定しています
  • IRISキット名

    • c:\cfn\scripts\Install-IRIS.ps1
      $DISTR="IRIS-2020.1.0.215.0-win_x64"
  • ドライブの作成、割り当て

    • 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を追加インストールしています。

その他

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 が出ますが無視)
また、ひと手間いりますが、踏み台ホストの.ssh/authorized_keys(パブリックキー)を、Windowsにコピーすれば、ワンライナーで公開鍵認証できます。

user@DESKTOP-XXXX MINGW64 ~ ssh -i .ssh/aws.pem -oProxyCommand="ssh -i .ssh/aws.pem -W %h:%p ec2-user@54.95.171.248" Administrator@10.0.0.62

Adminグループには特別の設定が必要でした。こちらのConfiguring the Serverを参考にしました。

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ホスト用に以下のサブネットを用意しました。

  • パブリックサブネット
    image

  • プライベートサブネット
    image

  • ルートテーブル/ルート
    image

  • ルートテーブル/サブネットの関連付け
    image

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バケットの準備

バケットの内容は下記のようになります。
image

MirrorCluster_Windows.yamlのオブジェクトURLを記録しておきます。
https://my-cf-templates.s3-ap-northeast-1.amazonaws.com/MirrorCluster_Wi...

コンソールからCloudFormationの実行

  1. スタックを「新しいリソースを使用」して作成します。
    操作の流れは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

「スタックオプションの設定」画面に特に設定はありません。実行がうまくいかない場合は、スタックの作成オプションの「失敗時のロールバック」を無効にしておくと、作成された環境がロールバックされずに残りますので、問題の解析がしやすくなります(不要になったら、忘れずに削除すること)。
「レビュー」画面にも特に設定はありません。
「スタックの作成」ボタンを押します。複数のネストされたスタックの作成が開始されます。

  1. 出力内容を確認します。
    スタックのステータスが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」,パスワードはパラメータで指定したものでログインしてください。

  1. ミラーの状態の確認
    管理ポータルのホーム画面の右端に「ミラー・モニターを表示」というリンクがありますので、クリックします。以下の画面のように表示されれば成功です。
    image

  2. 動作確認方法

  • 外部ロードバランサの確認
    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)になることを確認します。

参考にしたサイト

下記のサイトを参考にしています。

00
1 0 0 44
Log in or sign up to continue