автоматизация AWS Lambda и PowerShell

Эти два дня я наблюдал, как использовать лямбда и Python, но, как правило, более используется для управления системами с помощью PowerShell. Как использовать PowerShell, чтобы попробовать его в Lambda внутри.

Сначала устанавливается на локальном компьютере требуются следующие три модуля.

安装PowerShell Основные
https://github.com/powershell/powershell

安装комплект .NET Ядро разработки программного обеспечения (SDK)
https://www.microsoft.com/net/download

安装AWSLambdaPSCore модуль
Install-модуль AWSLambdaPSCore -Scope CurrentUser

Установленные, выполненные в Powershell6 консоли внутри
New-AWSPowerShellLambda -ScriptName awstag -Template основной

Он будет автоматически создавать оглавления, основанные на основном шаблоне, который пс с пустым документом, и файл README. Пустые п.с. файлы будут автоматически загружены powershellcore модули, если нам нужно добавить дополнительные модули должны быть изменены здесь. Вот один из моего тестового сценария. Основная функция заключается в проверке тега сценария, убедитесь, что EC2, Volume Snapshot, и имеет соответствующий тег, потому что каждый месяц мне нужно отобразить счет различных клиник по тэгу. Кроме того, если снимок, если более 60 дней, кстати дал мне автоматически удаляется.

# PowerShell script file to be executed as a AWS Lambda function. 
# 
# When executing in Lambda the following variables will be predefined.
#   $LambdaInput - A PSObject that contains the Lambda function input data.
#   $LambdaContext - An Amazon.Lambda.Core.ILambdaContext object that contains information about the currently running Lambda environment.
#
# The last item in the PowerShell pipeline will be returned as the result of the Lambda function.
#
# To include PowerShell modules with your Lambda function, like the AWSPowerShell.NetCore module, add a "#Requires" statement 
# indicating the module and version.

#Requires -Modules @{ModuleName='AWSPowerShell.NetCore';ModuleVersion='3.3.335.0'}

# Uncomment to send the input event to CloudWatch Logs
# Write-Host (ConvertTo-Json -InputObject $LambdaInput -Compress -Depth 5)

Write-Host "Checking EC2 instance Tags status" -ForegroundColor Yellow

$all=Get-EC2Instance | select -expand instances

$return=$all | Where-Object {$_.tag.key -notcontains "Clinic"}

if($return -ne $null){
$username = "[email protected]" 
$password = "Passwordtest" | ConvertTo-SecureString -asPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($username,$password)
$id=$return.InstanceId

Send-MailMessage -From [email protected] -to [email protected] -SmtpServer smtp.office365.com -Port 587 -UseSsl -Subject "EC2 instance Tag" -body "$id" -Credential $credential
exit

}
# confirm EC2 instances were tagged

$result=@()
foreach($item in $all){

    $Name=$item.tag | Where-Object {$_.Key -eq 'Name'} | select -ExpandProperty value
    $clinic=$item.tag | Where-Object {$_.Key -eq 'clinic'} | select -ExpandProperty value
    $item | add-member -NotePropertyName Description -NotePropertyValue $name
    $item | add-member -NotePropertyName Clinic -NotePropertyValue $clinic

    $item = $item | select *
    $result+=$item

}

$result | select Description, InstanceId, privateIpaddress, Clinic | Group-Object Clinic

write-host "Updating Volume Tags Status ... " -ForegroundColor Yellow 
#Tag all volumes based on their attached EC2 Clinic Tag

$allvol=Get-EC2Volume | Where-Object {$_.tag.key -notcontains "Clinic"}

foreach($item in $result){
    foreach($item2 in $allvol){

        if ($item2.attachments.instanceid -eq $item.InstanceId){
                $value=$item.Clinic
              New-EC2Tag -Resource $item2.VolumeId -Tag @{Key="Clinic";value=$value} 
           }

        }

}

Write-Host "Updating Snapshot Tags Status..." -ForegroundColor Yellow 
#Tag all snapshots based on the volume Tag
$allvol=Get-EC2Volume 
$filter= New-Object Amazon.EC2.Model.Filter -Property @{Name = "owner-id"; Values ='386115804199' } 
$snapshots=Get-EC2Snapshot -Filter $filter 

$snapshots1= $snapshots | ? {$_.Tag.key -notcontains "Clinic"} 

foreach($i in $snapshots1){
    $volid=$i.VolumeId

    foreach($j in $allvol){

        if($volid -eq $j.Volumeid){

            $value=$j.tag | Where-Object {$_.key -eq 'Clinic'} | select -ExpandProperty value

            $name=$j.Tag | Where-Object {$_.key -eq "Name"} | select -ExpandProperty value

            $snapid=$i.snapshotid
            write-host "--$snapid--"  
            New-EC2Tag -Resource $snapid -Tag @{Key="Clinic";value=$value} 
            New-EC2Tag -Resource $snapid -Tag @{Key="Name";value=$name}

        }
    }

}

write-host "Deleting Snapshots older than over 60 days !" -ForegroundColor Yellow

$date=(get-date).AddDays(-40)

foreach($snapshot in $snapshots){
    $id=$snapshot.snapshotid

    if($snapshot.starttime -lt $date){
        $snapshot
        Remove-EC2Snapshot -SnapshotId $id -Confirm:$false
    }
}

Следующая консоль Powershell6 в, он будет автоматически связан роль IAM, связанные компрессионные модули и выполнять сценарии, а затем загружены в консоль Lambda. Здесь РМКО роль, которую я просто пишу, что позволяет EC2 доступа и журнал cloudwatch.

Опубликовать-AWSPowerShellLambda -ScriptPath. \ Awstag.ps1 -name awstag -iamrole 'ec2fullaccess' -области ар-юго-восток-2

И так на одну минуту, бревенчатый AWS вы можете увидеть функцию загрузки.

автоматизация AWS Lambda и PowerShell

В отличие от кода Python для этого можно непосредственно увидеть, сказать вам слишком много, но я не могу показать прямой вызов

автоматизация AWS Lambda и PowerShell

Тест попытка, показывает успех

автоматизация AWS Lambda и PowerShell

Идите и посмотрите соответствующий cloudwatch

автоматизация AWS Lambda и PowerShell

Готово!

рекомендация

отblog.51cto.com/beanxyz/2442543