IICS Secure AgentをWindows環境にインストールしてみる(2023年版)

2023年時点での、Amazon EC2上のWindows Server2019にIICSのSecure Agentをインストールする手順例をまとめました。
2023.08.08

データアナリティクス事業本部の鈴木です。

IICSのSecure AgentをWindows環境にインストールしたい機会がありました。

以前、以下のように梶原裕さんが記事を書いてくれていましたが、少し時間も経っているので改めて手順を実施してみました。

前提

Windows環境でのSecure Agent利用について

Secure AgentはWindowsのプラットフォームでも動作可能です。

Data Integration』のガイドのうち、『Secure Agent requirements on Windows』のページに要件の記載があります。

OSの選び方についてですが、下記のページにProduct Availability Matrix (PAM)をみてくださいという案内があったので、ページにアクセスしてPAMを確認しました。

記事執筆時点ではWindowsのプラットフォームは10 Enterprise2016 Server2019 ServerのOS Versionがあったので、今回は2019 Serverにて構築しました。

環境構築先について

今回はAmazon EC2上に構築しました。冒頭で紹介したブログに記載のCloudFormationテンプレートで実施しましたが、EC2に付与するIAMロールでは、パラメータで渡す名前のS3バケットへのアクセスを許可したので、改めて記載します。

なお、あくまで構築手順確認用のテンプレートなので、運用される際はよりセキュアなネットワーク構成にしてください。

AWSTemplateFormatVersion: 2010-09-09
Description: Windows Server for IICS Secure Agent
Parameters:
  Prefix:
    Description: Prefix
    Type: String
  AZ1:
    Description: AZ1
    Type: String
    Default: a
  WorkS3Bucket:
    Description: Key of S3 bucket
    Type: String
  LatestWindowsAmiId :
    Type : 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    AllowedValues: 
      - '/aws/service/ami-windows-latest/Windows_Server-2016-Japanese-Full-Base'
      - '/aws/service/ami-windows-latest/Windows_Server-2016-English-Full-Base'
      - '/aws/service/ami-windows-latest/Windows_Server-2019-Japanese-Full-Base'
    Default: '/aws/service/ami-windows-latest/Windows_Server-2019-Japanese-Full-Base'

  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instances
    Type: String
    MinLength: '1'
    MaxLength: '64'
    AllowedPattern: '[-_ a-zA-Z0-9]*'
    ConstraintDescription: can contain only alphanumeric characters, spaces, dashes
      and underscores.

Resources:
  #-----------------------------------------------------------------------------
  # VPC
  #-----------------------------------------------------------------------------
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 192.168.0.0/24
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: !Sub "${Prefix}-vpc"
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: !Sub "${Prefix}-Public-rtb"
  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Sub "${AWS::Region}${AZ1}"
      VpcId: !Ref VPC
      CidrBlock: 192.168.0.0/28
      Tags:
        - Key: Name
          Value: !Sub "${Prefix}-Public-subnet"
  PublicSubnetAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref PublicRouteTable
  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId:
        Ref: PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId:
        Ref: InternetGateway
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
      - Key: Application
        Value:
          Ref: AWS::StackId
      - Key: Network
        Value: Public
  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId:
        Ref: VPC
      InternetGatewayId:
        Ref: InternetGateway
  #-----------------------------------------------------------------------------
  # EC2 Instance
  #-----------------------------------------------------------------------------
  InstanceWindows:
    Type: "AWS::EC2::Instance"
    Properties:
      IamInstanceProfile: !Ref ServerProfile
      ImageId: !Ref LatestWindowsAmiId
      InstanceType: m5a.xlarge
      KeyName:
        Ref: KeyName
      BlockDeviceMappings:
        - DeviceName: "/dev/sda1"
          Ebs:
            VolumeType : 'gp2'
            VolumeSize: 100
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          DeviceIndex: "0"
          SubnetId: !Ref PublicSubnet
      UserData:
        Fn::Base64: |
          <script>
          @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command " [System.Net.ServicePointManager]::SecurityProtocol = 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
          tzutil.exe /s "Tokyo Standard Time"
          Set-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -name "HideFileExt" -Value 0
          Set-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -name "Hidden" -Value 1
          Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False
          choco install awscli -y
          choco install GoogleChrome -y
          choco install vscode -y
          </script>
      Tags:
        - Key: Name
          Value: !Sub "${Prefix}-Windows-Instance"
  #-----------------------------------------------------------------------------
  # IAM
  #-----------------------------------------------------------------------------
  ServerRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          -
            Effect: "Allow"
            Principal:
              Service:
                - "ec2.amazonaws.com"
            Action:
                - "sts:AssumeRole"
      ManagedPolicyArns:
        -  "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
  S3BucketPolicyForSSM:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: S3BucketPolicyForSSM
      Roles:
        - !Ref ServerRole
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          -
            Effect: "Allow"
            Action: "s3:GetObject"
            Resource:
              - !Sub "arn:aws:s3:::aws-ssm-${AWS::Region}/*"
              - !Sub "arn:aws:s3:::aws-windows-downloads-${AWS::Region}/*"
              - !Sub "arn:aws:s3:::amazon-ssm-${AWS::Region}/*"
              - !Sub "arn:aws:s3:::amazon-ssm-packages-${AWS::Region}/*"
              - !Sub "arn:aws:s3:::${AWS::Region}-birdwatcher-prod/*"
              - !Sub "arn:aws:s3:::patch-baseline-snapshot-${AWS::Region}/*"
  S3BucketPolicy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: S3BucketPolicy
      Roles:
        - !Ref ServerRole
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          -
            Effect: "Allow"
            Action: "s3:*"
            Resource:
              - !Sub "arn:aws:s3:::${WorkS3Bucket}"
              - !Sub "arn:aws:s3:::${WorkS3Bucket}/*"
  ServerProfile:
    Type: "AWS::IAM::InstanceProfile"
    Properties:
      Path: "/"
      Roles:
        - Ref: ServerRole
      InstanceProfileName: !Sub "${Prefix}-Server"

