【免费下载链接】flociLight, fluffy, and always free - The AWS Local Emulator alternative项目地址https://gitcode.com/gh_mirrors/fl/floci点击查看免费下载Floci 以内存态存储实现 EC2 Auto ScalingautoscalingQuery API 的 45 个操作覆盖启动配置、自动扩缩组、生命周期钩子、扩缩策略、计划任务与 Warm Pool 的完整状态管理并配备一个每 10 秒运行一次的容量协调器Reconciler通过调用 EC2RunInstances/TerminateInstances真正拉起或销毁实例来维持 DesiredCapacity。本文结合 docs/services/autoscaling.md 与 AutoScalingService.java 等源码逐层拆解其协议形态、操作清单、协调器原理与边界行为帮助你在本地开发与测试中正确使用 Floci 的 Auto Scaling 能力。协议与 ARN 形态Floci 的 Auto Scaling 服务使用 AWS 经典Query 协议客户端以POST /发起请求Action表单参数指定具体操作凭证作用域credential scope为autoscaling服务端以 XML 响应返回结果。从源码看请求分发由 AutoScalingQueryHandler.java 中的switch (action)完成支持 45 个动作未知动作返回UnsupportedOperation错误。三类核心资源使用以下 ARN 格式自动扩缩组arn:aws:autoscaling:region:account:autoScalingGroup:uuid:autoScalingGroupName/name启动配置arn:aws:autoscaling:region:account:launchConfiguration:uuid:launchConfigurationName/name扩缩策略arn:aws:autoscaling:region:account:scalingPolicy:uuid:autoScalingGroupName/group/policyName/name源码中 ARN 通过AwsArnUtils.Arn.of(autoscaling, region, accountId, ...)生成见 AutoScalingService.javauuid部分实际由资源类型与名称构成区域与账号 ID 取自请求上下文。存储模型以区域为命名空间的内存态存储Floci 的 Auto Scaling 状态全部保存在AutoScalingService持有的内存 Map 中键统一为region::name组、启动配置或region::group::name钩子、策略、计划任务等组合。服务启动时通过StorageBackedMap将以下 8 类数据持久化到 JSON 文件见 AutoScalingService.java存储文件内容autoscaling-launch-configurations.json启动配置autoscaling-groups.json自动扩缩组含实例列表autoscaling-lifecycle-hooks.json生命周期钩子autoscaling-policies.json扩缩策略autoscaling-activities.json扩缩活动日志autoscaling-instance-refreshes.json实例刷新记录autoscaling-scheduled-actions.json计划任务autoscaling-warm-pools.jsonWarm Pool 配置由于键包含区域同一名称在不同区域下互不干扰describe类操作也会按区域过滤。这保证了对多区域、多账号模拟的一致行为。操作全景45 个 API 的兼容矩阵启动配置Launch Configurations操作说明CreateLaunchConfiguration存储模板ImageId、InstanceType、KeyName、SecurityGroups、UserData、IamInstanceProfile、InstanceMonitoring、BlockDeviceMappingsDescribeLaunchConfigurations按名称列表过滤无过滤时返回全部DeleteLaunchConfiguration删除指定启动配置不存在时抛ValidationError源码中的校验逻辑与 AWS 保持一致请求要么携带InstanceId要么同时携带ImageId与InstanceType否则抛ValidationError错误消息见 AutoScalingService.java。若传入InstanceIdFloci 会查询对应 EC2 实例并自动补全缺失的ImageId、InstanceType、KeyName、SecurityGroups、UserData、IamInstanceProfile模拟 AWS 的从实例创建启动配置行为。InstanceMonitoring默认视为启用TRUE而AssociatePublicIpAddress的缺席是有意义的显式false优先于子网默认值两者语义不同。自动扩缩组Auto Scaling Groups操作说明CreateAutoScalingGroup创建组支持 min/max/desired 容量、AZ、标签、启动配置/启动模板/混合实例策略随即启动容量协调循环DescribeAutoScalingGroups按名称过滤返回实例列表含生命周期状态与混合实例策略形状UpdateAutoScalingGroup更新容量边界、冷却时间、启动源、AZDeleteAutoScalingGroupForceDeletetrue时先终止全部实例再删除创建时默认值处理DefaultCooldown缺省为300HealthCheckType缺省为EC2TerminationPolicies缺省为[Default]见 AutoScalingService.java。删除组时若仍有存活实例且未设ForceDelete会抛ResourceInUseForceDeletetrue则逐一调用 EC2 终止接口随后清理关联的钩子、策略、实例刷新、计划任务与 Warm Pool。实例管理操作说明DescribeAutoScalingInstances返回所有被 ASG 跟踪的实例及其生命周期与健康状态SetDesiredCapacity更新期望数量协调器在 10 秒内完成扩缩容AttachInstances将已有 EC2 实例挂入组内生命周期置为InServiceDetachInstances从组内摘除实例可选是否递减 DesiredCapacityTerminateInstanceInAutoScalingGroup终止指定实例可选递减 DesiredCapacitySuspendProcesses记录被挂起的扩缩进程空列表表示挂起全部DescribeAutoScalingGroups回显ResumeProcesses清除挂起记录空列表表示恢复全部SetDesiredCapacity会校验新值必须落在[MinSize, MaxSize]区间内见 AutoScalingService.java。SuspendProcesses的空列表挂起全部语义对应 AWS 的 9 个标准进程Launch、Terminate、AddToLoadBalancer、AlarmNotification、AZRebalance、HealthCheck、InstanceRefresh、ReplaceUnhealthy、ScheduledActions。源码注释明确指出Terraform AWS Provider 在wait_for_capacity_timeout非零默认值时总会无条件调用SuspendProcesses因此该操作若未实现会导致 ASG 创建整体失败——Floci 采用接受并记录策略保证兼容。此外Floci 还实现了SetInstanceProtection与SetInstanceHealth前者标记实例protectedFromScaleIn缩容候选会被过滤后者校验健康状态只能是Healthy或Unhealthy。需注意源码注释提示ShouldRespectGracePeriod参数仅做 wire 兼容解析尚未真正对照HealthCheckGracePeriod生效。负载均衡挂载操作说明AttachLoadBalancerTargetGroups挂载 ELB v2 目标组 ARN新实例 InService 时自动注册DetachLoadBalancerTargetGroups摘除目标组实例随之反注册DescribeLoadBalancerTargetGroups列出组关联的目标组AttachLoadBalancers经典 ELB 挂载仅存储不做 ELB v1 路由DetachLoadBalancers经典 ELB 摘除DescribeLoadBalancers列出组关联的经典 ELB目标组挂载会持久化到组的TargetGroupARNs列表协调器在实例进入InService时调用ElbV2Service.registerTargets完成真实注册见 AutoScalingReconciler.java同时也会向经典 ELBregisterInstances注册LoadBalancerNames与目标组是相互独立的两条链路可同时存在。流量源Traffic Sources操作说明AttachTrafficSources统一的 elb/elbv2/vpc-lattice 挂载 API按 identifier 与 type 存储DetachTrafficSources按 identifier 移除流量源DescribeTrafficSources列出已挂载源可按 type 过滤每个源都报告InService源码将其实现为Mapidentifier, typetype 缺省为elbv2。Terraform 的aws_autoscaling_traffic_source_attachment使用该 API 而非旧的AttachLoadBalancerTargetGroups。由于 Floci 没有真实的健康检查循环所有挂载的流量源立即上报InService——注释明确说明这是接受并记住模式。生命周期钩子操作说明PutLifecycleHook创建/更新钩子LifecycleTransition、DefaultResult、HeartbeatTimeoutDescribeLifecycleHooks列出组的钩子DeleteLifecycleHook移除钩子CompleteLifecycleAction对挂起的生命周期动作发出CONTINUE或ABANDONRecordLifecycleActionHeartbeat延长进行中动作的心跳超时钩子名校验严格遵循 AWS 模型autoscaling/2011-01-01/service-2.json长度 ≤ 255且必须匹配^[A-Za-z0-9\-_/]$LifecycleActionToken必须恰好 36 字符见 AutoScalingService.java。CompleteLifecycleAction当前为存储型实现协调器通过实例生命周期状态间接观察结果。扩缩策略与计划任务操作说明PutScalingPolicy创建/更新策略SimpleScaling字段或带预定义指标、目标值、预热时间的TargetTrackingScalingDescribePolicies按组或策略名过滤回显存储的目标跟踪配置DeletePolicy删除扩缩策略PutScheduledUpdateGroupAction创建/更新计划recurrence、时区、起止时间、容量边界DescribeScheduledActions按组或动作名过滤DeleteScheduledAction移除计划动作策略 ARN 形如arn:aws:autoscaling:region:account:scalingPolicy:group:policyName。计划任务与策略一样采用接受并记住模式——Floci 没有真正的 cron 调度器去执行这些计划但 Terraform Provider 的 Read 操作本就不期望模拟器内计划真的触发因此足以支撑aws_autoscaling_schedule的完整生命周期见 AutoScalingService.java 注释。Warm Pool 与活动日志操作说明PutWarmPool按 wire 模型整体替换省略字段重置为默认MaxGroupPreparedCapacity-1清除该值DescribeWarmPool返回存储配置同时嵌入DescribeAutoScalingGroups的 AutoScalingGroup 形状DeleteWarmPool移除配置不存在时幂等成功DescribeScalingActivities返回组的活动日志扩缩容事件均有记录Warm Pool 的实现与 AWS 行为对齐MinSize省略时默认0PoolState省略时默认Stopped省略字段重置为默认而不是沿用旧值因此putWarmPool总是从零重建配置MaxGroupPreparedCapacity没有默认值-1是 wire 模型文档化的清除已设值哨兵映射回null而非渲染为-1。由于没有真正预热实例的循环DescribeWarmPool的Instances列表恒为空注释见 AutoScalingService.java。元数据类操作以下操作返回标准枚举用于支持 SDK/工具对能力边界的探测DescribeTerminationPolicyTypes标准终止策略名DescribeAccountLimits组的最大数量/配置/实例限额DescribeLifecycleHookTypesautoscaling:EC2_INSTANCE_LAUNCHING与autoscaling:EC2_INSTANCE_TERMINATINGDescribeAdjustmentTypes四种标准调整类型DescribeMetricCollectionTypes标准指标与粒度名DescribeAutoScalingNotificationTypes全部通知类型名Capacity Reconciler真实的扩缩容引擎Floci 的 Auto Scaling 不是纯记状态模拟。AutoScalingReconciler在应用启动后以scheduleAtFixedRate(this::reconcileAll, 5, 10, TimeUnit.SECONDS)的方式每10 秒固定频率运行一轮见 AutoScalingReconciler.java单线程调度线程名为asg-reconciler。每轮reconcile(asg)的执行顺序AutoScalingReconciler.java移除终止中实例将Terminating状态实例从目标组/经典 ELB 反注册调用TerminateInstances再移除记录。清除陈旧实例InService但底层 EC2 已不运行的实例、Pending但 EC2 已缺失或处于终止/停止状态的实例会被清理同时将相关活跃 SSM 命令调用标记为Undeliverable。清理孤儿目标注册目标组中不属于任何活跃 ASG 实例的 target 会被反注册。晋升就绪实例Pending状态的实例一旦 EC2 状态变为running即晋升为InService并注册到所有已挂载目标组与经典 ELB。容量对齐统计PendingInService的活跃容量与DesiredCapacity比较后执行扩缩。扩缩逻辑AutoScalingReconciler.javaScale-out解析启动源启动配置 → 启动模板 → 混合实例策略优先级依次降级调用RunInstances按需数量拉起实例新实例以Pending状态入库若组已删除导致保存失败会回滚终止这些实例。AZ 选择组配置了 AZ 则取第一个否则用regiona子网同理取第一个。组标签中标记为启动时传播的标签会随实例下发。Scale-in从InService且未被protectedFromScaleIn保护的实例中选取先反注册目标组与经典 ELB再调用TerminateInstances并移除记录。每次扩缩容事件都会写入一条活动记录recordActivity供DescribeScalingActivities查询。协调器对启动源做了精细处理resolveLaunchSource启动模板解析时会读取指定版本的ImageId、InstanceType、KeyName、安全组、实例标签、UserData 与 IAM 实例配置档混合实例策略则取 override 中第一个显式InstanceType。启动模板被删除时仅InvalidLaunchTemplateName.NotFoundException/InvalidLaunchTemplateId.NotFound被当作模板已消失而跳过该轮其他异常会向上传播以免掩盖真实故障。Launch Source 兼容性与混合实例策略自动扩缩组只能保留三种启动源之一启动配置、顶层启动模板、或MixedInstancesPolicy在创建/更新请求中互斥。同时提供多个启动源会抛ValidationErrormutually exclusive。混合实例策略存储并回显以下字段LaunchTemplate.LaunchTemplateSpecification.LaunchTemplateIdLaunchTemplate.LaunchTemplateSpecification.LaunchTemplateNameLaunchTemplate.LaunchTemplateSpecification.VersionLaunchTemplate.Overrides.member.N.InstanceTypeLaunchTemplate.Overrides.member.N.InstanceRequirementsInstancesDistribution.OnDemandBaseCapacityInstancesDistribution.OnDemandPercentageAboveBaseCapacityInstancesDistribution.SpotAllocationStrategyoverride 选择实例类型的方式二选一按名称InstanceType或按属性InstanceRequirements。规则见 AutoScalingService.java同一 override 同时设置InstanceType与InstanceRequirements抛ValidationError与 AWS 一致指定InstanceRequirements时必须同时给出VCpuCount与MemoryMiBAWS 模型在该 shape 上标记的必填成员否则抛ValidationErrorInstanceRequirements的所有成员均可往返round-trip唯一例外是BaselinePerformanceFactors——接受但丢弃。属性型实例类型选择attribute-based selection的判定规则当生效的混合实例策略中至少一个 override 携带InstanceRequirements时该组使用属性型选择。创建时生效策略即请求提供的策略更新时则是请求提供的策略、未指定启动源时存储的策略、或请求切换到启动配置/普通启动模板时的无。可选组字段何时回显、何时省略CreateAutoScalingGroup与UpdateAutoScalingGroup都接受以下字段而DescribeAutoScalingGroups仅在组设置了该字段时才回显——从未设置的字段从响应中省略而非返回默认值实现载体是 AsgOptionalFields.java字段说明DesiredCapacityType取值units、vcpu、memory-mib其他值抛ValidationError。AWS 仅支持其用于属性型实例类型选择因此vcpu/memory-mib在生效的混合实例策略未使用InstanceRequirements时抛ValidationErrorunits是文档化默认值始终接受CapacityRebalance布尔值存储并原样回显MaxInstanceLifetime秒。必须为0或至少864000表示无上限回显为0DefaultInstanceWarmup秒。传-1移除已设值之后字段再次省略更新语义是部分更新请求未设置的成员不动存量值applyToExistingGroup仅覆盖显式传入成员而创建时未设置则直接不设置。DefaultInstanceWarmup的-1哨兵会被解析为null后省略而不是存储-1。扩缩策略兼容性目标跟踪策略保留TargetTrackingConfiguration。DescribePolicies在配置存在时返回PredefinedMetricSpecification.PredefinedMetricType、TargetValue与EstimatedInstanceWarmup。PutScalingPolicy中PolicyType缺省为SimpleScaling同时记录AdjustmentType、ScalingAdjustment与Cooldown供下游工具完整读回。配置开关变量默认值说明FLOCI_SERVICES_AUTOSCALING_ENABLEDtrue启用或禁用 Auto Scaling 服务该配置对应EmulatorConfig.AutoScalingServiceConfig.enabled()WithDefault(true)与其他服务模块如 Application Auto Scaling的开关模式一致。环境变量名由 Quarkus 的配置映射规则推导floci.services.autoscaling.enabled属性对应的环境变量形式。将其设为false可整体关闭该服务的 API 入口。使用示例以下是基于文档的完整演练覆盖创建启动配置 → 创建组 → 挂载目标组 → 观察实例 → 扩容的全流程# 创建启动配置 aws autoscaling create-launch-configuration \ --launch-configuration-name my-lc \ --image-id ami-12345678 \ --instance-type t3.micro # 创建目标 desired2 的组 aws autoscaling create-auto-scaling-group \ --auto-scaling-group-name my-asg \ --launch-configuration-name my-lc \ --min-size 1 \ --max-size 5 \ --desired-capacity 2 \ --availability-zones us-east-1a # 挂载 ELB v2 目标组 aws autoscaling attach-load-balancer-target-groups \ --auto-scaling-group-name my-asg \ --target-group-arns arn:aws:elasticloadbalancing:us-east-1:000000000000:targetgroup/my-tg/abc123 # 观察实例出现Pending → InService约 10 秒内完成 aws autoscaling describe-auto-scaling-groups \ --auto-scaling-group-names my-asg # 扩容 aws autoscaling set-desired-capacity \ --auto-scaling-group-name my-asg \ --desired-capacity 3创建组后约 510 秒内协调器开始工作RunInstances拉起 2 个实例进入PendingEC2 进入running后晋升InService并自动注册到目标组。扩容到 3 后下一轮协调器会补 1 个实例反向调低 desired 则触发缩容。若需调试可配合aws autoscaling describe-scaling-activities --auto-scaling-group-name my-asg查看每次扩缩容的活动记录。边界与限制从源码注释可以确认以下已知边界均为有意的接受并记住设计而非缺陷CompleteLifecycleAction不实际执行 SNS 通知仅做存储级校验CONTINUE/ABANDON由协调器通过实例状态间接体现计划任务与扩缩策略只有存储语义不会真正按 cron 或指标触发扩容——真实扩容仅由SetDesiredCapacity/ 容量边界变化驱动协调器完成Warm Pool 不预热实例DescribeWarmPool.Instances恒为空经典 ELB 挂载只做存储与实例注册不做真实流量路由ShouldRespectGracePeriod尚未与HealthCheckGracePeriod联动BaselinePerformanceFactors接受后不保留。这些边界覆盖了 AWS SDK、Terraform Provider 等主流工具在本地开发场景下的全部读回路径使得基于 Floci 的 CI 流程可以无侵入地演练 ASG 的创建、扩容、缩容与销毁。进一步阅读服务实现主类AutoScalingService.java容量协调器AutoScalingReconciler.javaQuery 协议分发AutoScalingQueryHandler.java可选字段模型AsgOptionalFields.java集成测试AutoScalingIntegrationTest.java协调器单元测试AutoScalingReconcilerTest.java官方服务文档docs/services/autoscaling.md赞分享【免费下载链接】flociLight, fluffy, and always free - The AWS Local Emulator alternative项目地址https://gitcode.com/gh_mirrors/fl/floci点击查看免费下载相关推荐aws-cli 实战用 aws autoscaling set-desired-capacity 手动调整 Auto Scaling 组容量aws cli 实战用 aws autoscaling set desired capacity 手动调整 Auto Scaling 组容量 导读 本篇文章围开发工具云原生运维AWS CLI autoscaling set-instance-protection 实战指南为 EC2 Auto Scaling 实例启用与关闭缩容保护AWS CLI autoscaling set instance protection 实战指南为 EC2 Auto Scaling 实例启用与关闭缩容保护开发工具云原生运维AWS CLI 实战使用 detach-instances 将 EC2 实例从 Auto Scaling 组分离附源码解析AWS CLI 实战使用 detach instances 将 EC2 实例从 Auto Scaling 组分离附源码解析 aws autoscaling开发工具云原生运维上一篇CANN/ops-math全局平均池化算子下一篇【亲测免费】 Kubeflow 开源项目安装与使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考