2023年AWS ECS Fargate自动扩缩容所需CloudFormation IAM角色
问题背景
已完成基于AWS ECS Fargate的负载均衡Docker应用CloudFormation模板搭建(包含VPC、公网子网、互联网网关、负载均衡器、单任务ECS服务,镜像来自ECR,已配置Route 53证书实现SSL),现需为ECS服务添加自动扩缩容功能,但对IAM配置存在疑问:
- 是否无需手动创建IAM角色?
AWS::ApplicationAutoScaling::ScalableTarget的RoleARN应如何填写?- 是否需要额外权限角色来允许创建服务关联角色?
解答
1. 无需手动创建IAM角色
你提到的AmazonEC2ContainerServiceAutoscaleRole托管策略属于旧版配置,目前已被**服务关联角色(Service-Linked Role)**取代。当你首次创建ECS服务的可扩展目标(ScalableTarget)时,Application Auto Scaling会自动创建AWSServiceRoleForApplicationAutoScaling_ECSService服务关联角色,该角色已包含ECS服务自动扩缩容所需的所有权限,无需手动创建或关联自定义策略。
2. AWS::ApplicationAutoScaling::ScalableTarget无需指定RoleARN
对于ECS服务的自动扩缩容场景,ScalableTarget资源不需要填写RoleARN参数。Application Auto Scaling会自动识别并使用上述自动创建的服务关联角色来执行扩缩容操作。如果手动指定旧角色的ARN,反而可能导致权限冲突或不符合最新最佳实践。
3. 部署身份需具备创建服务关联角色的权限
执行CloudFormation模板部署的身份(如IAM用户、部署角色)需要拥有iam:CreateServiceLinkedRole权限,且针对ecs.application-autoscaling.amazonaws.com服务主体。若缺少该权限,部署时会因无法自动创建服务关联角色而失败。
可通过以下策略为部署身份添加所需权限:
ECSAutoScalingSLRPolicy: Type: AWS::IAM::Policy Properties: PolicyName: ECSAutoScalingSLRPolicy PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: 'iam:CreateServiceLinkedRole' Resource: 'arn:aws:iam::*:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService' Condition: StringEquals: 'iam:AWSServiceName': 'ecs.application-autoscaling.amazonaws.com'
完整自动扩缩容CloudFormation示例片段
# 定义ECS服务的可扩展目标 ECSServiceScalableTarget: Type: AWS::ApplicationAutoScaling::ScalableTarget Properties: ServiceNamespace: ecs ScalableDimension: ecs:service:DesiredCount ResourceId: !Join ['/', [service, !Ref ECSCluster, !Ref ECSService]] MinCapacity: 1 MaxCapacity: 5 # 无需配置RoleARN # 定义基于CPU利用率的目标追踪扩缩容策略 ECSServiceScalingPolicy: Type: AWS::ApplicationAutoScaling::ScalingPolicy Properties: PolicyName: ECSServiceCPUAutoscalingPolicy PolicyType: TargetTrackingScaling ScalingTargetId: !Ref ECSServiceScalableTarget TargetTrackingScalingPolicyConfiguration: TargetValue: 70.0 PredefinedMetricSpecification: PredefinedMetricType: ECSServiceAverageCPUUtilization ScaleInCooldown: 60 ScaleOutCooldown: 60
内容的提问来源于stack exchange,提问作者Garret Wilson

