Functions/Get-CmEc2ImageId.ps1

Function Get-CmEc2ImageId            {
    [CmdletBinding(DefaultParameterSetName='Base')]
    Param(
        [Parameter(Position=0)]
        #[ValidatePattern('(WindowsServer)?(180(3|9)|1709|20(03|(08|12)(R2)?|16|19))|Ubuntu1(6|8)\.04|AmazonLinux2?')]
        [ValidateSet("WindowsServer1809", 
            "WindowsServer1803",
            "WindowsServer1709",
            "WindowsServer2019",
            "WindowsServer2016",
            "WindowsServer2012R2",
            "WindowsServer2012",
            "WindowsServer2008R2",
            "WindowsServer2008",
            "WindowsServer2003",
            "1809",
            "1803",
            "1709",
            "2019",
            "2016",
            "2012R2",
            "2012",
            "2008R2",
            "2008",
            "2003",
            "Ubuntu16.04",
            "Ubuntu18.04",
            "AmazonLinux",
            "AmazonLinux2")]
        [string] $OsVersion="2012R2",

        [ValidateSet("2017","2016","2014","2012","2008R2","2008","2005")]
        [string] $SqlVersion,

        [ValidateSet("Express", "Web","Standard","Enterprise")]
        [string] $SqlEdition = "Standard",

        [switch] $Core,
        [switch] $Containers,
        
        #[ValidateScript({@((Get-AWSRegion).Region;"")})]
        [string] $Region,

        [ValidateSet(
            "Chinese_Traditional",
            "Chinese_Simplified",
            "Czech",
            "Dutch",
            "English",
            "French",
            "German",
            "Hungarian",
            "Korean",
            "Japanese",
            "Polish",
            "Portuguese_Brazil",
            "Russian",
            "Spanish",
            "Swedish",
            "Turkish"
            )]
        [string] $Language = "English"
    )
    $ErrorActionPreference = "Stop"
    if(!$Region){$Region = (Get-DefaultAWSRegion).Region}
    
    If ($OsVersion -like "WindowsServer*"){
        $OsVersion = $OsVersion.Substring(13)
        $WindowsServer = $True
    }
    $Base = $True 
    If ($OsVersion -match '(180(3|9)|1709|20(03|(08|12)(R2)?|16|19))'){
        if ((Get-Date) -lt $([datetime]"2019/04")) { $LatestStable = "1809","2016" }
        else { $LatestStable = "2019","2019" }
        if ($OsVersion -match '(1709|180(3|9))'){$Core = $True}
        if ($Core -and $OsVersion -notmatch '1709|180(3|9)|20((08|12)R2|16|19)')      {
            Write-Warning "Core AMIs only available for Windows Server 2008R2, 2012R2, 2016, 2019, 1709, 1803 and 1809, Switching to Windows Server $($LatestStable[0])"
            $OsVersion = $LatestStable[0]
        }
        if ($Containers) {
            $Base = $False
            if  ($OsVersion -notmatch '1709|180(3|9)|201(6|9)')  {
                Write-Warning "Container AMIs only available for Windows Server 2016, 2019, 1709, 1803 and 1809, Switching to Windows Server $($LatestStable[1])"
                $OsVersion = $LatestStable[1]
            }
        }
        if ($SqlVersion) 
        {
            $Base = $False
            If ($Core -and $OsVersion -ne 2016 -and $SqlVersion ) { Write-Warning "SQL only avaialable on Core Editions of Windows Server 2016, Switching to Full"; $Core = $False}
            If ($Containers) { Write-Warning "SQL AMI not available with Containers, Switching to Non-Containers"; $Containers = $False}
            If ($SqlVersion -match "20(05|08|12)") {$SqlSp = "_SP4"}
            If ($SqlVersion -eq "2014") {$SqlSp = "_SP3"}
            If ($SqlVersion -eq "2016") {$SqlSp = "_SP2"}
            $SqlVersion = $SqlVersion.ToUpper()
            $SqlEdition = $SqlEdition.Substring(0,1).ToUpper() + $SqlEdition.Substring(1).ToLower()
            if ($SqlVersion.Length -eq 4) { $SqlText = "SQL_"+$SqlVersion+$SqlSp+"_"+$SqlEdition }
            else                          { $SqlText = "SQL_2008_R2_SP3_"+$SqlEdition }
            if ($OsVersion -notmatch '201(6|9)'     -and $SqlVersion -eq "2017")   {
            Write-Warning "SQL Server 2017 only supported on Windows Server 2016 and 2019, switching to Windows $($LatestStable[1])"
            $OSVersion = $($LatestStable[1])
            }
            if ($OsVersion -notmatch '201(2R2|6|9)' -and $SqlVersion -eq "2016")   {
                Write-Warning "SQL Server 2016 only supported on Windows Server 2012R2 to 2019, switching to Windows $($LatestStable[1])"
                $OSVersion = $($LatestStable[1])
            }
            if ($OsVersion -notmatch '2012'         -and $SqlVersion -eq "2014")   {
                Write-Warning "SQL Server 2014 only supported on Windows Server 2012 or 2012 R2, switching to Windows 2012 R2"
                $OSVersion = "2012R2"
            }
            if ($OsVersion -notmatch '20(08R2|12)$'  -and $SqlVersion -match '20(08R2|12)')   {
                Write-Warning "SQL Server 2008 R2 and 2012 only supported on Windows Server 2008R2 and 2012, switching to Windows 2012"
                $OSVersion = "2012"
            }
            if ($OsVersion -ne "2008"               -and $SqlVersion -eq "2008")   {
                Write-Warning "SQL Server 2008 only supported on Windows Server 2008, switching to Windows 2008"
                $OSVersion = "2008"
            }
            if ($OsVersion -ne "2003"               -and $SqlVersion -eq "2005")   {
                Write-Warning "SQL Server 2005 only supported on Windows Server 2003, switching to Windows 2003"
                $OSVersion = "2003"
            }
         
        }
        $OSVersion             = $OSVersion.ToUpper()
        $Language              = $Language.Substring(0,1).ToUpper() + $Language.Substring(1).ToLower()
    
        $BaseText = "/aws/service/ami-windows-latest/Windows_Server-"

        if ($OsVersion -match '(1709|180(3|9))')     
        {
            $SearchString = $BaseText+$OsVersion+"-"+$Language+"-Core"
            if ($Base) {$SearchString = $SearchString+"-Base"}
            else       {$SearchString = $SearchString+"-ContainersLatest"}
        }
        if ($OsVersion -match '201(6|9)')     
        {
            if ($Core) {$SearchString = $BaseText+$OsVersion+"-"+$Language+"-Core"}
            else       {$SearchString = $BaseText+$OsVersion+"-"+$Language+"-Full"}
            if ($Base) {$SearchString = $SearchString+"-Base"}
            elseif ($Containers) {
                if ($OsVersion -eq '2016'){$SearchString = $SearchString+"-Containers"}
                if ($OsVersion -eq '2019'){$SearchString = $SearchString+"-ContainersLatest"}
            }
            else       {$SearchString = $SearchString+"-"+$SqlText}
        }
        if ($OsVersion -eq "2012R2")   
        {
            if ($Base) 
            {
                if     ($Core) {$SearchString = $BaseText+"2012-R2_RTM-"+$Language+"-64Bit-Core"}
                else           {$SearchString = $BaseText+"2012-R2_RTM-"+$Language+"-64Bit-Base"}
            }
           
            else {$SearchString = $BaseText+"2012-R2_RTM-"+$Language+"-64Bit-"+$SqlText}
        }

        if ($OsVersion -eq "2012")     
        {
            if ($Base) {$SearchString = $BaseText+"2012-RTM-"+$Language+"-64Bit-Base"}
            else       {$SearchString = $BaseText+"2012-RTM-"+$Language+"-64Bit-"+$SqlText}
        }
        if ($OsVersion -eq "2008R2")   
        {
            if     ($Core) {$SearchString = $BaseText+"2008-R2_SP1-"+$Language+"-64Bit-Core"}
            elseif ($Base) {$SearchString = $BaseText+"2008-R2_SP1-"+$Language+"-64Bit-Base"}
            else           {$SearchString = $BaseText+"2008-R2_SP1-"+$Language+"-64Bit-"+$SqlText}
        }
        if ($OsVersion -eq "2008")     
        {
            if ($Base) {$SearchString = $BaseText+"2008-SP2-"+$Language+"-64Bit-Base"}
            else       {$SearchString = $BaseText+"2008-SP2-"+$Language+"-64Bit-"+$SqlText}
        }
        if ($OsVersion -eq "2003")     
        {
            if ($Base) {$SearchString = $BaseText+"2003-R2_SP2-"+$Language+"-64Bit-Base"}
            else       {$SearchString = $BaseText+"2003-R2_SP2-"+$Language+"-64Bit-"+$SqlText}
        }
        #$SearchString
        $Parameters = @{Name = $SearchString}
        if ($Region) {$Parameters.Add('Region', $Region) }
        Try { (Get-SSMParameter @Parameters).Value }
        Catch { Write-Error "AMI Not Found" }
    }
    If ($OsVersion -eq "Ubuntu18.04"){
        (Get-Ec2Image -filter @{Name="name";Values="ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server*"} -Region $Region| Sort Name| Select -Last 1).ImageId
    }
    If ($OsVersion -eq "Ubuntu16.04"){
        (Get-Ec2Image -filter @{Name="name";Values="ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server*"} -Region $Region | Sort Name | Select -Last 1).ImageId
    }
    If ($OsVersion -eq "AmazonLinux2"){
        (Get-SSMParameter -Name /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 -Region $Region).Value
    }
    If ($OsVersion -eq "AmazonLinux"){
        (Get-SSMParameter -Name /aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-gp2 -Region $Region).Value
    }
}