将 AWS Transfer Family 服务器端点类型从 VPC _ 更新ENDPOINT为 VPC - AWS Transfer Family

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将 AWS Transfer Family 服务器端点类型从 VPC _ 更新ENDPOINT为 VPC

你可以使用 AWS Management Console AWS CloudFormation、或 Transfer Family API 将服务器EndpointType从更新VPC_ENDPOINTVPC。以下各部分提供了使用每种方法更新服务器端点类型的详细过程和示例。如果您在多个 AWS 区域和多个 AWS 账户中拥有服务器,则可以使用下一节中提供的示例脚本进行修改,使用需要更新的VPC_ENDPOINT类型来识别服务器。

使用 VPC_ENDPOINT 端点类型识别服务器

您可以使用 VPC_ENDPOINT 来识别哪些服务器正在使用 AWS Management Console。

识别通过控制台使用 VPC_ENDPOINT 端点类型的服务器
  1. 打开 AWS Transfer Family 控制台,网址为https://console.aws.amazon.com/transfer/

  2. 在导航窗格中选择服务器,显示该区域中您账户中的服务器列表。

  3. 端点类型对服务器列表进行排序,以查看所有使用 VPC_ENDPOINT 的服务器。

识别VPC_ENDPOINT跨多个 AWS 区域和账户使用的服务器

如果您在多个 AWS 区域和多个 AWS 账户中拥有服务器,则可以使用以下示例脚本(经过修改)来识别使用VPC_ENDPOINT终端节点类型的服务器。示例脚本使用 Amazon EC2 DescribeRegions和 Transfer Family ListServers API 调用来获取您使用的所有服务器的服务器IDs和区域的列表VPC_ENDPOINT。如果您有多个 AWS 帐户,则如果您使用身份提供商的会话配置文件进行身份验证,则可以使用具有只读审计者访问权限的IAM角色来循环浏览您的帐户。

  1. 以下是一个简单示例。

    import boto3 profile = input("Enter the name of the AWS account you'll be working in: ") session = boto3.Session(profile_name=profile) ec2 = session.client("ec2") regions = ec2.describe_regions() for region in regions['Regions']: region_name = region['RegionName'] if region_name=='ap-northeast-3': #https://github.com/boto/boto3/issues/1943 continue transfer = session.client("transfer", region_name=region_name) servers = transfer.list_servers() for server in servers['Servers']: if server['EndpointType']=='VPC_ENDPOINT': print(server['ServerId'], region_name)
  2. 获得要更新的服务器列表后,您可以使用以下各部分中描述的方法之一将 EndpointType 更新为 VPC

使用更新服务器端点类型 AWS Management Console

  1. 打开 AWS Transfer Family 控制台,网址为https://console.aws.amazon.com/transfer/

  2. 在导航窗格中,选择服务器

  3. 选中要更改其端点类型的服务器的复选框。

    重要

    您必须先停止服务器,然后才能更改其终端节点。

  4. 对于操作,选择停止

  5. 在出现的确认对话框中,通过选择停止来确认您要停止服务器。

    注意

    在继续下一步之前,请等待服务器的状态变为离线;这可能需要几分钟。您可能必须在服务器页面上选择刷新才能查看状态更改。

  6. 状态更改为离线后,选择服务器以显示服务器详细信息页面。

  7. 端点详细信息部分中,选择编辑

  8. 终端节点类型选择VPC托管

  9. 选择保存

  10. 操作中,选择启动,然后等待服务器状态更改为在线;这可能需要几分钟。

使用更新服务器端点类型 AWS CloudFormation

本节介绍 AWS CloudFormation 如何使用将服务器更新EndpointTypeVPC。对于使用部署的 Transfer Family 服务器,请使用此过程 AWS CloudFormation。在此示例中,用于部署 Transfer Family 服务器的原始 AWS CloudFormation 模板如下所示:

AWS TemplateFormatVersion: '2010-09-09' Description: 'Create AWS Transfer Server with VPC_ENDPOINT endpoint type' Parameters: SecurityGroupId: Type: AWS::EC2::SecurityGroup::Id SubnetIds: Type: List<AWS::EC2::Subnet::Id> VpcId: Type: AWS::EC2::VPC::Id Resources: TransferServer: Type: AWS::Transfer::Server Properties: Domain: S3 EndpointDetails: VpcEndpointId: !Ref VPCEndpoint EndpointType: VPC_ENDPOINT IdentityProviderType: SERVICE_MANAGED Protocols: - SFTP VPCEndpoint: Type: AWS::EC2::VPCEndpoint Properties: ServiceName: com.amazonaws.us-east-1.transfer.server SecurityGroupIds: - !Ref SecurityGroupId SubnetIds: - !Select [0, !Ref SubnetIds] - !Select [1, !Ref SubnetIds] - !Select [2, !Ref SubnetIds] VpcEndpointType: Interface VpcId: !Ref VpcId

