如何实现定时删除创建超24小时的关联XYZ的SQS队列?
整合SNS订阅筛选与SQS队列清理的PowerShell脚本
完整实现脚本
# 设定AWS区域 $region = "us-east-1" # 1. 获取所有Endpoint包含"XYZ"的SQS类型SNS订阅 $targetSubscriptions = Get-Subscription -Region $region | Where-Object { $_.Endpoint -like '*XYZ*' -and $_.Protocol -eq "sqs" } # 遍历每个目标订阅,处理关联的SQS队列 foreach ($sub in $targetSubscriptions) { # 从SNS Endpoint(ARN格式)中解析SQS队列信息 $sqsArnParts = $sub.Endpoint -split ':' $sqsAccountId = $sqsArnParts[4] $sqsQueueName = $sqsArnParts[5] $sqsQueueUrl = "https://sqs.$region.amazonaws.com/$sqsAccountId/$sqsQueueName" try { # 2. 获取SQS队列的创建时间属性 $queueAttrs = Get-SQSQueueAttribute -QueueUrl $sqsQueueUrl -AttributeName CreatedTimestamp -Region $region $createdUnixTime = [double]$queueAttrs.CreatedTimestamp $createdDateTime = [DateTimeOffset]::FromUnixTimeSeconds($createdUnixTime).LocalDateTime # 3. 判断是否超过24小时,执行删除逻辑 $24HoursAgo = (Get-Date).AddHours(-24) if ($createdDateTime -lt $24HoursAgo) { # 先取消SNS订阅,避免后续推送报错 Unsubscribe-Subscription -SubscriptionArn $sub.SubscriptionArn -Region $region -Confirm:$false # 删除SQS队列 Remove-SQSQueue -QueueUrl $sqsQueueUrl -Region $region -Confirm:$false Write-Host "已清理队列:$sqsQueueName | 创建时间:$createdDateTime" } else { Write-Host "队列$sqsQueueName未超过24小时,跳过 | 创建时间:$createdDateTime" } } catch { Write-Warning "处理队列$sqsQueueUrl失败:$_" } }
关键逻辑说明
- 精准筛选订阅:新增
Protocol -eq "sqs"过滤,只处理SQS类型的订阅,避免非SQS端点(如邮件、短信)导致的无效解析。 - 解析队列URL:从SNS订阅的Endpoint(ARN格式)拆分出账号ID和队列名,拼接成SQS Cmdlet所需的标准URL格式。
- 时间戳转换:将SQS返回的Unix时间戳转换为本地DateTime,便于和当前时间做阈值对比。
- 安全清理流程:删除队列前先取消对应的SNS订阅,避免后续SNS推送失败产生报错;添加
-Confirm:$false跳过交互确认,适配定时任务无人值守场景。 - 异常容错:用
try/catch包裹单个队列的处理逻辑,防止某一个队列处理失败中断整个脚本执行。
定时任务配置(Windows)
- 打开「任务计划程序」,创建新任务。
- 触发器:设置脚本执行频率(如每日凌晨、每小时一次)。
- 操作:选择「启动程序」,程序路径填
powershell.exe,参数填:
(-ExecutionPolicy Bypass -File "C:\你的脚本路径\CleanupSQS.ps1"-ExecutionPolicy Bypass用于绕过PowerShell执行策略限制) - 设置:勾选「不管用户是否登录都要运行」,并配置拥有AWS权限的执行账号。
内容的提问来源于stack exchange,提问作者BigDirt
相关产品推荐
相关产品推荐

