시작 시 Windows 인스턴스에서 명령 실행 - Amazon Elastic Compute Cloud

시작 시 Windows 인스턴스에서 명령 실행

Amazon EC2를 사용하여 Windows 인스턴스를 시작할 때 사용자 데이터를 인스턴스에 전달하여 자동화된 구성 태스크를 수행하는 데 사용할 수 있고, 인스턴스가 시작된 후에 스크립트를 실행하는 데 사용할 수도 있습니다. 인스턴스 사용자 데이터는 불분명한 데이터로 처리되므로, 해석은 인스턴스에 따라 다릅니다. 사용자 데이터는 Windows Server 2022의 EC2Launch v2, Windows Server 2016 및 2019의 EC2Launch, Windows Server 2012 R2 및 이전 버전의 EC2Config에서 처리됩니다.

UserData 템플릿의 AWS CloudFormation 속성 어셈블리 예제는 Base64 인코딩 UserData 속성AccessKey 및 SecretKey를 사용하는 Base64 인코딩 UserData 속성을 참조하세요.

시작 시 Linux 인스턴스에서 명령을 실행하는 방법에 대한 자세한 내용은 Linux 인스턴스용 Amazon EC2 사용 설명서시작 시 Linux 인스턴스에서 명령 실행을 참조하세요.

수명 주기 후크와 함께 작동하는 Auto Scaling 내의 인스턴스에서 명령을 실행하는 예제는 Amazon EC2 Auto Scaling 사용 설명서에서 자습서: 인스턴스 메타데이터를 통해 대상 수명 주기 상태를 검색하도록 사용자 데이터 구성을 참조하세요.

사용자 데이터 스크립트

EC2Config 또는 EC2Launch에서 스크립트를 실행하려면 사용자 데이터에 추가할 때 해당 스크립트를 특수 태그 안에 포함해야 합니다. 사용하는 태그는 명령 프롬프트 창에서 명령이 실행되는지(배치 명령) 아니면 Windows PowerShell을 사용하는지에 따라 달라집니다.

배치 스크립트와 Windows PowerShell 스크립트를 둘 다 지정할 경우, 인스턴스 사용자 데이터에 나타나는 순서와 관계 없이, 배치 스크립트가 먼저 실행되고 Windows PowerShell 스크립트가 다음에 실행됩니다.

사용자 데이터 스크립트에서 AWS을(를) 포함한 AWS CLI API를 사용하는 경우 인스턴스를 시작할 때 인스턴스 프로파일을 사용해야 합니다. 인스턴스 프로필은 사용자 데이터 스크립트에서 API 호출을 실행하는 데 필요한 적절한 AWS 자격 증명을 제공합니다. 자세한 내용은 인스턴스 프로파일 섹션을 참조하세요. IAM 역할에 할당하는 권한은 API를 사용하여 호출하는 서비스에 따라 다릅니다. 자세한 내용은 Amazon EC2의 IAM 역할을 참조하세요.

배치 스크립트 구문

script 태그를 사용하여 배치 스크립트를 지정합니다. 다음 예제와 같이 줄 바꿈을 사용하여 명령을 구분합니다.

<script> echo Current date and time >> %SystemRoot%\Temp\test.log echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log </script>

기본적으로 사용자 데이터 스크립트는 인스턴스를 시작할 때 한 번만 실행됩니다. 인스턴스를 재부팅하거나 시작할 때마다 사용자 데이터 스크립트를 실행하려면 <persist>true</persist>를 사용자 데이터에 추가합니다.

<script> echo Current date and time >> %SystemRoot%\Temp\test.log echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log </script> <persist>true</persist>
EC2Launch v2 에이전트

UserData 단계에서 EC2Launch v2 executeScript 태스크와 함께 XML 사용자 데이터 스크립트를 분리된 프로세스로 실행하려면 사용자 데이터에 다음 태그를 추가하세요.

<detach>true</detach>

참고

분리 태그는 이전 시작 에이전트에서 지원되지 않습니다.

<script> echo Current date and time >> %SystemRoot%\Temp\test.log echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log </script> <detach>true</detach>

Windows PowerShell 스크립트 구문

AWS Windows AMI에는 AWS Tools for Windows PowerShell이(가) 포함되어 있으므로 사용자 데이터에서 이러한 cmdlet을 지정할 수 있습니다. IAM 역할을 인스턴스와 연결하는 경우, 인스턴스에서 실행되는 애플리케이션이 역할의 자격 증명을 사용하여 AWS 리소스(예: Amazon S3 버킷 등)에 액세스할 수 있기 때문에 cmdlet에 대한 자격 증명을 지정할 필요가 없습니다.

