【问题标题】:AWS AMI -Filter Latest VersionAWS AMI -过滤最新版本
【发布时间】:2016-02-03 19:23:12
【问题描述】:

也许我试图错误地使用 AWS EC2,请帮助我。我想通过用户数据脚本制作一个基础 ami,这没问题,它可以工作。但是,下一步是制作图像,但是由于对象未标记,因此很难过滤它,我可以添加区域、vpc、安全组和状态的标准,这将找到对象并且我可以构建图片。

但是我不想覆盖现有图像,所以理想情况下我需要用名称和版本标记它,没问题。但是然后我需要子图像来找到该图像,并且我想通过名称和版本来查找,但是是动态的,即最新的。在 docker 中,只要容器被标记就非常简单,要使用最新版本,可以省略版本,它会自动拉取最新版本。这里有类似的技术吗?你们都用什么?我可能用错了吗?

【问题讨论】:

    标签: amazon-ec2 aws-cli


    【解决方案1】:

    这是我所做的:

    注意:虽然这是为了标记一个实例,但它可以很容易地修改为使用图像。

    注意:我不是 powershell 高级用户,所以如果您发现明显的低效率,请告诉我。

    我使用 Jenkins 构建机器,因此它具有我用于标记的环境变量,但是它调用具有此签名的 powershell 脚本,因此您可以手动调用或通过另一个脚本调用它:

    param(
        ...
        [Parameter(Mandatory=$true)][string]$Tag_Name,
        [Parameter(Mandatory=$true)][string]$Tag_Version
    )
    

    在这个脚本中,我这样设置实例标签:

    #Get metadata from ec2 service
    $identityDocument = (Invoke-WebRequest http://169.254.169.254/latest/dynamic/instance-identity/document/).Content | ConvertFrom-Json
    
    $tags = @( 
        @{Key = "Name"; Value = $Tag_Name},
        @{Key = "Version"; Value = $Tag_Version}
    )
    
    New-EC2Tag -Resource $identityDocument.instanceId -Tag $tags
    

    在另一个脚本中,我可以按名称查询,查找所有实例,将结果解析为[InstanceId,Version]的哈希表,按Version排序,得到最前面的。

    $instanceName = "hello-world"
    $instances = GetHashTableOfFilteredInstances $instanceName
    $instanceId = GetNewestInstance($instances)
    
    Write-Host 'Information for ' $instanceName
    Write-Host '================='
    Write-Host 'The newest instance is ' $instanceId
    Write-Host '================='
    
    function GetHashTableOfFilteredInstances($tagName){
        $instances = Get-EC2Instance -Filter @( `
          @{name='tag:Name'; values=$tagName};`
        ) | Select-Object -ExpandProperty instances
    
        $actInstances= @{}
    
        foreach($instance in $instances){
           foreach($tag in $instance.Tag){
              if ($tag.Key -ne "Version") {
                 Continue;
              }
    
              $actInstances.Add($tag.Value, $instance.InstanceId)
           }
        }
    
        return $actInstances
     }
    
     function GetNewestInstance($instances){
         return ($instances.GetEnumerator() | Sort-Object Key -descending)[0].Value
     }
    

    【讨论】:

    • 当然,我可以像这样按创建时间过滤: $ami = Get-EC2Image -Region $Region -Owner self | Where-Object {$_.Name.StartsWith("windows-iis-ami")} | ` 排序对象-属性创建日期-降序| ` 选择对象-First 1 | ` 选择 -ExpandProperty ImageId
    猜你喜欢
    • 2017-06-28
    • 2020-10-29
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2019-01-07
    • 2017-07-14
    相关资源
    最近更新 更多