在 Amazon Web Services (AWS) 上安装 NetScaler 代理
NetScaler 代理作为 NetScaler Console 与数据中心或云中发现的实例之间的中介。
先决条件
要在 Amazon Web Services (AWS) 虚拟私有云 (VPC) 中通过使用 Amazon GUI 启动 NetScaler 代理 AMI,需要:
-
一个 AWS 账户
-
一个 AWS 虚拟私有云 (VPC)
-
一个 IAM 账户
-
一个服务 URL 和激活码,供代理连接到 NetScaler Console 服务。在 NetScaler Console 服务 GUI 中,导航到 基础架构 > 实例 > 代理 并单击 生成激活码 以生成您的服务 URL 和激活码。
注意
在预置 NetScaler 代理虚拟机之前,Citrix 建议创建安全组、虚拟专用网络、密钥对、子网和其他实体。这样,网络信息在预置期间即可用。
为了使 NetScaler 代理能够与 NetScaler Console 和 NetScaler 实例通信,请确保推荐的端口已打开。有关 NetScaler 代理的端口要求的完整详细信息,请参阅端口。
要在 AWS 上安装 NetScaler 代理:
-
使用您的 AWS 凭据登录到 AWS Marketplace。
-
在搜索字段中,键入 NetScaler 代理 以搜索 NetScaler 代理 AMI,然后单击 前往。
-
在搜索结果页面上,从可用列表中单击 NetScaler Console 外部代理 AMI。
-
在 NetScaler Console 外部代理 AMI 页面上,单击 继续订阅。
-
订阅成功后,单击 继续配置。
-
在 配置此软件 页面上:
-
从 履行选项 列表中选择 AMI。
-
从 软件版本 列表中选择最新的 NetScaler 代理版本。
-
从 区域 列表中选择您的区域。
-
单击 继续启动
-
-
在 启动此软件 页面上,有两个选项可以注册 NetScaler 代理:
-
从网站启动
-
使用 EC2 启动
-
从网站启动
要从网站启动,请选择:
-
从 EC2 实例类型 列表中选择一个 EC2 实例类型
-
从 VPC 设置 列表中选择一个 VPC。单击 在 EC2 中创建 VPC 为您的软件创建 VPC。
-
从 子网设置 列表中选择一个子网。在选择 VPC 后,单击 在 EC2 中创建子网 以创建子网。
-
从 安全组设置 列表中选择一个用于防火墙的安全组。单击 根据卖家设置新建 以创建安全组。
-
从 密钥对设置 列表中选择一个密钥对以确保访问安全。单击 在 EC2 中创建密钥对 为您的软件创建密钥对。
-
单击 启动
-
从网站启动成功。
注意
- 部署过程可能需要大约 10–15 分钟。部署成功完成后,可以在 AWS 账户中查看 NetScaler 代理虚拟机。
-
代理部署后,为 NetScaler 代理分配一个名称。
-
代理启动并运行后,为 NetScaler 代理分配一个弹性 IP 地址。
注意
- 弹性 IP 地址使 NetScaler 代理能够与 NetScaler Console 通信。但是,如果已配置 NAT 网关以将流量路由到 Internet,则可能不需要弹性 IP 地址。
-
使用 SSH 客户端登录到 NetScaler 代理。
注意
-
可以使用以下方法之一登录到 NetScaler 代理:
-
使用
nsrecover
作为用户名,并使用 AWS 实例 ID 作为密码。 -
使用
nsroot
作为用户名,并使用有效的密钥对作为密码。
-
-
输入以下命令以调用部署屏幕:deployment_type.py
-
输入已从 NetScaler Console 中的 设置代理 页面复制并保存的 服务 URL 和 激活码,如 入门 中所述。代理使用服务 URL 定位服务,并使用激活码向服务注册。
代理注册成功后,代理将重新启动以完成安装过程。
代理重新启动后,访问 NetScaler Console 并在 设置代理 页面上的 发现的代理 下验证代理的状态。
使用 EC2 启动
要使用 EC2 启动,请从 选择操作 列表中选择 通过 EC2 启动,然后单击 启动。
-
在 选择实例类型 页面上,选择实例,然后单击 下一步:配置实例详细信息。
-
在 配置实例详细信息 页面上,指定所需的参数。
在 高级详细信息 部分下,可以通过在 用户数据 字段中指定身份验证详细信息或脚本来启用零接触代理。
-
身份验证详细信息 - 指定已从 NetScaler Console 中的 设置代理 页面复制的 服务 URL 和 激活码,如 入门 中所述。以以下格式输入详细信息。
registeragent -serviceurl <apigatewayurl> -activationcode <activationcodevalue> <!--NeedCopy-->
代理使用此信息在启动期间自动向 NetScaler Console 注册。
-
脚本 - 将代理自动注册脚本指定为用户数据。以下是一个示例脚本:
#!/var/python/bin/python2.7 import os import requests import json import time import re import logging import logging.handlers import boto3 ''' Overview of the Script: The script helps to register a NetScaler agent with NetScaler Console. Pass it in userdata to make NetScaler agent in AWS to autoregister on bootup. The workflow is as follows 1) Fetch the NetScaler Console API credentials (ID and secret) from AWS secret store (NOTE: you have to assign IAM role to the NetScaler agent that will give permission to fetch secrets from AWS secret store) 2) Login to NetScaler Console with credentials fetched in step 1 3) Call NetScaler Console to fetch credentials (serviceURL and token) for agent registration 4) Calls registration by using the credentials fetched in step 3 ''' ''' These are the placeholders which you need to replace according to your setup configurations aws_secret_id: Id of the AWS secret where you have stored NetScaler Console Credentials The secrets value should be in the following json format { "adm_user_id_key": "YOUR_ID", " adm_user_secret_key": "YOUR_SECRET"} ''' aws_secret_id = "<AWS_secret_id>" adm_ip_or_hostname = "<YOUR_ADM_POP>.adm.cloud.com" ''' Set up a specific logger with your desired output level and log file name ''' log_file_name_local = os.path.basename(__file__) LOG_FILENAME = '/var/log/' + 'bootstrap' + '.log' LOG_MAX_BYTE = 50*1024*1024 LOG_BACKUP_COUNT = 20 logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) logger_handler = logging.handlers.RotatingFileHandler(LOG_FILENAME, maxBytes=LOG_MAX_BYTE, backupCount=LOG_BACKUP_COUNT) logger_fortmater = logging.Formatter(fmt='%(asctime)-2s:%(funcName)30s:%(lineno)4d: [%(levelname)s] %(message)s', datefmt="%Y-%m-%d %H:%M:%S") logger_handler.setFormatter(logger_fortmater) logger.addHandler(logger_handler) class APIHandlerException(Exception): def __init__(self, error_code, message): self.error_code = error_code self.message = message def __str__(self): return self.message + ". Error code '" + str(self.error_code) + "'" def parse_response(response, url, print_response=True): if not response.ok: if "reboot" in url: logger.debug('No response for url: reboot') resp = {"errorcode": "500", "message": "Error while reading response."} return resp if print_response: logger.debug('Response text for %s is %s' % (url, response.text)) response = json.loads(response.text) logger.debug("ErrorCode - " + str(response['errorcode']) + ". Message -" + str(response['message'])) raise APIHandlerException(response['errorcode'], str(response['message'])) elif response.text: if print_response: logger.debug('Response text for %s is %s' % (url, response.text)) result = json.loads(response.text) if 'errorcode' in result and result['errorcode'] > 0: raise APIHandlerException(result['errorcode'], str(result['message'])) return result def _request(method, url, data=None, headers=None, retry=3, print_response=True): try: response = requests.request(method, url, data=data, headers=headers) result = parse_response(response, url, print_response=print_response) return result except [requests.exceptions.ConnectionError, requests.exceptions.ConnectTimeout]: if retry > 0: return _request(method, url, data, headers, retry-1, print_response=print_response) else: raise APIHandlerException(503, 'ConnectionError') except requests.exceptions.RequestException as e: logger.debug(str(e)) raise APIHandlerException(500, str(e)) except APIHandlerException as e: logger.debug("URL: %s, Error: %s, Message: %s" % (url, e.error_code, e.message)) raise e except Exception as e: raise APIHandlerException(500, str(e)) try: '''Get the AWS Region''' client = boto3.client('s3') my_region = client.meta.region_name logger.debug("The rgion is %s" % (my_region)) '''Creating a Boto cleint session''' session = boto3.session.Session() client = session.client( service_name='secretsmanager', region_name=my_region ) '''Getting the values stored in the secret with id: <aws_secret_id>''' get_id_value_response = client.get_secret_value( SecretId = aws_secret_id ) adm_user_id = json.loads(get_id_value_response["SecretString"])["adm_user_id_key"] adm_user_secret = json.loads(get_id_value_response["SecretString"])["adm_user_secret_key"] except Exception as e: logger.debug("Fetching of NetScaler Console credentials from AWS secret failed with error: %s" % (str(e))) raise e ''' Initializing common NetScaler Console API handlers ''' mas_common_headers = { 'Content-Type': "application/json", 'Accept-type': "application/json", 'Connection': "keep-alive", 'isCloud': "true" } ''' API to login to the NetScaler Console and fetch the Session ID and Tenant ID ''' url = "https://" + str(adm_ip_or_hostname) + "/nitro/v1/config/login" payload = 'object={"login":{"ID":"' + adm_user_id + '","Secret":"' + adm_user_secret + '"}}' try: response = _request("POST", url, data=payload, headers=mas_common_headers) sessionid = response["login"][0]["sessionid"] tenant_id = response["login"][0]["tenant_name"] except Exception as e: logger.debug("Login call to the NetScaler Console failed with error: %s" % (str(e))) raise e ''' API to fetch the service URL and Token to be used for registering the agent with the NetScaler Console ''' mas_common_headers['Cookie'] = 'SESSID=' + str(sessionid) url = "https://" + str(adm_ip_or_hostname) + "/nitro/v1/config/trust_preauthtoken/" + tenant_id +"?customer="+ tenant_id logger.debug("Fetching Service URL and Token.") try: response = _request("GET", url, data=None, headers=mas_common_headers) service_name = response["trust_preauthtoken"][0]["service_name"] token = response["trust_preauthtoken"][0]["token"] api_gateway_url = response["trust_preauthtoken"][0]["api_gateway_url"] except Exception as e: logger.debug("Fetching of the Service URL Passed with error. %s" % (str(e))) raise e ''' Running the register agent command using the values we retrieved earlier ''' try: registeragent_command = "registeragent -serviceurl "+api_gateway_url+" -activationcode "+service_name+"\;"+token file_run_command = "/var/python/bin/python2.7 /mps/register_agent_cloud.py "+registeragent_command logger.debug("Executing registeragent command: %s" % (file_run_command)) os.system(file_run_command) except Exception as e: logger.debug("Agent Registeration failed with error: %s" % (str(e))) raise e <!--NeedCopy-->
此脚本从 AWS Secrets Manager 中获取身份验证详细信息,并运行
deployment.py
脚本以向 NetScaler Console 注册代理。
注意
-
虽然可以自动分配公共 IP 地址,但也可以分配弹性 IP 地址。未配置 NAT 网关时需要分配弹性 IP 地址。
-
如果在此步骤中未设置弹性 IP 地址,仍然可以在 EC2 控制台上进行设置。可以创建一个新的弹性 IP 地址,并使用实例 ID 或 ENI-ID 将其与 NetScaler 代理关联。
单击 添加存储。
-
-
在 添加存储 页面上,配置实例的存储设备设置,然后单击 下一步:添加标签。
-
在 添加标签 页面上,定义实例的标签,然后单击 下一步:配置安全组。
-
在 配置安全组 页面上,添加规则以允许特定流量到实例,然后单击 审核并启动。
-
在 审核实例启动 页面上,审核实例设置,然后单击 启动。
-
在 选择现有密钥对或创建新密钥对 对话框中,创建一个密钥对。也可以从现有密钥对中选择。
接受确认,然后单击 启动实例。
部署过程可能需要大约 10–15 分钟。部署成功完成后,可以在 AWS 账户中查看 NetScaler 代理虚拟机。