技术问询:ECR镜像推送扫描校验,修复Inspector变更致CI/CD故障
解决方案:适配ECR扫描迁移至AWS Inspector后的CI/CD流水线
核心问题分析
AWS将ECR镜像扫描功能迁移至AWS Inspector后,原有的ECR原生扫描结果查询API(如aws ecr describe-image-scan-findings)不再返回新扫描数据,需通过Inspector的API获取漏洞结果,这直接导致原有流水线依赖ECR扫描结果的逻辑失效。
调整后的完整流程实现
1. 推送Docker镜像至ECR
保持原有镜像推送逻辑不变,确保镜像成功上传:
# 登录ECR aws ecr get-login-password --region <your-region> | docker login --username AWS --password-stdin <account-id>.dkr.ecr.<your-region>.amazonaws.com # 构建并推送镜像 docker build -t <repo-name>:<tag> . docker tag <repo-name>:<tag> <account-id>.dkr.ecr.<your-region>.amazonaws.com/<repo-name>:<tag> docker push <account-id>.dkr.ecr.<your-region>.amazonaws.com/<repo-name>:<tag>
2. 触发并等待AWS Inspector扫描完成
Inspector默认会自动扫描新推送的ECR镜像(需提前在Inspector中启用ECR镜像扫描规则包),需轮询等待扫描完成:
- 获取目标镜像ARN:
IMAGE_ARN=$(aws ecr describe-images --repository-name <repo-name> --image-ids imageTag=<tag> --query 'imageDetails[0].imageArn' --output text)
- 循环检查扫描状态:
while true; do SCAN_STATUS=$(aws inspector2 list-scan-findings --filter '{"resourceArn": [{"comparison": "EQUALS", "value": "'$IMAGE_ARN'"}]}' --query 'findings[0].scanStatus.status' --output text) if [ "$SCAN_STATUS" = "COMPLETE" ]; then break elif [ "$SCAN_STATUS" = "FAILED" ]; then echo "扫描失败,终止构建" exit 1 fi echo "扫描进行中,等待10秒..." sleep 10 done
3. 检查Critical级漏洞并终止构建
从Inspector结果中筛选Critical级漏洞,存在则终止流水线:
CRITICAL_COUNT=$(aws inspector2 list-scan-findings --filter '{"resourceArn": [{"comparison": "EQUALS", "value": "'$IMAGE_ARN'"}], "severity": [{"comparison": "EQUALS", "value": "CRITICAL"}]}' --query 'findings | length(@)' --output text) if [ "$CRITICAL_COUNT" -gt 0 ]; then echo "检测到${CRITICAL_COUNT}个Critical级漏洞,终止构建" exit 1 else echo "未检测到Critical级漏洞,构建继续" fi
必要的IAM权限配置
确保CI/CD流水线使用的IAM角色具备以下权限:
ecr:GetAuthorizationTokenecr:DescribeImagesinspector2:ListScanFindings- 若需手动触发扫描,额外添加
inspector2:StartScan
注意事项
- 提前在AWS Inspector中启用对应区域的ECR镜像扫描,并配置包含漏洞扫描的规则包
- 可根据实际扫描时长调整轮询间隔,避免过短导致API调用超限
- 若使用GitHub Actions、GitLab CI等托管流水线,可将上述逻辑封装为步骤,结合平台内置重试机制优化等待逻辑
内容的提问来源于stack exchange,提问作者Friedrich Brunzema
相关产品推荐
相关产品推荐

