【带图操作指南】iPad 在 Amazon WorkSpaces 上箭头键无法使用?使用 Client VPN 和 RDP 构建替代环境

iPad 在 Amazon WorkSpaces 上箭头键无法使用?使用 Client VPN 和 RDP 构建替代环境
  • 在 iPad 上使用 Amazon WorkSpaces 时,可能会遇到箭头键无法识别的问题。
  • 本文将介绍如何通过 Client VPN 和 RDP 解决该问题,并在 iPad 上构建顺畅的远程操作环境。
  • 对于第一次使用 Client VPN 的用户,本文提供了详细的设置步骤及图片指导。

本文为以下文章的续篇。
之前的设置方法请参阅下文。

问题

我们公司向员工分发了 iPad(第10代)作为工作设备。
员工在平时的居家办公中使用各自的电脑访问 WorkSpaces 进行工作。
由于 iPad 上也可以安装 WorkSpaces 客户端应用程序,因此我们考虑让员工在外出时使用 iPad 连接到 WorkSpaces 进行工作。

我们设想使用 iPad 的 Magic Keyboard 进行操作,但遇到了一个问题,即虽然可以登录 WorkSpaces,但箭头键无法使用。

原因

经过研究,我无法确认原因或同一事件,说实话,原因不明。
由于是在多台设备上发生的,所以似乎不是设备方面的问题,但我在网上也找不到任何类似事件的报告。

不过,我已经按以下方法解决了这个问题,现在我暂时可以操作方向键了,所以这很好。

方法

总而言之,我们通过 RDP 连接到 WorkSpaces。
问题似乎出在 PCoIP 连接上,通过使用 RDP 连接 WorkSpaces,可以正常使用箭头键。
以下内容作为参考。

我如何使用 RDP 连接到我的 WorkSpace?
https://repost.aws/zh-Hans/knowledge-center/connect-workspace-rdp

不过,由于希望保持 WorkSpaces 所在的子网为私有子网,我们还决定使用 AWS Client VPN。
因为在 WorkSpaces 中已经使用了 Directory Service,因此可以直接用于 AWS Client VPN 的认证。
这相当方便,员工可以使用平时的密码连接 AWS Client VPN。
配置如下所示。

管理员方面的步骤

我采取的配置准备步骤如下:

创建 Route 53 托管区域

员工通过 RDP 连接到 WorkSpaces 时,需要输入 WorkSpaces 的 IP 地址。
由于只有管理员(我)可以查看 IP 地址,单独通知每位员工会很麻烦。
因此,我们决定基于用户 ID 自动分配域名。

  1. 请通过以下 URL 创建 Route 53 托管区域:
    https://us-east-1.console.aws.amazon.com/route53/v2/hostedzones#CreateHostedZone
  2. 使用以下设置进行配置:
    • 域名:user.workspaces
    • 类型:⦿ 私有托管区
    • 要与托管区关联的 VPC
      • 区域:美国东部(弗吉尼亚北部)
      • VPC ID:WorkSpaces 所在的 VPC
图像

创建 Lambda 处理程序

可以通过 Lambda 处理程序设置在连接 Client VPN 时需要同时执行的程序或操作。
由于 WorkSpaces 处于活动状态时成本较高,因此设置为 AutoStop 模式。
因此,Lambda 处理程序会在每次需要时启动 WorkSpaces。
此外,Lambda 处理程序会将 WorkSpaces 的 IP 地址注册到 Route 53 托管区域。

  1. 请运行以下 AWS CLI 命令来创建 Lambda 函数的 IAM 角色:
AWS CLI 命令
# Create IAM role
aws iam create-role \
--role-name LambdaCustomRole \
--assume-role-policy-document '{
   "Version": "2012-10-17",
   "Statement": [
       {
           "Effect": "Allow",
           "Principal": {
               "Service": "lambda.amazonaws.com"
           },
           "Action": "sts:AssumeRole"
       }
   ]
}'