やってみる

1. EC2キーペアの作成

まずAWSのマネジメントコンソールからEC2に接続するためのキーペアを作成しました。これは事前に作成するようにCloudFormationテンプレートを作成しているためです。

EC2のキーペアを作成からキーペアを作成し、自動的にダウンロードされた.pemファイルを保存しておきました。

キーペア作成

2. EC2およびネットワークリソースの作成

先に記載したCloudFormationテンプレートを使ってリソースを作成しました。

LatestWindowsAmiId/aws/service/ami-windows-latest/Windows_Server-2019-Japanese-Full-Baseとしました。

3. Windows Serverへのアクセス

EC2が起動したら、EC2のコンソールの接続からインスタンスに接続画面を開き、RDPクライアントタブでFleet Managerを使用して接続するを選択し、Fleet Manager Remote Desktopを押しました。

インスタンスに接続

ノードIDが接続したいインスタンスのものであることを確認し、認証タイプをキーペアとして、ローカルに保存しておいたキーファイルを選択してConnectを押して接続しました。

リモートデスクトップ

4. インストーラーの準備

セキュアエージェントのインストーラーの準備をしました。

セキュアエージェントを追加したい組織のユーザーでIICSにログインし、管理者ランタイム環境よりSecure Agentのダウンロードを押しました。

Secure Agentのダウンロード

Secure Agentのダウンロードのポップアップが出るので、プラットフォームはWindows 64を選び、インストールトークンを控えて、ダウンロードを押して、インストーラーをダウンロードしました。

ポップアップ

なお、インストールトークンは後の手順で使用します。

インストーラーはWindows Serverへ転送します。方法はなんでもいいのですが、私の場合はEC2がアクセス権のあるS3バケットにアップロードし、Windows ServerからAWS CLIにてダウンロードしました。

5. インストーラーの実行

インストーラーを実行してSecure Agentをインストールしました。

まずインストーラーをダブルクリックして起動しました。日本語を選んでOKを押しました。

言語選択

インストールフォルダの選択はデフォルトとして次に進みました。

インストールフォルダの選択

インストール前のサマリを確認し、インストールを押しました。

インストール前のサマリ

インストールが始まるので、正常に終わることを確認しました。

インストール実行

完了すると、Secure Agentの登録を求められるので以下を入力して登録を押しました。

  • ユーザー名: インストーラーのダウンロードの際に使ったIICSのユーザー名
  • インストールトークン: インストーラーのダウンロード時に控えたインストールトークン

Secure Agentの登録

Secure Agent Coreが実行されている旨が表示されればインストールは完了です。

完了の確認

しばらく待ってランタイム環境をIICSのコンソールから確認すると、インストールしたSecure Agent用の環境が追加されており、ステータスが実行中となりました。実行中とならない場合は、セキュアエージェントの再起動などをするとよいと思います。

追加されたランタイム

6. アセットの動作確認

新しく作成したセキュアエージェントでアセットが実行できるか確認しました。

今回は以前に作っておいたマッピングタスクを実行できるか確認しました。

マッピングタスクを開き、ランタイム環境を新しいものに変えました。

マッピングタスクのランタイム環境の変更

このマッピングではS3接続を使っていたので、S3接続の方のランタイム環境も変更しました。

S3接続の変更

マッピングタスクを実行し、指定したランタイム環境で正常に終了したことを確認しました。

マッピングタスクの結果

最後に

2023年時点での、Amazon EC2上のWindows Server2019にIICSのSecure Agentをインストールする手順例をまとめました。参考になりましたら幸いです。

ほかの参考にした文献