Unexpected shutdown GiSeong Eom

AWS Lambda에서 PowerShell Core 테스트

ps6-on-lambda-result

Background

요즘 대세는 서버리스(serverless)라는 글을 주변에서 자주 접하고 있습니다. Powershell을 사용하는 입장에서는 조금 아쉬움이 있었는데, AWS Developer Blog 에서 재미있는 글을 발견했습니다. .NET Core lambda runtime에서 PowerShell Core를 사용할 수 있다는 내용입니다. 재미있어서 그 블로그 포스팅에 언급된 내용을 그대로 테스트를 수행했습니다.

테스트 환경은 다음과 같습니다.

  • Windows 10 1809 / PowerShell Core 6.1.2 on ConEmu PS-Module-Info
  • .NET Core SDK 2.2.104
  • AWS 서울 (ap-northeast-2) region

Deploy

AWS에서 제공하는 기본 테스트에 사용된 예제 코드를 조금 수정했습니다.

  • 변경 전: Security Group에서 RDP 통신 허용된 rule 삭제
  • 변경 후: 총 몇 개의 Security Group에서 RDP 허가하는 rule이 발견되었는지 표시

lambda에서 실행될 RDPLockDown.ps1 작성합니다.

#Requires -Modules @{ModuleName='AWSPowerShell.NetCore';ModuleVersion='3.3.450.0'}
$rulesDetected = 0

Get-EC2SecurityGroup | ForEach-Object -Process {

    $securityGroupId = $_.GroupId
    $_.IpPermission | ForEach-Object -Process {

        if ($_.ToPort -eq 3389) {
            Write-Host "Found open RDP port for $securityGroupId"
            $rulesDetected++
        }
    }
}

Write-Host "Scan complete and found $rulesDetected EC2 security group ingress rules"

Publish-AWSPowerShellLambda cmdlet 이용해서 배포합니다.

.NET Core SDK가 기본 경로에 설치되어 있지 않다면 배포에 실패합니다. 이 경우 DOTNET_ROOT 환경 변수를 지정합니다. (저는 .NET Core SDK Portable 버전을 사용하고 있어서 명시적으로 지정)

$env:DOTNET_ROOT="C:\tools\dotnet"
Publish-AWSPowerShellLambda -ScriptPath .\RDPLockDown.ps1 -Name RDPLockDown 

배포 과정의 스크린샷입니다.

pscore-on-lambda-deploy-01

pscore-on-lambda-deploy-02

(최초로 AWS Lambda 배포하는 경우) IAM Role 생성하고 IAM Policy를 연결

배포가 끝나면 AWS Management Console 에서 테스트를 할 수 있습니다.

Run

test event 를 생성합니다.

test-event-for-ps6-awslambda

실제 코드는 input event에 의존하지 않습니다. 그러나, 테스트를 위해서 기본값으로 생성합니다.

관리콘솔에서 테스트 선택하면 결과를 볼 수 있습니다.

test-result

Conclusion

Cold Start의 경우 Duration은 3.5 초 (3,500 ms) 이며 메모리 사용량은 350MB 입니다. PowerShell 스크립트의 특성상 범용 Production Application 보다는 Ops 작업을 자동화하기에는 적당하다고 생각됩니다.

그러나, Lambda의 저장소 사용량(25MB)이 예상보다 크기 때문에 여러 가지 Powershell 모듈을 설치하는 것은 부담스럽네요. 앞으로 좀 더 많은 테스트가 필요하다고 생각합니다.

References