You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Azure DevOps流水线在AWS自定义AMI实例编译代码并解决Toolkit问题?

解决Azure DevOps流水线启动AWS EC2并执行构建的问题

先排查任务缺失的核心原因

  • 确认AWS Toolkit扩展安装范围:必须在Azure DevOps组织级别安装该扩展,而非单个项目。进入组织设置→扩展,检查扩展状态为“已启用”且覆盖目标项目。
  • 核对任务ID拼写:YAML中引用的AWS任务ID必须准确,比如启动EC2的任务是AWSLaunchEC2Instance,避免手敲错误。
  • 刷新流水线缓存:扩展安装后,关闭并重新打开流水线编辑页面,或重新保存流水线配置,让系统加载新任务。

可行的实现方案

方案1:修复AWS Toolkit任务后使用官方任务

  1. 配置AWS服务连接
    在Azure DevOps项目设置→服务连接中,创建AWS类型的连接,填入有EC2操作权限的IAM用户密钥(需包含ec2:RunInstances、ec2:DescribeInstances、ec2:TerminateInstances等权限)。

  2. 编写流水线YAML示例

trigger:
- main

pool:
  vmImage: 'ubuntu-latest' # 微软托管代理已预装AWS相关工具

steps:
- task: AWSConfigureCredentials@1
  inputs:
    awsCredentials: '你的AWS服务连接名称'
    awsRegion: 'us-east-1' # 替换为你的目标区域

- task: AWSLaunchEC2Instance@1
  inputs:
    amiId: 'ami-xxxxxx' # 替换为你的自定义AMI ID
    instanceType: 't2.medium'
    keyPairName: '你的密钥对名称'
    securityGroupIds: 'sg-xxxxxx' # 允许SSH访问的安全组
    subnetId: 'subnet-xxxxxx'
  name: LaunchEC2
  outputs:
    instanceId: $(InstanceId)

- task: AWSWaitForEC2Instance@1
  inputs:
    instanceId: $(InstanceId)
    state: 'running'
    waitForSSHSocket: true # 等待SSH端口可用

- task: SSH@0
  inputs:
    sshEndpoint: 'ec2-user@$(LaunchEC2.PublicIpAddress)' # 替换为EC2的默认用户名(比如amazon-linux用ec2-user,ubuntu用ubuntu)
    keyFilePath: '$(System.DefaultWorkingDirectory)/你的密钥对.pem' # 需将密钥对文件上传到Azure DevOps安全文件库,或通过变量传递
    runOptions: 'commands'
    commands: |
      git clone https://你的代码仓库地址.git
      cd 项目目录
      mvn clean package # 替换为你的编译命令

- task: AWSTerminateEC2Instances@1
  inputs:
    instanceIds: $(InstanceId)
  condition: always() # 无论构建成功失败,都终止实例

方案2:绕过AWS Toolkit,直接用AWS CLI操作

如果官方任务始终无法正常加载,可直接用AWS CLI命令完成流程:

trigger:
- main

pool:
  vmImage: 'ubuntu-latest'

steps:
- script: |
    aws configure set aws_access_key_id $(AWS_ACCESS_KEY_ID)
    aws configure set aws_secret_access_key $(AWS_SECRET_ACCESS_KEY)
    aws configure set region us-east-1
  env:
    AWS_ACCESS_KEY_ID: $(你的AWS_ACCESS_KEY_ID变量)
    AWS_SECRET_ACCESS_KEY: $(你的AWS_SECRET_ACCESS_KEY变量)
  displayName: '配置AWS凭证'

- script: |
    INSTANCE_ID=$(aws ec2 run-instances --image-id ami-xxxxxx --instance-type t2.medium --key-name 你的密钥对名称 --security-group-ids sg-xxxxxx --query 'Instances[0].InstanceId' --output text)
    echo "##vso[task.setvariable variable=InstanceId]$INSTANCE_ID"
  displayName: '启动EC2实例'

- script: |
    until aws ec2 describe-instances --instance-id $(InstanceId) --query 'Reservations[0].Instances[0].State.Name' --output text | grep -q running; do
      sleep 10
    done
    PUBLIC_IP=$(aws ec2 describe-instances --instance-id $(InstanceId) --query 'Reservations[0].Instances[0].PublicIpAddress' --output text)
    echo "##vso[task.setvariable variable=PublicIpAddress]$PUBLIC_IP"
    # 等待SSH端口可用
    until nc -z $PUBLIC_IP 22; do
      sleep 10
    done
  displayName: '等待EC2实例就绪'

- task: SSH@0
  inputs:
    sshEndpoint: 'ec2-user@$(PublicIpAddress)'
    keyFilePath: '$(System.DefaultWorkingDirectory)/你的密钥对.pem'
    commands: |
      git clone https://你的代码仓库地址.git
      cd 项目目录
      mvn clean package
  displayName: '远程执行构建'

- script: |
    aws ec2 terminate-instances --instance-ids $(InstanceId)
  displayName: '终止EC2实例'
  condition: always()

关键注意事项

  • 自定义AMI预配置工具:确保你的AMI已预装Git、编译工具(如JDK、Maven)等,避免每次构建都耗时安装。
  • 安全组配置:EC2的安全组必须允许来自Azure DevOps代理IP段的SSH访问,生产环境建议限制IP而非开放0.0.0.0/0。
  • 资源清理:务必添加condition: always()确保实例被终止,防止产生不必要的AWS费用。

内容的提问来源于stack exchange,提问作者user2519184

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:40:54