<powershell> 태그를 사용하여 Windows PowerShell 스크립트를 지정합니다. 줄 바꿈을 사용하여 명령을 구분합니다. <powershell> 태그는 대/소문자를 구분합니다.

예:

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell>

기본적으로 사용자 데이터 스크립트는 인스턴스를 시작할 때 한 번만 실행됩니다. 인스턴스를 재부팅하거나 시작할 때마다 사용자 데이터 스크립트를 실행하려면 <persist>true</persist>를 사용자 데이터에 추가합니다.

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <persist>true</persist>
EC2Launch v2 에이전트

UserData 단계에서 EC2Launch v2 executeScript 태스크와 함께 XML 사용자 데이터 스크립트를 분리된 프로세스로 실행하려면 사용자 데이터에 다음 태그를 추가하세요.

<detach>true</detach>

참고

분리 태그는 이전 시작 에이전트에서 지원되지 않습니다.

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <detach>true</detach>

YAML 구성 스크립트 구문

EC2Launch v2를 사용하여 스크립트를 실행하는 경우 YAML 형식을 사용할 수 있습니다. EC2Launch v2에 대한 구성 작업, 세부 정보 및 예제를 보려면 EC2Launch v2 태스크 구성 섹션을 참조하세요.

executeScript 작업을 통해 YAML 스크립트를 지정합니다.

PowerShell 스크립트를 실행하는 YAML 구문 예제

version: 1.0 tasks: - task: executeScript inputs: - frequency: always type: powershell runAs: localSystem content: |- $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file

배치 스크립트를 실행하는 YAML 구문 예제

version: 1.1 tasks: - task: executeScript inputs: - frequency: always type: batch runAs: localSystem content: |- echo Current date and time >> %SystemRoot%\Temp\test.log echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log

Base64 인코딩

Amazon EC2 API 또는 사용자 데이터의 base64 인코딩을 수행하지 않는 도구를 사용하는 경우, 직접 사용자 데이터를 인코딩해야 합니다. 그렇지 않을 경우, 실행할 script 또는 powershell 태그를 찾을 수 없다는 오류가 기록됩니다. 다음은 Windows PowerShell을 사용하여 인코딩하는 예제입니다.

$UserData = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Script))

다음은 PowerShell을 사용하여 디코딩하는 예제입니다.

$Script = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($UserData))

base64 인코딩에 대한 자세한 내용은 https://www.ietf.org/rfc/rfc4648.txt을 참조하세요.

사용자 데이터 실행

기본적으로 모든 AWS Windows AMI는 초기 실행에 대해 활성화되는 사용자 데이터 실행 기능을 포함하고 있습니다. 다음 번에 인스턴스가 재부팅하거나 재시작할 때 사용자 데이터 스크립트가 실행되도록 지정할 수 있습니다. 또는 인스턴스가 재부팅하거나 재시작할 때마다 사용자 데이터 스크립트가 실행되도록 지정할 수도 있습니다.

참고

초기 실행 후에는 사용자 데이터가 기본적으로 실행되도록 설정되어 있지 않습니다. 인스턴스를 재부팅하거나 시작할 때 사용자 데이터가 실행되도록 설정하려면 이후 재부팅 또는 시작 섹션을 참조하세요.

사용자 데이터 스크립트는 임의 암호가 생성될 때 로컬 관리자 계정에서 실행됩니다. 그렇지 않으면 사용자 데이터 스크립트가 시스템 계정에서 실행됩니다.

인스턴스 시작

인스턴스 사용자 데이터의 스크립트는 인스턴스 초기 시작 중에 실행됩니다. persist 태그가 있는 경우 사용자 데이터 실행이 후속 재부팅이나 시작에 대해 활성화됩니다. EC2Launch v2, EC2Launch 및 EC2Config용 로그 파일에는 표준 출력 및 표준 오류 스트림의 출력이 들어 있습니다.

EC2Launch v2

EC2Launch v2의 로그 파일은 C:\ProgramData\Amazon\EC2Launch\log\agent.log입니다.

참고

C:\ProgramData 폴더를 숨길 수 있습니다. 폴더를 보려면 숨겨진 파일과 폴더를 표시해야 합니다.