# Attach the IAM policy required for updating Route 53
aws iam attach-role-policy \
--role-name LambdaCustomRole \
--policy-arn arn:aws:iam::aws:policy/AmazonRoute53FullAccess

# Attach the IAM policy required for updating WorkSpaces
aws iam attach-role-policy \
--role-name LambdaCustomRole \
--policy-arn arn:aws:iam::aws:policy/AmazonWorkSpacesAdmin

# Attach the IAM policy required for logging
aws iam attach-role-policy \
--role-name LambdaCustomRole \
--policy-arn arn:aws:iam::aws:policy/CloudWatchLogsFullAccess
  1. 请通过以下 URL 创建 Lambda 函数:
    https://us-east-1.console.aws.amazon.com/lambda/home?region=us-east-1#/create/function
  2. 使用以下设置进行配置:
    • 函数名称:AWSClientVPN-ReadyWorkSpaces
      * 必须以 “AWSClientVPN-” 开头
    • 运行时:Python 3.12
    • 执行角色:LambdaCustomRole
图像
  1. 前往 [配置] 选项卡 > [常规配置],将超时时间改为1分钟。
图像
  1. 接下来输入 Lambda 函数的代码。
    大部分由 ChatGPT 编写,代码如下:
AWSClientVPN-ReadyWorkSpaces 代码
import boto3

def lambda_handler(event, context):
    
    # 资源信息
    directory = '<directory ID>'
    hostedzone = '<host zone ID>'
    domain = 'user.workspaces'
    
    # 从事件中获取用户名
    username = event.get('username')
    
    if not username:
        return {
            "allow": True,
            "error-msg-on-failed-posture-compliance": "Username not provided",
            "posture-compliance-statuses": [],
            "schema-version": "v2"
        }
    
    # 创建 WorkSpaces 客户端。
    workspaces_client = boto3.client('workspaces')
    
    # 获取用户的工作空间
    response = workspaces_client.describe_workspaces(
        DirectoryId=directory,
        UserName=username
    )
    workspaces = response.get('Workspaces', [])

    if not workspaces:
        return {
            "allow": True,
            "error-msg-on-failed-posture-compliance": f'No WorkSpaces found for user {username}',
            "posture-compliance-statuses": [],
            "schema-version": "v2"
        }
    
    # 启动工作空间。
    workspace_id = workspaces[0]['WorkspaceId']
    workspaces_client.start_workspaces(
        StartWorkspaceRequests=[
            {'WorkspaceId': workspace_id}
        ]
    )
    
    # 获取工作空间的 IP 地址
    workspace_ip = workspaces[0]['IpAddress']
    
    # 创建路由 53 客户端
    route53_client = boto3.client('route53')
    
    # 创建子域名称
    subdomain = f"{username}.{domain}"
    
    # 创建记录
    try:
        route53_client.change_resource_record_sets(
            HostedZoneId=hostedzone,
            ChangeBatch={
                'Changes': [
                    {
                        'Action': 'CREATE',
                        'ResourceRecordSet': {
                            'Name': subdomain,
                            'Type': 'A',
                            'TTL': 300,
                            'ResourceRecords': [{'Value': workspace_ip}]
                        }
                    }
                ]
            }
        )
        
    except Exception as ex:
        route53_client.change_resource_record_sets(
            HostedZoneId=hostedzone,
            ChangeBatch={
                'Changes': [
                    {
                        'Action': 'UPSERT',
                        'ResourceRecordSet': {
                            'Name': subdomain,
                            'Type': 'A',
                            'TTL': 300,
                            'ResourceRecords': [{'Value': workspace_ip}]
                        }
                    }
                ]
            }
        )    
    
    return {
        "allow": True,
        "error-msg-on-failed-posture-compliance": f'Successfully started WorkSpaces for user {username}',
        "posture-compliance-statuses": [],
        "schema-version": "v2"
    }

在 ACM 中颁发证书

