使用 AWS Toolkit for JetBrains 调试 Amazon Elastic Container Service 集群中的代码 - AWS Toolkit for JetBrains

使用 AWS Toolkit for JetBrains 调试 Amazon Elastic Container Service 集群中的代码

可以使用 AWS Toolkit for JetBrains 调试 AWS 账户中的 Amazon Elastic Container Service (Amazon ECS) 集群中的代码。

注意

Amazon ECS 集群中的调试代码目前处于测试阶段。

设计为在开发环境中使用的功能。请不要在生产环境中使用此功能。调试 Amazon ECS 集群中的代码将更改 AWS 账户中资源的状态,包括但不限于停止关联的 Amazon ECS 服务和更改其配置。此外,在启用代码调试时手动更改资源的状态可能会导致不可预测的结果。

先决条件

在开始调试代码之前,您必须具有:

  1. 要用于调试代码的 Docker 映像。此映像可托管于以下任一项中:

    注意

    如果您还没有可用的映像,建议您使用下列操作之一:

  2. 在您的 AWS 账户中,具有要调试的代码所需的 AWS 权限的 AWS Identity and Access Management (IAM) 角色。此角色将由 Amazon Elastic Container Service (Amazon ECS) 用作任务角色。此任务角色还必须与 ecs-tasks.amazonaws.com 服务主体具有信任关系,并且必须包含对 AmazonSSMManagedInstanceCore AWS 托管策略的引用。有关更多信息,请参阅如何设置 Amazon ECS 任务角色

  3. 在您的 AWS 账户中,为包含要调试的服务的 Amazon ECS 集群。有关更多信息,请参阅如何设置 Amazon ECS 集群

  4. 在您的 AWS 账户中,您添加到相应的 IAM 实体(例如 IAM 用户、组或角色)的特定 IAM 客户托管策略,该策略与您在连接到 AWS Toolkit for JetBrains 时指定的 AWS 凭证关联。有关更多信息,请参阅如何将 IAM 客户托管策略添加到 IAM 实体

  5. 在本地开发计算机上,为要调试的代码的副本。

调试代码

在满足上述先决条件后,您可以调试代码,如下所示:

  1. 打开 AWS Explorer(如果尚未打开)。如果 Amazon ECS 集群位于与当前 AWS 区域不同的 AWS 区域,请切换到包含此集群的 AWS 区域

  2. 展开 ECS,然后展开 Clusters (集群)

  3. 展开 Amazon ECS 集群,右键单击服务,然后选择 Enable Cloud Debugging (启用云调试)。例如,在以下屏幕截图中,集群名为 java,服务名为 java-service

    
        在 AWS Explorer 中启用云调试
  4. 在出现提示时,选择您的 Amazon ECS 任务角色,然后选择 OK (确定)

  5. 状态栏显示消息 Configuring Cloud Debugging resource (配置云调试资源)。请等待,直至 Build (构建) 工具窗口的 Build Output (构建输出) 选项卡显示成功配置消息。(右下角也会显示相关弹出消息。) 这将需要花几分钟的时间。

    注意

    当您首次在 AWS 账户中启用代码调试时,AWS Toolkit for JetBrains 会在您的 AWS 账户中创建一个 Amazon S3 存储桶。此存储桶的名称遵循以下格式:do-not-delete-cloud-debug-Region-ID-account-ID。JetBrains Toolkit 将信息存储在此存储桶中以启用代码调试。请不要删除此存储桶或修改其内容。 如果您这样做的话,代码调试可能会停止工作或产生意外的结果。如果您意外删除或修改了此存储桶,则 JetBrains Toolkit 将尝试重新创建此存储桶。您还可以通过再次选择 Enable Cloud Debugging (启用云调试)(如前所述)或选择 Disable Cloud Debugging (禁用云调试)(如本过程稍后所述)来强制 JetBrains Toolkit 重新创建存储桶。

  6. 在显示了要调试的代码后,在 AWS Explorer 中,依次展开 ECSClusters (集群) 和您的集群。此时将显示服务,旁边有一个调试图标。这表示现已启用服务以进行云调试。右键单击带调试图标的服务,然后选择 Debug (调试)

    
        在 AWS Explorer 中调试 Amazon ECS 服务
  7. Edit configuration (编辑配置) 对话框中编辑完配置,然后选择 Debug (调试)

    注意

    要稍后更改此配置,请在菜单栏上,选择 Run (运行)Edit Configurations (编辑配置)。然后,展开 Amazon ECS Service Cloud Debug (Amazon ECS 服务云调试),然后选择服务的名称。

  8. 使用 IDE 的内置调试工具像往常一样调试代码。

  9. 如果您已更改代码,则可以重新开始调试:在 AWS Explorer 中,依次展开 ECSClusters (集群) 和您的集群。右键单击旁边带有调试图标的服务,然后选择 Debug (调试)

  10. 如果您更改关联的 Dockerfile,则必须重新构建并重新发布 Docker 映像,然后从头开始重复此过程。

  11. 要禁用调试,请在 AWS Explorer 中,依次展开 ECSClusters (集群) 和您的集群。右键单击旁边有调试图标的服务,然后选择 Disable Cloud Debugging (禁用云调试)。此时将显示一个弹出窗口,用于确认已禁用调试。