다음 정보는 사용자 데이터가 실행될 때 로깅됩니다.

  • Info: Converting user-data to yaml format - 사용자 데이터가 XML 형식으로 제공된 경우

  • Info: Initialize user-data state - 사용자 데이터 실행의 시작

  • Info: Frequency is: always - 부팅할 때마다 사용자 데이터 태스크가 실행되는 경우

  • Info: Frequency is: once - 사용자 데이터 태스크가 한 번만 실행되는 경우

  • Stage: postReadyUserData execution completed - 사용자 데이터 실행의 끝

EC2Launch

EC2Launch에 대한 로그 파일은 C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log입니다.

C:\ProgramData 폴더를 숨길 수 있습니다. 폴더를 보려면 숨겨진 파일과 폴더를 표시해야 합니다.

다음 정보는 사용자 데이터가 실행될 때 로깅됩니다.

  • Userdata execution begins - 사용자 데이터 실행의 시작

  • <persist> tag was provided: true - persist 태그가 있는 경우

  • Running userdata on every boot - persist 태그가 있는 경우

  • <powershell> tag was provided.. running powershell content - powershell 태그가 있는 경우

  • <script> tag was provided.. running script content - script 태그가 있는 경우

  • Message: The output from user scripts - 사용자 데이터 스크립트가 실행되는 경우 해당 출력이 로깅됨

EC2Config

EC2Config의 로그 파일은 C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2Config.log입니다. 다음 정보는 사용자 데이터가 실행될 때 로깅됩니다.

  • Ec2HandleUserData: Message: Start running user scripts - 사용자 데이터 실행의 시작

  • Ec2HandleUserData: Message: Re-enabled userdata execution - persist 태그가 있는 경우

  • Ec2HandleUserData: Message: Could not find <persist> and </persist> - persist 태그가 없는 경우

  • Ec2HandleUserData: Message: The output from user scripts - 사용자 데이터 스크립트가 실행되는 경우 해당 출력이 로깅됨

이후 재부팅 또는 시작

인스턴스 사용자 데이터를 업데이트하는 경우 인스턴스를 재부팅하거나 시작할 때 사용자 데이터 스크립트가 자동으로 실행되지 않습니다. 하지만 인스턴스를 재부팅하거나 시작할 때 한 번만 또는 인스턴스를 재부팅하거나 시작할 때마다 사용자 데이터 스크립트가 실행되도록 사용자 데이터 실행을 활성화할 수 있습니다.

[Sysprep으로 종료(Shutdown with Sysprep)] 옵션을 선택하는 경우 이후 재부팅이나 시작에 대해 사용자 데이터 실행을 활성화하지 않았더라도 다음에 인스턴스가 재부팅되거나 시작될 때 사용자 데이터 스크립트가 실행됩니다. 사용자 데이터 스크립트는 이후 재부팅 또는 시작 시 실행되지 않습니다.

EC2Launch v2를 사용하여 사용자 데이터 실행을 활성화하려면(미리 보기 AMI)
  • 처음 부팅할 때 사용자 데이터에서 작업을 실행하려면 frequencyonce로 설정합니다.

  • 부팅할 때마다 사용자 데이터에서 작업을 실행하려면 frequencyalways로 설정합니다.

EC2Launch를 사용하여 사용자 데이터 실행을 활성화하려면(Windows Server 2016 이상)
  1. Windows 인스턴스에 연결합니다.

  2. PowerShell 명령 창을 열고 다음 명령을 실행합니다.

    C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 -Schedule
  3. Windows 인스턴스에서 연결을 해제합니다. 다음 번에 인스턴스가 시작될 때 업데이트된 스크립트를 실행하려면 인스턴스를 중지하고 사용자 데이터를 업데이트합니다. 자세한 내용은 인스턴스 사용자 데이터 보기 및 업데이트 섹션을 참조하세요.

EC2Config를 사용하여 사용자 데이터 실행을 활성화하려면(Windows Server 2012 R2 이하)
  1. Windows 인스턴스에 연결합니다.

  2. Open C:\Program Files\Amazon\Ec2ConfigService\Ec2ConfigServiceSetting.exe.

  3. 사용자 데이터에서 Enable UserData execution for next service start(다음 서비스 시작 시 사용자 데이터 실행 활성화)를 선택합니다.

  4. Windows 인스턴스에서 연결을 해제합니다. 다음 번에 인스턴스가 시작될 때 업데이트된 스크립트를 실행하려면 인스턴스를 중지하고 사용자 데이터를 업데이트합니다. 자세한 내용은 인스턴스 사용자 데이터 보기 및 업데이트 섹션을 참조하세요.

사용자 데이터 및 콘솔

