2017-04-21 1 views
0

AWS에서 구형 AMI를 실행하는 EC2 인스턴스가 있는데, 현재 설정에서 WINDOWS_2016_BASE입니다. 이제 나는 그것을 알았지 만, 인스턴스는 그것을 알지 못합니다.AWS 최신 ami 이미지는 이전 이미지 ID에서 가져온 것입니까?

PowerShell 사용 EC2 인스턴스 자체는 AMI에서 만든 것이 아니라 원하는대로 만들 수 있기를 원합니다 (물론 이전 버전 일 것입니다). 실제 AMI ImageId에서 "직접"가져 오지 않았 으면합니다. 에서 만들었습니다. AWS는 최신 버전이 아닌 경우이를 허용하지 않으므로 (즉, 이미 최신 버전 인 경우에도 동일한 AMI ImageId를 얻으려는 간접적 인 경로가 필요합니다.)

PowerShell을 사용하여 이미 알고있는 AMI의 최신 버전 (메타 데이터에서 가져온 버전)을 찾고 AMI의 이름을 지정하지 않으려합니다. 예 : WINDOWS_2016_BASE 기계를 원합니다. 스크립트 자체에 하드 코딩하지 않고도 더 많은 것을 만들 수 있습니다.

Get-EC2ImageByName -Names WINDOWS_2016_BASE을 사용하는 이유는 내가 어떻게하고 싶은지가 아니기 때문에 어떻게해야할지 모르겠다. 이름 매개 변수를 하드 코딩하거나 userdata를 통해 전달하고 싶지 않기 때문이다.

Get-EC2Image -ImageId <an old imageid>은 AMI가 더 이상 최신이 아니므로 null을 반환합니다.

+0

AMI가 더 이상 사용되지 않으면 AMI의 이름을 검색 할 수 없습니다. 따라서 검색 이름을 입력해야합니다. –

답변

2

이 이름을 스크립트에서 처리 할 수있는 어딘가에 숨기거나 (원하지 않는다고 말한 것) 또는 이름/amis 간의 매핑에 의존하지 않으면 다소 어려울 것입니다. -EC2ImageByName은 이미 당신을 위해).

AMI 메타 데이터는 관련 AMI의 '패밀리 트리'를 검색하기 쉽도록 설계되었습니다. 버전 또는 날짜와 같은 사소한 차이를 제외하고는 이름이 비슷하다는 가정하에 있습니다. 관련 AMI의 접두사가 일관성있게 유지되고 검색 및 집계가 더 쉬워지는 일반적인 패턴입니다.

이 점은 스크립트에 해당 데이터 비트 (AMI 이름 접두어)가 누락되어 접근하기 어렵게 만듭니다.

metadata service에서 인스턴스의 AMI ID를 동적으로 검색하여 Get-EC2Image로 전달하여 AMI 세부 정보를 얻을 수는 있지만 일치하는 이름 접두사없이 검색을 수행 할 수는 없습니다 새로운 AMI

이 접근법을 다시 생각해보고 태그 또는 사용자 데이터를 통해 인스턴스에 숨겨진 이름 접두사를 유지 하시겠습니까? 예를 들어 방금 확인한 결과 영어 Windows Server 2016 Base AMI는 모두이 접두사 인 Windows_Server-2016-English-Full-Base을 공유합니다.당신은 당신의 인스턴스에서 그 데이터를 전송하거나 태그의 하나로서, 당신의 스크립트를 검색하고 최신 윈도우 서버 2016 AMI 얻기 위해 다음과 같은 PowerShell을 실행할 수있는 경우 : 시스템 로그에서

@(Get-EC2Image -Owner amazon -Filter @{ Name="name"; Values="Windows_Server-2016-English-Full-Base*" } | Sort CreationDate -Desc)[0].ImageId 
+0

CLI와 동등합니다 :'aws ec2 describe-images --query Images [*]. [ImageId, Name] --filters Name = name, Values ​​= Windows_Server-2016-English-Full-Base- *'그런 다음 결과를 정렬하십시오. –