设置 Amazon ECS 任务角色

请注意,以下信息适用于 Amazon ECS 所需的权限,它与 AWS Toolkit for JetBrains 需要的权限不同。

要调试 Amazon Elastic Container Service (Amazon ECS) 集群中的代码,您的 AWS 账户必须先具有一个 AWS Identity and Access Management (IAM) 角色,该角色具有要调试的代码所需的 AWS 权限。此角色将由 Amazon Elastic Container Service (Amazon ECS) 用作任务角色。此任务角色还必须与 ecs-tasks.amazonaws.com 服务主体具有信任关系,并且必须包含对 AmazonSSMManagedInstanceCore AWS 托管策略的引用。

要创建符合这些要求的角色,请参阅IAM 用户指南中的为 AWS 服务创建角色(控制台),并指定以下设置:

  1. 对于 Choose the service that will use this role (选择将使用此角色的服务),选择 Elastic Container Service

  2. 对于 Select your use case (选择您的使用案例),选择 Elastic Container Service Task (Elastic Container Service 任务)

  3. 对于 Attach permissions policies (附加权限策略),请选择 AmazonSSMManagedInstanceCore

要向现有 Amazon ECS 任务角色添加其他 AWS 权限,请参阅IAM 用户指南中的修改角色(控制台)中的“更改角色允许的权限(控制台)”。

设置 Amazon ECS 集群

要调试 Amazon Elastic Container Service (Amazon ECS) 集群中的代码,您的 AWS 账户中必须先有一个包含要调试的服务的 Amazon ECS 集群。

设置 Fargate 集群

要快速创建满足最低要求的 Fargate 集群、服务和任务定义,请参阅适用于 AWS Fargate 的 Amazon Elastic Container Service 用户指南中的 通过 Fargate 开始使用 Amazon ECS。唯一需要的设置在步骤 1:容器和任务中。具体而言,在为容器指定名称后,对于 Container definition (容器定义),请选择 Configure (配置)。然后,指定与要调试的代码兼容的 Image (映像)

设置 Amazon EC2 集群

有关如何创建 Amazon EC2 托管集群的信息,请参阅 Amazon Elastic Container Service Developer Guide 中的通过 Amazon EC2 开始使用 Amazon ECS

注意

如果您还没有可用的映像,建议您使用下列操作之一:

对于高级方案,您可以独立创建集群、任务定义和服务。为此,请参阅 Amazon Elastic Container Service Developer Guide中的以下内容:

  • 创建集群 – 对于 Select cluster template (选择集群模板),您可以选择 Networking only (for Fargate) (仅网络(对于 Fargate))EC2 Linux + Networking (for EC2) (EC2 Linux + 网络 (对于 EC2))

  • 创建任务定义 – 对于 Select launch type compatibility (选择启动类型兼容性),请选择相应的启动类型。

  • 创建服务 – 对于 Configure service (配置服务),请选择相应的 Launch Type (启动类型)