要创建 Client VPN 端点,需要 ACM 的证书。
如果您已拥有一个域名,可以立即颁发证书;但如果没有域名,则需要自己生成证书并将其导入 ACM。
在我的情况下,我使用 CloudShell 创建了证书并将其导入到 ACM。

  1. 按照以下 URL 中步骤 “a” 启动 CloudShell。
  1. 在导航栏上,选择图CloudShell标。
https://docs.aws.amazon.com/zh_cn/cloudshell/latest/userguide/getting-started.html#launch-region-shell
  1. 运行以下 URL 中提供的命令来颁发和导入证书。

$ git clone https://github.com/OpenVPN/easy-rsa.git
$ cd easy-rsa/easyrsa3
$ ./easyrsa init-pki
$ ./easyrsa build-ca nopass
$ ./easyrsa –san=DNS:server build-server-full server nopass
$ mkdir ~/custom_folder/
$ cp pki/ca.crt ~/custom_folder/
$ cp pki/issued/server.crt ~/custom_folder/
$ cp pki/private/server.key ~/custom_folder/
$ cd ~/custom_folder/
$ aws acm import-certificate –certificate fileb://server.crt –private-key fileb://server.key –certificate-chain fileb://ca.crt

https://docs.aws.amazon.com/zh_cn/vpn/latest/clientvpn-admin/client-auth-mutual-enable.html

创建和配置 Client VPN 端点

  1. 使用以下 URL 创建 Client VPN 端点:
    https://us-east-1.console.aws.amazon.com/vpcconsole/home?region=us-east-1#CreateClientVpnEndpoint:
  2. 使用以下设置进行配置:
    • 名称标签 – 可选:client-vpn-for-remotework
    • 客户端 IPv4 CIDR:192.168.252.0/22
      * 确保与 VPC CIDR 无重叠。
    • 服务器证书 ARN:在 ACM 中颁发证书 中导入的证书
    • 身份验证选项:☑ 使用基于用户的身份验证
    • 基于用户的认证选项:⦿ 活动目录身份验证
    • 目录 ID:WorkSpaces 中使用的目录
    • 其他参数 – 可选
      • DNS 服务器 1 IP 地址:VPC CIDR +2 的 IP 地址
        • 若 VPC CIDR 为 10.0.0.0/16,则为 10.0.0.2。
        • 使用私有托管区域时需要指定 VPC CIDR +2。
      • 启用分割隧道:已启用
        • 若禁用,iPad 的所有流量将通过 AWS 路由。
        • 只需要 WorkSpaces 的流量,因此启用该选项。
      • 启用自助服务门户:已启用
        • 允许员工自行下载配置文件。
图像
  1. 从 [目标网络关联] 选项卡中,关联目标网络。
    • VPC:包含 WorkSpaces 的 VPC
    • 选择要关联的子网:一个私有子网
图像
  1. 从 [授权规则] 选项卡中,添加授权规则。
    • 启用访问权限的目标网络:0.0.0.0/0
    • 授予对以下项的访问权限:⦿ 允许访问所有用户
图像
  1. 等待 Client VPN 端点状态变为 Available。
图像

用户方面的步骤

针对该配置,我向员工提出了以下请求:

  1. 在 iPad 上安装 OpenVPN 客户端
  2. 从自助服务门户下载配置文件
    • URL:https://self-service.clientvpn.amazonaws.com/endpoints/<endpoint-id>
  3. 将配置文件导入 OpenVPN 客户端
  4. 在 iPad 上安装 RD 客户端
  5. 在 RD 客户端中添加 PC
    • 主机名: <user-id>.user.workspaces

连接时,员工通过 OpenVPN 连接到 Client VPN,然后使用 RD 客户端通过 RDP 连接到 WorkSpaces。
实施过程非常顺利,遇到问题的员工也很少。

目前看来,这一配置运作良好,因此我会继续观察。
希望这对其他人有所帮助。

タイトルとURLをコピーしました