+0

고마워, 좋은 대답이야.하지만 문제가 해결되지 않은 부분이 똑같은데, 정확히 내가하고 싶지 않은 것이 답이된다 ;-) 나는 대답을 다소 찾았다. 지금 게시하십시오. –

+0

@cineammispelt 맞아요, 제가 생각하기에이 질문에 대한 전제에 도전하고 있으며 왜이 솔루션이 어느 정도 표준인지는 묻지 않습니다. 유스 케이스를 사용하기 전에 토끼 구멍을 너무 깊숙이 뚫고 들어가야합니다. :) –

1

예 (전에서 가져온 AWS 콘솔보기)

2016년 12월 26일 14 : 36 : 12Z : AMI 원산지 이름 : Windows_Server-2016 - 영어 - 전체 자료가

등가 파워 쉘은 :

가져 오기 - EC2ConsoleOutput

,691 363,210

그래서 여기에 아래 전체에서 (내가 PowerShell을 새로운 해요하지만 난 사람이 하나 개 어떻게 든 문자로 저를 포장 할 수 있습니다 확신)이이 amazons docs

에서 온천에 대한

 


    # read the system console log 
    $consoleLog = Get-EC2ConsoleOutput $currentInstanceObj.InstanceId 
    $consoleLogOutput = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($consoleLog.Output)); 

    # extract the lines that contain AMI Origin in them (there should be 2) - sort them so name i first and version is second 
    $originLines = $consoleLogOutput -split '[\r\n]' | Where-Object {$_.Contains("AMI Origin")} | Sort-Object 

    # get the running name 
    $originLine = $originLines[0] 
    $originLineParts = $originLine.Split(':') 
    $originName = $originLineParts[$originLineParts.Length - 1].Trim() 
    "The origin name is $originName" 

    # get the running version (slighly pointless since the code below doesn't care as we want the latest - but it's for verbosity) 
    $originLine = $originLines[1] 
    $originLineParts = $originLine.Split(':') 
    $originVersion = $originLineParts[$originLineParts.Length - 1].Trim() 
    "The origin version is $originVersion" 

    # concatenate to get the original origin name (note: amazon have a naming pattern here - (name-version) 
    $amiName = $originName + "-" + $originVersion 
    "The original origin ami name is $amiName" 

    #find the latest of the same name and report the difference 
    $latestOriginObj = (Get-EC2Image -Filter @{ Name="name"; Values=($originName + "*")} | Sort-Object CreationDate -Descending | Select-Object -First 1) 

    if($latestOriginObj.ImageId -ne $currentInstanceObj.ImageId) 
    { 
     "The ami has been upgraded from " + ($currentInstanceObj.ImageId) + " to " + ($latestOriginObj.ImageId) 
    } 

    #....so go ahead and use the $latestOriginObj.ImageId when you create a new instance  

 

그리고 지식 소스 아래 발췌 :

AWS 관리 콘솔은 Amazon EC2 인스턴스를 만드는 데 사용하는 AMI에 대한 세부 정보를 제공합니다. 설명 탭의 AMI ID 필드에는 Windows Server SKU, 아키텍처 (32 비트 또는 64 비트), AMI가 작성된 날짜 및 AMI ID와 같은 정보가 들어 있습니다.

AMI가 비공개로 설정되거나 더 이상 버전으로 대체되지 않고 더 이상 카탈로그에 나열되지 않으면 AMI ID 필드에 "ami-xxxxx에 대한 상세 정보를로드 할 수 없습니다. 사용자가 볼 수 없게 될 수도 있습니다. " 인스턴스를 만드는 데 사용 된 AMI를 확인하려면 시스템 로그를 열어야합니다. EC2 콘솔에서 인스턴스를 선택하고 컨텍스트 메뉴 (오른쪽 클릭)에서 인스턴스 설정을 선택한 다음 시스템 로그 가져 오기를 선택하십시오. AMI가 작성된 날짜와 SKU는 AMI Origin Version 및 AMI Origin Name 필드에 나열됩니다.

관련 문제