AWS AMI - 过滤最新版本
AWS AMI -Filter Latest Version
可能是我使用 AWS EC2 不正确,请帮帮我。我想通过用户数据脚本创建一个 base ami,这没问题,它可以工作。然而,下一步是制作图像,但是由于对象未标记,过滤它有点麻烦,我可以添加区域、vpc、安全组和状态的条件,这会找到对象,我可以构建图片。
但是我不想覆盖现有图像,所以理想情况下我需要用名称和版本标记它,没问题。但是后来我需要子图像来找到那个图像,我想通过名称和版本找到,但是动态地,即最新的。在 docker 中,只要容器被标记就非常简单,要使用最新的版本可以省略,它会自动拉取最新的。这里有类似的技术吗?大家用什么?我可能用错了吗?
这是我所做的:
注意:虽然这是为了标记实例,但可以很容易地对其进行修改以使用图像。
注意:我不是 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] 的散列 table,按版本排序并获得顶部的。
$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
}
可能是我使用 AWS EC2 不正确,请帮帮我。我想通过用户数据脚本创建一个 base ami,这没问题,它可以工作。然而,下一步是制作图像,但是由于对象未标记,过滤它有点麻烦,我可以添加区域、vpc、安全组和状态的条件,这会找到对象,我可以构建图片。
但是我不想覆盖现有图像,所以理想情况下我需要用名称和版本标记它,没问题。但是后来我需要子图像来找到那个图像,我想通过名称和版本找到,但是动态地,即最新的。在 docker 中,只要容器被标记就非常简单,要使用最新的版本可以省略,它会自动拉取最新的。这里有类似的技术吗?大家用什么?我可能用错了吗?
这是我所做的:
注意:虽然这是为了标记实例,但可以很容易地对其进行修改以使用图像。
注意:我不是 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] 的散列 table,按版本排序并获得顶部的。
$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
}