인스턴스를 시작할 때 인스턴스 사용자 데이터를 지정할 수 있습니다. 인스턴스의 루트 볼륨이 EBS 볼륨이면 인스턴스를 중지하고 사용자 데이터를 업데이트할 수도 있습니다.

시작 시 인스턴스 사용자 데이터 지정

인스턴스 시작 절차를 따릅니다. 사용자 데이터(User data) 필드는 인스턴스 시작 마법사의 고급 세부 정보 섹션에 있습니다. 사용자 데이터 필드에 PowerShell 스크립트를 입력한 다음 인스턴스 시작 절차를 완료합니다.

다음 사용자 데이터 필드 스크린샷의 예제 스크립트는 파일 이름에 현재 날짜 및 시간을 사용하여 Windows 임시 폴더에 파일을 생성합니다. <persist>true</persist>를 포함할 경우 인스턴스를 재부팅하거나 시작할 때마다 스크립트가 실행됩니다. 사용자 데이터가 이미 base64로 인코딩됨 확인란을 비워 두면 Amazon EC2 콘솔이 base64 인코딩을 수행합니다.


					사전 세부 정보 사용자 데이터 텍스트 필드입니다.

인스턴스 사용자 데이터 보기 및 업데이트

모든 인스턴스의 인스턴스 사용자 데이터를 볼 수 있으며, 중지된 인스턴스의 인스턴스 사용자 데이터를 업데이트할 수 있습니다.

콘솔을 사용하여 인스턴스의 사용자 데이터를 업데이트하려면
  1. https://console.aws.amazon.com/ec2/에서 Amazon EC2 콘솔을 엽니다.

  2. 탐색 창에서 Instances(인스턴스)를 선택합니다.

  3. 인스턴스를 선택하고 작업, 인스턴스 상태, 인스턴스 중지를 차례로 선택합니다.

    주의

    인스턴스를 중지하면 인스턴스 스토어 볼륨의 데이터가 삭제됩니다. 인스턴스 스토어 볼륨의 데이터를 유지하려면 영구 스토리지에 백업하세요.

  4. 확인 메시지가 표시되면 [Stop]을 선택합니다. 인스턴스가 중지하는 데 몇 분 정도 걸릴 수 있습니다.

  5. 인스턴스가 선택된 상태에서 작업(Actions), 인스턴스 설정(Instance settings), 사용자 데이터 편집(Edit user data)을 차례로 선택합니다. 인스턴스가 실행 중일 때는 사용자 데이터를 변경할 수 없습니다. 하지만 볼 수는 있습니다.

  6. [사용자 데이터 편집(Edit user data)] 대화 상자에서 사용자 데이터를 업데이트하고 [저장(Save)]을 선택합니다. 매번 인스턴스를 재부팅하거나 시작할 때마다 사용자 데이터 스크립트를 실행하려면 다음 예제와 같이 <persist>true</persist>를 추가합니다.

    
							사용자 데이터 편집 대화 상자입니다.
  7. 인스턴스를 시작합니다. 이후의 재부팅 또는 시작에 대해 사용자 데이터 실행을 활성화한 경우 인스턴스 시작 프로세스의 일부로서 업데이트된 사용자 데이터 스크립트가 실행됩니다.

사용자 데이터 및 Tools for Windows PowerShell

Tools for Windows PowerShell을 사용하여 인스턴스의 사용자 데이터를 지정, 수정 및 확인할 수 있습니다. 인스턴스 메타데이터를 사용하여 인스턴스의 사용자 데이터를 보는 방법에 대한 자세한 내용은 인스턴스에서 인스턴스 사용자 데이터 검색 섹션을 참조하세요. 사용자 데이터 및 AWS CLI에 대한 자세한 내용은 Linux 인스턴스용 Amazon EC2 사용 설명서에서 사용자 데이터 및 AWS CLI를 참조하세요.

예시: 시작 시 인스턴스 사용자 데이터 지정

인스턴스 사용자 데이터를 포함하는 텍스트 파일을 생성합니다. 매번 인스턴스를 재부팅하거나 시작할 때마다 사용자 데이터 스크립트를 실행하려면 다음 예제와 같이 <persist>true</persist>를 추가합니다.

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <persist>true</persist>

인스턴스를 시작할 때 인스턴스 사용자 데이터를 지정하려면 New-EC2Instance 명령을 사용합니다. 이 명령은 사용자 데이터의 base64 인코딩을 수행하지 않습니다. 다음 명령을 사용하여 사용자 데이터를 script.txt 이름의 텍스트 파일로 인코딩합니다.

