AWS AMI -Filter最新版本

时间:2015-11-03 15:11:34

标签: amazon-ec2 aws-cli

也许我正在尝试错误地使用AWS EC2,请帮帮我。我想通过用户数据脚本制作一个基本ami,这没问题,它可以工作。然而,下一步是制作一个图像,但是由于该对象没有标记过滤它的痛苦,我可以添加区域,vpc,安全组和状态的标准,这将找到对象,我可以构建图像。

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

1 个答案:

答案 0 :(得分:0)

这是我做的:

注意:虽然这是用于标记实例,但可以轻松修改它以使用图像。

注意:我不是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]的哈希表,按版本排序并获得最高版本。

$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
 }