EC2 인스턴스를 시작할 때 사용자 데이터 입력으로 명령 실행하기
EC2 인스턴스를 시작할 때 사용자 데이터 입력으로 명령 실행하기
Amazon EC2 인스턴스를 시작할 때 인스턴스에 사용자 데이터를 전달할 수 있으며, 이를 사용해 자동화된 구성 작업을 수행하거나 인스턴스 시작 후 스크립트를 실행할 수 있어요. 이 절에서 Linux·Windows에서의 사용자 데이터 처리 방식과 스크립트 구문을 살펴볼게요.
출처: 문서
본문
Amazon EC2 인스턴스를 시작할 때 인스턴스에 사용자 데이터를 전달할 수 있으며, 이를 사용해 자동화된 구성 작업을 수행하거나 인스턴스 시작 후 스크립트를 실행할 수 있어요.
더 복잡한 자동화 시나리오에 관심이 있다면 CloudFormation을 고려할 수 있어요. 자세한 내용은 AWS CloudFormation User Guide의 Deploying applications on Amazon EC2 with CloudFormation을 참고하세요.
Linux 인스턴스에서는 두 가지 유형의 사용자 데이터를 Amazon EC2에 전달할 수 있어요: 셸 스크립트와 cloud-init 지시문. 또한 이 데이터를 평문으로, 파일로(명령줄 도구로 인스턴스를 시작할 때 유용), 또는 base64 인코딩 텍스트로(API 호출용) 시작 인스턴스 마법사에 전달할 수 있어요.
Windows 인스턴스에서는 시작 에이전트가 사용자 데이터 스크립트를 처리해요.
고려 사항
- 사용자 데이터는 불투명 데이터(opaque data)로 취급됩니다. 즉 넣은 만큼 그대로 돌려받아요. 인스턴스가 해석하는 것은 인스턴스의 몫이에요.
- 사용자 데이터는 base64로 인코딩되어야 해요. Amazon EC2 콘솔은 base64 인코딩을 대신 수행하거나 base64 인코딩 입력을 받아들일 수 있어요. 인스턴스 메타데이터나 콘솔로 사용자 데이터를 검색하면 자동으로 base64 디코딩됩니다.
- 사용자 데이터는 base64 인코딩 전 원시(raw) 형태로 16 KB로 제한됩니다. base64 인코딩 후 길이 n 문자열의 크기는
ceil(n/3)*4예요. - 사용자 데이터는 인스턴스 속성입니다. 인스턴스에서 AMI를 만들면 인스턴스 사용자 데이터는 AMI에 포함되지 않아요.
AWS Management Console의 사용자 데이터
인스턴스를 시작할 때 인스턴스 사용자 데이터를 지정할 수 있어요. 인스턴스의 루트 볼륨이 EBS 볼륨이라면 인스턴스를 중지하고 사용자 데이터를 업데이트할 수도 있어요.
Launch Wizard로 시작 시 인스턴스 사용자 데이터 지정
EC2 콘솔의 Launch Wizard로 인스턴스를 시작할 때 사용자 데이터를 지정할 수 있어요. 시작 시 사용자 데이터를 지정하려면 인스턴스 시작 절차를 따르세요. User data 필드는 시작 인스턴스 마법사의 Advanced details 섹션에 있습니다. User data 필드에 내 PowerShell 스크립트를 입력한 다음 인스턴스 시작 절차를 완료하세요.
User data 필드의 다음 스크린샷에서 예제 스크립트는 파일 이름에 현재 날짜와 시간을 사용해 Windows 임시 폴더에 파일을 만듭니다. <persist>true</persist>를 포함하면 스크립트는 인스턴스를 재부팅하거나 시작할 때마다 실행됩니다. User data has already been base64 encoded 체크박스를 비워두면 Amazon EC2 콘솔이 base64 인코딩을 대신 수행해요.
자세한 내용은 Launch Wizard로 시작 시 인스턴스 사용자 데이터 지정을 참고하세요. AWS CLI를 사용하는 Linux 예시는 사용자 데이터와 AWS CLI를, Tools for Windows PowerShell을 사용하는 Windows 예시는 사용자 데이터와 Tools for Windows PowerShell을 참고하세요.
인스턴스 사용자 데이터 보기 및 업데이트
모든 인스턴스의 인스턴스 사용자 데이터를 볼 수 있고, 중지된 인스턴스의 인스턴스 사용자 데이터를 업데이트할 수 있어요.
콘솔로 인스턴스 사용자 데이터 업데이트
- https://console.aws.amazon.com/ec2/에서 Amazon EC2 콘솔을 엽니다.
- 탐색 창에서 Instances를 선택합니다.
- 인스턴스를 선택하고 Actions, Instance state, Stop instance를 선택합니다.
경고
인스턴스를 중지하면 인스턴스 스토어 볼륨의 데이터가 손실됩니다. 이 데이터를 보존하려면 영구 스토리지에 백업하세요.
- 확인을 묻는 메시지가 표시되면 Stop을 선택합니다. 인스턴스가 중지되는 데 몇 분이 걸릴 수 있어요.
- 인스턴스가 여전히 선택된 상태에서 Actions, Instance settings, Edit user data를 선택합니다. 인스턴스가 실행 중이면 사용자 데이터를 변경할 수 없지만 볼 수는 있어요.
- Edit user data 대화 상자에서 사용자 데이터를 업데이트한 다음 Save를 선택합니다. 인스턴스를 재부팅하거나 시작할 때마다 사용자 데이터 스크립트를 실행하려면 다음 예시와 같이
<persist>true</persist>를 추가합니다. - 인스턴스를 시작합니다. 후속 재부팅이나 시작에 대해 사용자 데이터 실행을 활성화했다면 업데이트된 사용자 데이터 스크립트가 인스턴스 시작 프로세스의 일부로 실행됩니다.
Amazon EC2가 Linux 인스턴스의 사용자 데이터를 처리하는 방식
다음 예시는 인스턴스를 시작할 때 LAMP 서버를 설정하는 명령을 실행하기 위해 사용자 데이터를 사용합니다. 각 예시에서 다음 작업이 수행됩니다.
- 배포판 소프트웨어 패키지가 업데이트됩니다.
web server,php,mariadb패키지가 설치됩니다.httpd서비스가 시작되고 켜집니다.ec2-user사용자가apache그룹에 추가됩니다.- 웹 디렉터리와 그 안에 포함된 파일에 적절한 소유권과 파일 권한이 설정됩니다.
- 웹 서버와 PHP 엔진을 테스트하기 위한 간단한 웹 페이지가 만들어집니다.
Amazon EC2가 Windows 인스턴스의 사용자 데이터를 처리하는 방식
Windows 인스턴스에서는 시작 에이전트가 사용자 데이터와 관련된 작업을 수행합니다. 자세한 내용은 다음을 참고하세요.
CloudFormation 템플릿에서 UserData 속성 조립의 예시는 Base64 Encoded UserData Property와 Base64 Encoded UserData Property with AccessKey and SecretKey를 참고하세요.
라이프사이클 후크(lifecycle hooks)와 함께 작동하는 Auto Scaling 그룹 내 인스턴스에서 명령을 실행하는 예시는 Amazon EC2 Auto Scaling User Guide의 Tutorial: Configure user data to retrieve the target lifecycle state through instance metadata를 참고하세요.
사용자 데이터 스크립트
EC2Config나 EC2Launch가 스크립트를 실행하려면 사용자 데이터에 추가할 때 스크립트를 특수 태그 안에 넣어야 해요. 사용하는 태그는 명령이 명령 프롬프트 창(배치 명령)에서 실행되는지 Windows PowerShell을 사용하는지에 따라 달라져요.
배치 스크립트와 Windows PowerShell 스크립트를 모두 지정하면 인스턴스 사용자 데이터에 나타나는 순서와 관계없이 배치 스크립트가 먼저 실행되고 Windows PowerShell 스크립트가 다음에 실행됩니다.
사용자 데이터 스크립트에서 AWS CLI를 포함한 AWS API를 사용한다면 인스턴스를 시작할 때 인스턴스 프로필(instance profile)을 사용해야 해요. 인스턴스 프로필은 사용자 데이터 스크립트가 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 에이전트
XML 사용자 데이터 스크립트를 EC2Launch v2의 UserData 스테이지에서 executeScript 작업으로 분리된 프로세스(detached process)로 실행하려면 사용자 데이터에 <detach>true</detach>를 추가합니다.
참고
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 역할을 연결하면 cmdlet에 자격 증명을 지정할 필요가 없어요. 인스턴스에서 실행되는 애플리케이션이 역할의 자격 증명을 사용해 AWS 리소스(예: Amazon S3 버킷)에 접근하기 때문입니다.
<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>
<powershellArguments> 태그로 하나 이상의 PowerShell 인수를 지정할 수 있어요. 인수가 전달되지 않으면 EC2Launch와 EC2Launch v2는 기본적으로 다음 인수를 추가합니다: -ExecutionPolicy Unrestricted.
예시:
<powershell>
$file = $env:SystemRoot + "\Temp" + (Get-Date).ToString("MM-dd-yy-hh-mm")
New-Item $file -ItemType file
</powershell>
<powershellArguments>-ExecutionPolicy Unrestricted -NoProfile -NonInteractive</powershellArguments>
EC2Launch v2 에이전트
XML 사용자 데이터 스크립트를 EC2Launch v2의 UserData 스테이지에서 executeScript 작업으로 분리된 프로세스로 실행하려면 사용자 데이터에 <detach>true</detach>를 추가합니다.
참고
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 task configuration을 참고하세요.
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 인코딩
사용자 데이터의 base64 인코딩을 수행하지 않는 Amazon EC2 API나 도구를 사용한다면 사용자 데이터를 직접 인코딩해야 해요. 그렇지 않으면 실행할 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를 참고하세요.
압축된 사용자 데이터
EC2Launch v2는 IMDS가 부과하는 16 KB 제한보다 큰 사용자 데이터를 제출하는 방법으로 압축된(zipped) 사용자 데이터를 지원해요. 이 기능을 사용하려면 사용자 데이터 스크립트를 .zip 아카이브로 압축해 EC2 인스턴스에 전달합니다. EC2Launch v2가 압축된 사용자 데이터를 감지하면 자동으로 압축을 풀고 실행해요.
표준 사용자 데이터와 마찬가지로, 사용자 데이터의 base64 인코딩을 수행하지 않는 Amazon EC2 API나 도구를 사용한다면 압축된 사용자 데이터를 직접 인코딩해야 해요. 사용자 데이터 크기 제한과 base64 인코딩에 대한 자세한 내용은 EC2 인스턴스의 인스턴스 메타데이터 접근을 참고하세요.
사용자 데이터 실행
기본적으로 모든 AWS Windows AMI는 초기 시작에 대해 사용자 데이터 실행이 활성화되어 있어요. 인스턴스가 다음에 재부팅하거나 다시 시작할 때 사용자 데이터 스크립트가 실행되도록 지정할 수 있어요. 또는 인스턴스가 재부팅하거나 다시 시작할 때마다 사용자 데이터 스크립트가 실행되도록 지정할 수도 있어요.
참고
사용자 데이터는 초기 시작 후에는 기본적으로 실행되도록 활성화되어 있지 않아요. 재부팅하거나 인스턴스를 시작할 때 사용자 데이터가 실행되도록 활성화하려면 후속 재부팅 또는 시작 중에 스크립트 실행을 참고하세요.
임의 암호가 생성되면 사용자 데이터 스크립트는 로컬 관리자 계정에서 실행됩니다. 그렇지 않으면 사용자 데이터 스크립트는 System 계정에서 실행됩니다.
인스턴스 시작 스크립트
인스턴스 사용자 데이터의 스크립트는 인스턴스의 초기 시작 중에 실행됩니다. 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– 사용자 데이터 스크립트가 실행되면 그 출력이 기록됩니다
후속 재부팅 또는 시작 중에 스크립트 실행
인스턴스 사용자 데이터를 업데이트하면 업데이트된 사용자 데이터 내용이 다음에 인스턴스를 재부팅하거나 시작할 때 인스턴스 메타데이터에 자동으로 반영됩니다. 하지만 설치된 시작 에이전트에 따라 후속 재부팅이나 시작에서 사용자 데이터 스크립트가 실행되도록 추가 구성이 필요할 수 있어요.
Shutdown with Sysprep 옵션을 선택하면 후속 재부팅이나 시작에 대해 사용자 데이터 실행을 활성화하지 않았어도 사용자 데이터 스크립트가 인스턴스가 다음에 시작되거나 재부팅할 때 실행됩니다.
사용자 데이터 실행을 활성화하는 지침은 내 시작 에이전트와 일치하는 탭을 선택하세요.
EC2Launch v2
EC2Launch v1과 달리 EC2Launch v2는 모든 부팅에서 사용자 데이터 작업을 평가합니다. 사용자 데이터 작업을 수동으로 예약할 필요가 없어요. 사용자 데이터는 포함된 frequency 또는 persist 옵션에 기반해 실행됩니다.
XML 사용자 데이터 스크립트의 경우
모든 부팅에서 사용자 데이터 스크립트를 실행하려면 사용자 데이터에 <persist>true</persist> 플래그를 추가합니다. persist 플래그가 포함되지 않으면 사용자 데이터 스크립트는 초기 부팅에서만 실행됩니다.
YAML 사용자 데이터의 경우
- 초기 부팅에서 사용자 데이터 작업을 실행하려면 작업 frequency를
once로 설정합니다. - 모든 부팅에서 사용자 데이터 작업을 실행하려면 작업 frequency를
always로 설정합니다.
EC2Launch
- Windows 인스턴스에 연결합니다.
- PowerShell 명령 창을 열고 다음 명령 중 하나를 실행합니다.
한 번 실행
다음 부팅에서 사용자 데이터를 한 번 실행하려면 -Schedule 플래그를 사용합니다.
C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 -Schedule
모든 후속 부팅에서 실행
모든 후속 부팅에서 사용자 데이터를 실행하려면 -SchedulePerBoot 플래그를 사용합니다.
C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 -SchedulePerBoot
- Windows 인스턴스에서 연결을 끊습니다. 인스턴스가 다음에 시작될 때 업데이트된 스크립트를 실행하려면 인스턴스를 중지하고 사용자 데이터를 업데이트합니다.
EC2Config
- Windows 인스턴스에 연결합니다.
C:\Program Files\Amazon\Ec2ConfigService\Ec2ConfigServiceSetting.exe를 엽니다.- User Data에서 Enable UserData execution for next service start를 선택합니다.
- Windows 인스턴스에서 연결을 끊습니다. 인스턴스가 다음에 시작될 때 업데이트된 스크립트를 실행하려면 인스턴스를 중지하고 사용자 데이터를 업데이트합니다.
사용자 데이터와 Tools for Windows PowerShell
Tools for Windows PowerShell을 사용해 인스턴스의 사용자 데이터를 지정, 수정, 볼 수 있어요. 인스턴스 메타데이터로 인스턴스에서 사용자 데이터를 보는 방법은 EC2 인스턴스의 인스턴스 메타데이터 접근을 참고하세요. 사용자 데이터와 AWS CLI에 대한 자세한 내용은 사용자 데이터와 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 역할 연결을 참고하세요.
IMDSv2
<powershell>
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri 'http://169.254.169.254/latest/api/token' -UseBasicParsing
$instanceId = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri 'http://169.254.169.254/latest/meta-data/instance-id' -UseBasicParsing
$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>
IMDSv1
<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>
인스턴스가 인스턴스 메타데이터에서 태그에 접근하도록 구성되어 있다면 인스턴스 메타데이터의 태그를 사용해 인스턴스 이름을 변경할 수도 있어요. 자세한 내용은 인스턴스 메타데이터로 EC2 인스턴스 태그 보기를 참고하세요.
IMDSv2
<powershell>
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri 'http://169.254.169.254/latest/api/token' -UseBasicParsing
$nameValue = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri 'http://169.254.169.254/latest/meta-data/tags/instance/Name' -UseBasicParsing
$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>
IMDSv1
<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>