模板已更新,其中包含以下更改:

  • EndpointType 已更改为 VPC

  • AWS::EC2::VPCEndpoint 资源已删除。

  • SecurityGroupIdSubnetIds、和 VpcId 已移至EndpointDetails资源AWS::Transfer::Server部分,

  • VpcEndpointIdEndpointDetails 属性已删除。

更新后的模板如下所示:

AWS TemplateFormatVersion: '2010-09-09' Description: 'Create AWS Transfer Server with VPC endpoint type' Parameters: SecurityGroupId: Type: AWS::EC2::SecurityGroup::Id SubnetIds: Type: List<AWS::EC2::Subnet::Id> VpcId: Type: AWS::EC2::VPC::Id Resources: TransferServer: Type: AWS::Transfer::Server Properties: Domain: S3 EndpointDetails: SecurityGroupIds: - !Ref SecurityGroupId SubnetIds: - !Select [0, !Ref SubnetIds] - !Select [1, !Ref SubnetIds] - !Select [2, !Ref SubnetIds] VpcId: !Ref VpcId EndpointType: VPC IdentityProviderType: SERVICE_MANAGED Protocols: - SFTP
更新使用部署的 Transfer Family 服务器的端点类型 AWS CloudFormation
  1. 使用以下步骤停止要更新的服务器。

    1. 打开 AWS Transfer Family 控制台,网址为https://console.aws.amazon.com/transfer/

    2. 在导航窗格中,选择服务器

    3. 选中要更改其端点类型的服务器的复选框。

      重要

      您必须先停止服务器,然后才能更改其终端节点。

    4. 对于操作,选择停止

    5. 在出现的确认对话框中,通过选择停止来确认您要停止服务器。

      注意

      在继续下一步之前,请等待服务器的状态变为离线;这可能需要几分钟。您可能必须在服务器页面上选择刷新才能查看状态更改。

  2. 更新堆 CloudFormation 栈

    1. https://console.aws.amazon.com/cloudformat ion 上打开 AWS CloudFormation 控制台。

    2. 选择用于创建 Transfer Family 服务器的堆栈。

    3. 选择更新

    4. 选择替换当前模板

    5. 上传新模板。 CloudFormation 更改集可帮助您在实施模板更改之前了解模板更改将如何影响正在运行的资源。在此示例中,将修改传输服务器资源,并删除该VPCEndpoint资源。VPC端点类型服务器代表您创建VPC终端节点,替换原始VPCEndpoint资源。

      上传新模板后,更改集将与以下所示类似:

    6. 更新堆栈。

  3. 堆栈更新完成后,导航至 Transfer Family 管理控制台,网址为https://console.aws.amazon.com/transfer/

  4. 重新启动服务器。选择您更新的服务器 AWS CloudFormation,然后从 “操作” 菜单中选择 “启动”。

EndpointType 使用更新服务器 API

你可以使用 desc ribe- AWS CLI server 命令或命令。UpdateServer API以下示例脚本停止 Transfer Family 服务器 EndpointType、更新ENDPOINT、移除 VPC _ 并启动服务器。

import boto3 import time profile = input("Enter the name of the AWS account you'll be working in: ") region_name = input("Enter the AWS Region you're working in: ") server_id = input("Enter the AWS Transfer Server Id: ") session = boto3.Session(profile_name=profile) ec2 = session.client("ec2", region_name=region_name) transfer = session.client("transfer", region_name=region_name) group_ids=[] transfer_description = transfer.describe_server(ServerId=server_id) if transfer_description['Server']['EndpointType']=='VPC_ENDPOINT': transfer_vpc_endpoint = transfer_description['Server']['EndpointDetails']['VpcEndpointId'] transfer_vpc_endpoint_descriptions = ec2.describe_vpc_endpoints(VpcEndpointIds=[transfer_vpc_endpoint]) for transfer_vpc_endpoint_description in transfer_vpc_endpoint_descriptions['VpcEndpoints']: subnet_ids=transfer_vpc_endpoint_description['SubnetIds'] group_id_list=transfer_vpc_endpoint_description['Groups'] vpc_id=transfer_vpc_endpoint_description['VpcId'] for group_id in group_id_list: group_ids.append(group_id['GroupId']) if transfer_description['Server']['State']=='ONLINE': transfer_stop = transfer.stop_server(ServerId=server_id) print(transfer_stop) time.sleep(300) #safe transfer_update = transfer.update_server(ServerId=server_id,EndpointType='VPC',EndpointDetails={'SecurityGroupIds':group_ids,'SubnetIds':subnet_ids,'VpcId':vpc_id}) print(transfer_update) time.sleep(10) transfer_start = transfer.start_server(ServerId=server_id) print(transfer_start) delete_vpc_endpoint = ec2.delete_vpc_endpoints(VpcEndpointIds=[transfer_vpc_endpoint])