PS C:\> $Script = Get-Content -Raw script.txt PS C:\> $UserData = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Script))

-UserData 파라미터를 사용하여 사용자 데이터를 New-EC2Instance 명령으로 전달합니다.

PS C:\> New-EC2Instance -ImageId ami-abcd1234 -MinCount 1 -MaxCount 1 -InstanceType m3.medium \ -KeyName my-key-pair -SubnetId subnet-12345678 -SecurityGroupIds sg-1a2b3c4d \ -UserData $UserData
예시: 중지된 인스턴스에 대한 인스턴스 사용자 데이터 업데이트

Edit-EC2InstanceAttribute 명령을 사용하여 중지된 인스턴스의 사용자 데이터를 수정할 수 있습니다.

새 스크립트를 포함하는 텍스트 파일을 생성합니다. 다음 명령을 사용하여 사용자 데이터를 new-script.txt 이름의 텍스트 파일로 인코딩합니다.

PS C:\> $NewScript = Get-Content -Raw new-script.txt PS C:\> $NewUserData = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($NewScript))

-UserData-Value 파라미터를 사용하여 사용자 데이터를 지정합니다.

PS C:\> Edit-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData -Value $NewUserData
예시: 인스턴스 사용자 데이터 보기

인스턴스의 사용자 데이터를 가져오려면 Get-EC2InstanceAttribute 명령을 사용합니다.

PS C:\> (Get-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData).UserData

다음은 예시 출력입니다. 사용자 데이터가 인코딩됩니다.

PHBvd2Vyc2hlbGw+DQpSZW5hbWUtQ29tcHV0ZXIgLU5ld05hbWUgdXNlci1kYXRhLXRlc3QNCjwvcG93ZXJzaGVsbD4=

다음 명령을 사용하여 인코딩된 사용자 데이터를 변수에 저장한 다음 디코딩합니다.

PS C:\> $UserData_encoded = (Get-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData).UserData PS C:\> [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($UserData_encoded))

다음은 예시 출력입니다.

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <persist>true</persist>
예시: 태그 값과 일치하도록 인스턴스의 이름 바꾸기

Get-EC2Tag 명령을 사용하여 태그 값을 읽고 처음 부팅할 때 태그 값과 일치하도록 인스턴스 이름을 바꾼 다음 재부팅할 수 있습니다. 이 명령을 성공적으로 실행하려면 API 호출로 태그 정보를 가져오기 때문에 인스턴스에 ec2:DescribeTags 권한이 연결된 역할이 있어야 합니다. IAM 역할을 사용하여 권한을 설정하는 방법에 대한 자세한 내용은 인스턴스에 IAM 역할 연결을 참조하세요.

참고

이 스크립트는 2008 이전의 Windows Server 버전에서 실패합니다.

<powershell> $instanceId = (invoke-webrequest http://169.254.169.254/latest/meta-data/instance-id -UseBasicParsing).content $nameValue = (get-ec2tag -filter @{Name="resource-id";Value=$instanceid},@{Name="key";Value="Name"}).Value $pattern = "^(?![0-9]{1,15}$)[a-zA-Z0-9-]{1,15}$" #Verify Name Value satisfies best practices for Windows hostnames If ($nameValue -match $pattern) {Try {Rename-Computer -NewName $nameValue -Restart -ErrorAction Stop} Catch {$ErrorMessage = $_.Exception.Message Write-Output "Rename failed: $ErrorMessage"}} Else {Throw "Provided name not a valid hostname. Please ensure Name value is between 1 and 15 characters in length and contains only alphanumeric or hyphen characters"} </powershell>

인스턴스가 인스턴스 메타데이터의 태그에 액세스하도록 구성된 경우 인스턴스 메타데이터의 태그를 사용하여 인스턴스 이름을 바꿀 수도 있습니다.

참고

이 스크립트는 2008 이전의 Windows Server 버전에서 실패합니다.

<powershell> $nameValue = Get-EC2InstanceMetadata -Path /tags/instance/Name $pattern = "^(?![0-9]{1,15}$)[a-zA-Z0-9-]{1,15}$" #Verify Name Value satisfies best practices for Windows hostnames If ($nameValue -match $pattern) {Try {Rename-Computer -NewName $nameValue -Restart -ErrorAction Stop} Catch {$ErrorMessage = $_.Exception.Message Write-Output "Rename failed: $ErrorMessage"}} Else {Throw "Provided name not a valid hostname. Please ensure Name value is between 1 and 15 characters in length and contains only alphanumeric or hyphen characters"} </powershell>