添加 IAM 客户托管策略

请注意,以下信息适用于 AWS Toolkit for JetBrains 所需的权限,它与 Amazon ECS 需要的权限不同

在 Amazon ECS 集群中设置以调试代码时,强烈建议您遵循有关授予最低权限的 AWS 安全最佳实践。授予最低权限意味着仅授予执行任务所需的权限。要授予最低权限以便在 Amazon ECS 集群中调试代码,您必须将特定的 IAM 客户托管策略(如下所示)附加到 IAM 实体(例如 IAM 用户、组或角色)。此 IAM 实体必须与您在连接到 AWS Toolkit for JetBrains 时指定的凭证关联。

在以下策略语句中,向两个 Amazon ECS 服务(分别名为 MyServiceMyOtherService)、两个 Amazon ECS 任务角色(分别名为 MyTaskRoleMyOtherTaskRole)以及两个 Amazon ECS 执行任务角色(分别名为 MyExecutionTaskRoleMyOtherExecutionTaskRole)授予权限。更改这些示例服务和任务角色的名称以匹配您自己的服务和角色名称,然后将此策略附加到相应的 IAM 实体。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowedECSServices", "Effect": "Allow", "Action": [ "ecs:UpdateService" ], "Resource": [ "arn:aws:ecs:*:*:service/*/cloud-debug-*", "arn:aws:ecs:*:*:service/*/MyService", "arn:aws:ecs:*:*:service/*/MyOtherService" ] }, { "Effect": "Allow", "Action": [ "iam:GetRole", "iam:ListRoles", "iam:SimulatePrincipalPolicy" ], "Resource": "*" }, { "Sid": "AllowedIAMRoles", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::*:role/MyTaskExecutionRole", "arn:aws:iam::*:role/MyOtherTaskExecutionRole", "arn:aws:iam::*:role/MyTaskRole", "arn:aws:iam::*:role/MyOtherRole" ], "Condition": { "StringEquals": { "iam:PassedToService": "ecs-tasks.amazonaws.com" } } }, { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::*:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS" ] }, { "Effect": "Allow", "Action": [ "s3:CreateBucket", "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:ListBucket" ], "Resource": "arn:aws:s3:::do-not-delete-cloud-debug-*" }, { "Effect": "Allow", "Action": [ "ecs:ListClusters", "ecs:ListServices", "ecs:DescribeServices", "ecs:ListTasks", "ecs:DescribeTasks", "ecs:DescribeTaskDefinition", "elasticloadbalancing:DescribeListeners", "elasticloadbalancing:DescribeRules", "elasticloadbalancing:DescribeTargetGroups", "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream" ], "Resource": [ "arn:aws:logs:*:*:cloud-debug*" ] }, { "Effect": "Allow", "Action": [ "ecs:CreateService", "ecs:DeleteService" ], "Resource": "arn:aws:ecs:*:*:service/*/cloud-debug*" }, { "Effect": "Allow", "Action": [ "ecs:RegisterTaskDefinition" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "elasticloadbalancing:ModifyListener", "elasticloadbalancing:ModifyRule", "elasticloadbalancing:ModifyTargetGroupAttributes" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "elasticloadbalancing:CreateTargetGroup", "elasticloadbalancing:DeleteTargetGroup" ], "Resource": "arn:aws:elasticloadbalancing:*:*:targetgroup/cloud-debug*" }, { "Effect": "Allow", "Action": [ "ssm:StartSession", "ssm:TerminateSession", "ssm:ResumeSession", "ssm:DescribeSessions", "ssm:GetConnectionStatus" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "application-autoscaling:RegisterScalableTarget", "application-autoscaling:DeregisterScalableTarget", "application-autoscaling:DescribeScalableTargets" ], "Resource": "*" } ] }

您可以使用工具(例如 AWS 管理控制台中的 IAM 控制台)创建 IAM 客户托管策略,然后将策略添加到相应的 IAM 实体(例如,IAM 用户、组或角色)。