

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 세션 스크립트를 사용하여 Amazon WorkSpaces 애플리케이션 사용자의 스트리밍 환경 관리
<a name="use-session-scripts"></a>

WorkSpaces 애플리케이션은 인스턴스 세션 스크립트를 제공합니다. 이러한 스크립트를 사용하여 사용자의 스트리밍 세션에서 특정 이벤트가 발생했을 때 자체 사용자 지정 스크립트를 실행할 수 있습니다. 예를 들어 사용자 지정 스크립트를 사용하여 사용자의 스트리밍 세션이 시작되기 전에 WorkSpaces 애플리케이션 환경을 준비할 수 있습니다. 또한 사용자 지정 스크립트를 사용하여 사용자가 스트리밍 세션을 완료한 후 스트리밍 인스턴스를 정리할 수도 있습니다.

세션 스크립트는 WorkSpaces 애플리케이션 이미지 내에서 지정됩니다. 이러한 스크립트는 사용자 컨텍스트 또는 시스템 컨텍스트 내에서 실행됩니다. 세션 스크립트가 표준 출력을 사용하여 정보, 오류 또는 디버깅 메시징을 쓰는 경우, Amazon Web Services 계정 내의 Amazon S3 버킷에 이러한 것을 저장할 수도 있습니다.

**Topics**
+ [스트리밍 세션이 시작되기 전에 스크립트 실행](run-scripts-before-streaming-sessions-begin.md)
+ [스트리밍 세션이 종료된 후 스크립트 실행](run-scripts-after-streaming-sessions-end.md)
+ [세션 스크립트 생성 및 지정](create-specify-session-scripts.md)
+ [세션 스크립트 구성 파일](session-script-configuration-file.md)
+ [Windows PowerShell 파일 사용](using-powershell-files-with-session-scripts.md)
+ [세션 스크립트 출력 로깅](logging-session-output.md)
+ [세션 스크립트와 함께 스토리지 커넥터 사용](use-storage-connectors-with-session-scripts.md)
+ [세션 스크립트 로그를 저장하기 위해 Amazon S3 버킷 스토리지 활성화](enable-S3-bucket-storage-session-script-logs.md)
+ [다중 세션 플릿에서 세션 스크립트 사용](session-scripts-multi-session-fleets.md)

# 스트리밍 세션이 시작되기 전에 스크립트 실행
<a name="run-scripts-before-streaming-sessions-begin"></a>

사용자의 애플리케이션이 시작되고 스트리밍 세션이 시작되기 전에 최대 60초 동안 스크립트가 실행되도록 구성할 수 있습니다. 이렇게 하면 사용자가 애플리케이션 스트리밍을 시작하기 전에 WorkSpaces 애플리케이션 환경을 사용자 지정할 수 있습니다. 세션 스크립트가 실행되면 사용자에게 로딩 회전자가 표시됩니다. 스크립트가 성공적으로 완료되거나 최대 대기 시간이 경과하면, 사용자의 스트리밍 세션이 시작됩니다. 스크립트가 성공적으로 완료되지 않은 경우 사용자에게 오류 메시지가 표시됩니다. 그러나 사용자의 스트리밍 세션 사용이 방해되지는 않습니다.

Windows 인스턴스에서 파일 이름을 지정할 때 이중 백슬래시를 사용해야 합니다. 예제:

C:\$1\$1Scripts\$1\$1Myscript.bat

이중 백슬래시를 사용하지 않으면 .json 파일이 잘못 포맷되었다는 오류가 표시됩니다.

**참고**  
스크립트가 성공적으로 완료되면 스크립트는 값 0을 반환합니다. 스크립트가 0 이외의 값을 반환하면 WorkSpaces 애플리케이션은 사용자에게 오류 메시지를 표시합니다.

스트리밍 세션이 시작되기 전에 스크립트를 실행하고 WorkSpaces 애플리케이션 동적 애플리케이션 프레임워크가 활성화되지 않은 경우 다음 프로세스가 발생합니다.

![\[WorkSpaces Applications workflow diagram showing connection, application selection, and session launch steps.\]](http://docs.aws.amazon.com/ko_kr/appstream2/latest/developerguide/images/session-scripts-without-DAF-non-domain-joined2.png)


1. 사용자는 도메인에 조인되지 않은 WorkSpaces 애플리케이션 플릿 인스턴스에 연결합니다. 사용자는 다음 액세스 방법 중 하나를 사용하여 연결합니다.
   + WorkSpaces 애플리케이션 사용자 풀
   + SAML 2.0
   + WorkSpaces 애플리케이션 API

1. 애플리케이션 카탈로그가 WorkSpaces 애플리케이션 포털에 표시되고 사용자가 시작할 애플리케이션을 선택합니다.

1. 다음 중 하나가 발생합니다.
   + 사용자에게 애플리케이션 설정 지속성이 활성화된 경우, 사용자의 사용자 지정 및 Windows 설정을 저장하는 애플리케이션 설정 VHD(가상 하드 디스크) 파일이 다운로드 및 탑재됩니다. 이 경우 Windows 사용자 로그인이 필요합니다.

     애플리케이션 설정 지속성에 대한 자세한 내용은 [WorkSpaces 애플리케이션 사용자에 대한 애플리케이션 설정 지속성 활성화](app-settings-persistence.md) 섹션을 참조하세요.
   + 애플리케이션 설정 지속성이 활성화되지 않은 경우, Windows 사용자가 이미 로그인한 것입니다.

1. 세션 스크립트가 시작됩니다. 사용자에게 영구 스토리지가 활성화된 경우, 스토리지 커넥터 탑재도 시작됩니다. 영구 스토리지에 대한 자세한 내용은 [WorkSpaces 애플리케이션 사용자를 위한 영구 스토리지 활성화 및 관리](persistent-storage.md) 섹션을 참조하세요.
**참고**  
스트리밍 세션을 시작하기 위해 스토리지 커넥터 탑재를 완료할 필요는 없습니다. 스토리지 커넥터 탑재가 완료되기 전에 세션 스크립트가 완료되면, 스트리밍 세션이 시작됩니다.  
스토리지 커넥터의 장착 상태 모니터링에 대한 자세한 내용은 [세션 스크립트와 함께 스토리지 커넥터 사용](use-storage-connectors-with-session-scripts.md) 섹션을 참조하세요.

1. 세션 스크립트가 완료되거나 시간 초과됩니다.

1. 사용자의 스트리밍 세션이 시작됩니다.

1. 사용자가 선택한 애플리케이션이 시작됩니다.

WorkSpaces 애플리케이션 동적 애플리케이션 프레임워크에 대한 자세한 내용은 섹션을 참조하세요[WorkSpaces 애플리케이션 동적 애플리케이션 프레임워크를 사용하여 동적 앱 공급자 구축](build-dynamic-app-provider.md).

스트리밍 세션이 시작되기 전에 스크립트를 실행하고 WorkSpaces 애플리케이션 동적 애플리케이션 프레임워크가 활성화되면 다음 프로세스가 발생합니다.

![\[WorkSpaces Applications workflow from user login to application launch, including SAML authentication and session scripts.\]](http://docs.aws.amazon.com/ko_kr/appstream2/latest/developerguide/images/session-scripts-with-DAF-domain-joined2.png)


1. 사용자는 조직의 SAML 2.0 애플리케이션 포털을 방문하여 WorkSpaces 애플리케이션 스택을 선택합니다.

1. 도메인에 조인된 WorkSpaces 애플리케이션 플릿 인스턴스에 연결합니다.

1. 사용자에게 애플리케이션 설정 지속성이 활성화된 경우, 사용자의 사용자 지정 및 Windows 설정을 저장하는 애플리케이션 설정 VHD 파일이 다운로드 및 탑재됩니다.

1. Windows 사용자 로그온이 발생합니다.

1. 애플리케이션 카탈로그가 WorkSpaces 애플리케이션 포털에 표시되고 사용자가 시작할 애플리케이션을 선택합니다.

1. 세션 스크립트가 시작됩니다. 사용자에게 영구 스토리지가 활성화된 경우, 스토리지 커넥터 탑재도 시작됩니다.
**참고**  
스트리밍 세션을 시작하기 위해 스토리지 커넥터 탑재를 완료할 필요는 없습니다. 스토리지 커넥터 탑재가 완료되기 전에 세션 스크립트가 완료되면, 스트리밍 세션이 시작됩니다.  
스토리지 커넥터의 장착 상태 모니터링에 대한 자세한 내용은 [세션 스크립트와 함께 스토리지 커넥터 사용](use-storage-connectors-with-session-scripts.md) 섹션을 참조하세요.

1. 세션 스크립트가 완료되거나 시간 초과됩니다.

1. 사용자의 스트리밍 세션이 시작됩니다.

1. 사용자가 선택한 애플리케이션이 시작됩니다.

# 스트리밍 세션이 종료된 후 스크립트 실행
<a name="run-scripts-after-streaming-sessions-end"></a>

사용자의 스트리밍 세션이 종료된 후 스크립트가 실행되도록 구성할 수도 있습니다. 예를 들어 사용자가 WorkSpaces 애플리케이션 도구 모음에서 **세션 종료**를 선택하거나 세션에 허용되는 최대 기간에 도달하면 스크립트를 실행할 수 있습니다. 스트리밍 인스턴스가 종료되기 전에 이러한 세션 스크립트를 사용하여 WorkSpaces 애플리케이션 환경을 정리할 수도 있습니다. 예를 들어 스크립트를 사용하여 파일 잠금을 풀거나 로그 파일을 업로드할 수 있습니다. 스트리밍 세션이 종료된 후 스크립트를 실행하면, 다음 프로세스가 발생합니다.

![\[Flowchart showing WorkSpaces Applications session termination process with scripts and storage actions.\]](http://docs.aws.amazon.com/ko_kr/appstream2/latest/developerguide/images/session-scripts-termination.png)


1. 사용자의 WorkSpaces 애플리케이션 스트리밍 세션이 종료됩니다.

1. 세션 종료 스크립트가 시작됩니다.

1. 세션 종료 스크립트가 완료되거나 시간 초과됩니다.

1. Windows 사용자 로그아웃이 발생합니다.

1. 해당하는 경우 다음 중 하나 또는 둘 모두가 동시에 발생합니다.
   + 사용자에게 애플리케이션 설정 지속성이 활성화된 경우, 사용자의 사용자 지정 및 Windows 설정을 저장하는 애플리케이션 설정 VHD 파일이 탑재 해제되고 계정의 Amazon S3 버킷에 업로드됩니다.
   + 사용자에게 영구 스토리지가 활성화된 경우, 스토리지 커넥터가 최종 동기화를 완료하고 탑재 해제됩니다.

1. 플릿 인스턴스가 종료됩니다.

# 세션 스크립트 생성 및 지정
<a name="create-specify-session-scripts"></a>

올웨이즈 온, 온디맨드 및 Elastic 플릿에 대한 세션 스크립트를 구성하고 지정할 수 있습니다.

**올웨이즈 온 및 온디맨드 플릿용 세션 스크립트를 구성 및 지정하는 방법**

1. [https://console.aws.amazon.com/appstream2](https://console.aws.amazon.com/appstream2) WorkSpaces 애플리케이션 콘솔을 엽니다.

1. 탐색 창에서 **이미지**, **이미지 빌더**를 선택합니다.

1. **실행 중** 상태인 이미지 빌더를 선택하고, **연결**을 선택합니다.

1. 메시지가 표시되면 **관리자**를 선택합니다.

1. `C:\AppStream\SessionScripts`로 이동하여 `config.json` 구성 파일을 엽니다.

   세션 스크립트 파라미터에 대한 자세한 내용은 [세션 스크립트 구성 파일](session-script-configuration-file.md) 섹션을 참조하세요.

1. 변경을 완료한 후, `config.json` 파일을 저장하고 닫습니다.

1. 이미지 빌더 바탕 화면에서 **Image Assistant**를 엽니다.

1. (선택 사항) 그 밖에 이미지에 추가하고 싶은 애플리케이션을 지정합니다.

1. Image Assistant의 필요한 단계에 따라 이미지 생성을 마칩니다.

   세션 스크립트 구성을 확인할 수 없는 경우(예를 들어 .json 파일의 형식이 올바르지 않은 경우), **Disconnect and Create Image(이미지 연결 해제 및 생성)**를 선택할 때 알림을 받습니다.
**참고**  
Linux 기반 이미지 빌더용 세션 스크립트 구성 파일을 찾으려면 `/opt/appstream/SessionScripts/config.json`으로 이동하세요.

**Elastic 플릿용 세션 스크립트를 구성 및 지정하는 방법**

1. 세션 스크립트와 config.json 파일을 포함한 zip 파일을 생성합니다. 스크립트 파일은 다음 위치에 복사됩니다. config.json에 이 위치를 사용해야 합니다.
   + Windows의 경우 `C:\AppStream\SessionScripts\SessionScript`를 사용합니다.
   + Linux의 경우 `/opt/appstream/SessionScripts/SessionScript`를 사용합니다.
**참고**  
세션 스크립트 파일을 실행하려면.zip 파일에 세션 스크립트와 `config.json` 파일만 있고 포함하는 폴더는 없어야 합니다. 자세한 내용은 [세션 스크립트 구성 파일](session-script-configuration-file.md) 단원을 참조하십시오.

1. 계정의 Amazon S3의 버킷에 zip 파일을 업로드합니다.
**참고**  
VPC는 Amazon S3 버킷에 대한 액세스 권한을 부여해야 합니다. 자세한 내용은 [WorkSpaces 애플리케이션에 Amazon S3 VPC 엔드포인트 사용 기능](managing-network-vpce-iam-policy.md) 단원을 참조하십시오.  
S3 버킷과 WorkSpaces 애플리케이션 플릿이 동일한에 있어야 합니다 AWS 리전.  
Amazon S3 버킷의 세션 스크립트 객체에서 `S3:GetObject` 작업을 수행하려면 IAM 권한이 있어야 합니다. Amazon S3 버킷에 세션 스크립트를 저장하는 방법에 대한 자세한 내용은 [애플리케이션 아이콘, 설정 스크립트, 세션 스크립트 및 VHD를 S3 버킷에 저장](store-s3-bucket.md) 섹션을 참조하세요.

1. [https://console.aws.amazon.com/appstream2](https://console.aws.amazon.com/appstream2) WorkSpaces 애플리케이션 콘솔을 엽니다.

1. 탐색 창에서 [**Fleets**]를 선택합니다.

1. 업데이트할 Elastic 플릿을 선택하고 **세부 정보 보기**를 선택합니다.

1. **세션 스크립트 설정** 탭에서 **편집**을 선택합니다.

1. **S3의 세션 스크립트 객체**의 경우, 세션 스크립트 객체를 나타내는 S3 URI를 입력하거나, **S3 찾아보기**를 선택하고 S3 버킷으로 이동하여 세션 스크립트 객체를 찾습니다.

1. 변경 작업을 마치면 **변경 사항 저장**을 선택합니다.

1. 이제 시작된 모든 플릿 인스턴스에 세션 스크립트를 사용할 수 있습니다.
**참고**  
새 Elastic 플릿을 생성할 때 세션 스크립트를 구성할 수도 있습니다.

# 세션 스크립트 구성 파일
<a name="session-script-configuration-file"></a>

Windows 계정에서 세션 스크립트 구성 파일을 찾으려면 C:\$1AppStream\$1SessionScripts\$1config.json으로 이동합니다. Linux 인스턴스에서는 /opt/AppStream/SessionScripts/config.json으로 이동합니다. 파일 형식은 다음과 같습니다.

**참고**  
구성 파일은 .json 형식입니다. 이 파일에 입력하는 텍스트가 유효한 .json 형식인지 확인합니다.

```
{
  "SessionStart": {
    "executables": [
      {
        "context": "system",
        "filename": "",
        "arguments": "",
        "s3LogEnabled": true
      },
      {
        "context": "user",
        "filename": "",
        "arguments": "",
        "s3LogEnabled": true
      }
    ],
    "waitingTime": 30
  },
  "SessionTermination": {
    "executables": [
      {
        "context": "system",
        "filename": "",
        "arguments": "",
        "s3LogEnabled": true
      },
      {
        "context": "user",
        "filename": "",
        "arguments": "",
        "s3LogEnabled": true
      }
    ],
    "waitingTime": 30
  }
}
```

세션 스크립트 구성 파일에서 다음 파라미터를 사용할 수 있습니다.

***SessionStart/SessionTermination ***  
객체의 이름을 기반으로 적절한 세션 이벤트에서 실행할 세션 스크립트입니다.  
**유형**: 문자열  
**필수 항목 여부**: 아니요  
**허용된 값:** **SessionStart**, **SessionTermination** 

***WaitingTime***  
세션 스크립트의 최대 기간(초)입니다.  
**유형**: 정수  
**필수 항목 여부**: 아니요  
**제약:** 최대 지속 기간은 60초입니다. 세션 스크립트가 이 기간 내에 완료되지 않으면 중지됩니다. 스크립트를 계속 실행해야 하는 경우 별도의 프로세스로 시작하세요.

***Executables***  
실행할 세션 스크립트에 대한 세부 정보입니다.  
**유형**: 문자열  
**필수 항목 여부:** 예  
**제약:** 세션 이벤트당 실행할 수 있는 최대 스크립트 수는 2개입니다(사용자 컨텍스트용 하나와 시스템 컨텍스트용 하나).

***컨텍스트***  
세션 스크립트를 실행할 컨텍스트입니다.  
**유형**: 문자열  
**필수 항목 여부:** 예  
**허용된 값:** **user**, **system** 

***Filename***  
실행할 세션 스크립트의 전체 경로입니다. 이 파라미터가 지정되지 않은 경우, 세션 스크립트가 실행되지 않습니다.  
**유형**: 문자열  
**필수 항목 여부**: 아니요  
**제약:** 파일 이름 및 전체 경로의 최대 길이는 1,000자입니다.  
**허용된 값:** **.bat**, **.exe**, **.sh**   
Windows PowerShell 파일을 사용할 수도 있습니다. 자세한 내용은 [Windows PowerShell 파일 사용](using-powershell-files-with-session-scripts.md) 단원을 참조하십시오.

***인수***  
세션 스크립트 또는 실행 파일의 인수입니다.  
**유형**: 문자열  
**필수 항목 여부**: 아니요  
**길이 제한:** 최대 길이는 1,000자입니다.

***S3LogEnabled***  
이 파라미터의 값이 **True**로 설정되어 있으면, 세션 스크립트가 생성하는 로그를 저장하기 위해 Amazon Web Services 계정 내에 S3 버킷이 생성됩니다. 기본적으로 이 값은 **True**로 설정됩니다. 자세한 내용은 이 주제 뒷부분의 *세션 스크립트 출력 로깅* 섹션을 참조하세요.  
**유형**: 부울  
**필수 항목 여부**: 아니요  
**허용된 값:** **True**, **False** 

# Windows PowerShell 파일 사용
<a name="using-powershell-files-with-session-scripts"></a>

Windows PowerShell 파일을 사용하려면 **filename** 파라미터에서 PowerShell 파일의 전체 경로를 지정합니다.

```
"filename": 
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
```

그런 다음 **arguments** 파라미터에서 세션 스크립트를 지정합니다.

```
"arguments": "-File \"C:\\path\\to\\session\\script.ps1\"",
```

마지막으로 PowerShell 실행 정책이 PowerShell 파일이 실행되도록 허용하는지 확인합니다.

# 세션 스크립트 출력 로깅
<a name="logging-session-output"></a>

구성 파일에서이 옵션을 활성화하면 WorkSpaces 애플리케이션은 표준에 기록된 세션 스크립트의 출력을 자동으로 캡처합니다. 이 출력은 계정의 Amazon S3 버킷에 업로드됩니다. 문제 해결 또는 디버깅을 위해 로그 파일을 검토할 수 있습니다.

**참고**  
세션 스크립트가 값을 반환하거나 **WaitingTime**에 설정된 값이 경과되면 둘 중 더 빠른 시간을 기준으로 로그 파일이 업로드됩니다.

# 세션 스크립트와 함께 스토리지 커넥터 사용
<a name="use-storage-connectors-with-session-scripts"></a>

WorkSpaces 애플리케이션 스토리지 커넥터가 활성화되면 세션 시작 스크립트가 실행될 때 탑재가 시작됩니다. 스크립트가 마운트된 스토리지 커넥터를 사용하는 경우 커넥터를 사용할 수 있을 때까지 기다릴 수 있습니다. WorkSpaces 애플리케이션은 Windows 인스턴스의 Windows 레지스트리에 있는 스토리지 커넥터의 탑재 상태를 다음 키로 유지합니다.

HKEY\$1LOCAL\$1MACHINE\$1SOFTWARE\$1Amazon\$1AppStream\$1Storage\$1<provided user name>\$1<Storage connector>

레지스트리 키 값은 다음과 같습니다.
+ 제공된 사용자 이름 - 액세스 모드를 통해 제공되는 사용자 ID입니다. 액세스 모드와 각 모드의 값은 다음과 같습니다.
  + 사용자 풀 - 사용자의 이메일 주소입니다.
  + 스트리밍 URL - UserID입니다.
  + SAML - NameID입니다. 사용자 이름에 슬래시가 포함된 경우(예를 들어 도메인 사용자의 SAMAccountName), 슬래시는 "-" 문자로 대체됩니다.
+ 스토리지 커넥터 - 사용자가 사용할 수 있는 영구 스토리지 옵션용 커넥터입니다. 스토리지 커넥터 값은 다음과 같습니다.
  + HomeFolder
  + GoogleDrive
  + OneDrive

각 스토리지 커넥터 레지스트리 키에는 **MountStatus** DWORD 값이 포함되어 있습니다. 다음 표에는 **MountStatus**에 사용할 수 있는 값이 나와 있습니다.

**참고**  
이러한 레지스트리 키를 보려면 Microsoft .NET Framework 버전 4.7.2 이상이 이미지에 설치되어 있어야 합니다.


| 값 | 설명 | 
| --- | --- | 
| 0 |  이 사용자에게 스토리지 커넥터가 활성화되어 있지 않음  | 
| 1 |  스토리지 커넥터 탑재를 진행 중  | 
| 2 |  스토리지 커넥터가 탑재됨  | 
| 3 |  스토리지 커넥터 탑재에 실패함  | 
| 4 |  스토리지 커넥터 탑재가 활성화되어 있지만 아직 탑재되지 않음  | 

Linux 인스턴스에서는 \$1/.config/appstream-home-folder/appstream-home-folder-mount-status 파일의 appstream\$1home\$1folder\$1mount\$1status 값을 확인하여 홈 폴더 마운트 상태를 확인할 수 있습니다.


| 값 | 설명 | 
| --- | --- | 
| True |  홈 폴더가 성공적으로 마운트되었습니다.  | 
| False | 홈 폴더가 아직 마운트되지 않았습니다. | 

# 세션 스크립트 로그를 저장하기 위해 Amazon S3 버킷 스토리지 활성화
<a name="enable-S3-bucket-storage-session-script-logs"></a>

세션 스크립트 구성에서 Amazon S3 로깅을 활성화하면 WorkSpaces 애플리케이션은 세션 스크립트에서 표준 출력을 캡처합니다. 출력은 Amazon Web Services 계정 내 S3 버킷에 주기적으로 업로드됩니다. 모든 AWS 리전에 대해 WorkSpaces 애플리케이션은 계정 및 리전에 고유한 버킷을 계정에 생성합니다.

이러한 S3 버킷을 관리하기 위해 구성 작업을 수행하지 않아도 됩니다. WorkSpaces 애플리케이션 서비스에서 완벽하게 관리됩니다. 각 버킷에 저장된 로그 파일은 전송 중에는 Amazon S3의 SSL 엔드포인트를 이용하고, 정지 상태일 때는 Amazon S3 관리형 암호화 키를 이용하여 암호화됩니다. 버킷의 이름은 다음과 같은 특정 형식으로 지정됩니다.

```
appstream-logs-region-code-account-id-without-hyphens-random-identifier
```

***region-code***  
세션 스크립트 로그에 대해 활성화된 Amazon S3 버킷 스토리지를 사용하여 스택이 생성되는 AWS 리전 코드입니다.

***account-id-without-hyphens***  
Amazon Web Services 계정 식별자입니다. 임의의 ID를 통해 해당 리전의 다른 버킷과 충돌이 없도록 보장합니다. 버킷 이름의 첫 번째 부분인 `appstream-logs`은 계정이나 리전 간에 변경되지 않습니다.

예를 들어 계정 번호 123456789012에서 미국 서부(오레곤) 리전(us-west-2)의 이미지에 세션 스크립트를 지정하면 WorkSpaces 애플리케이션은 표시된 이름으로 해당 리전의 계정 내에 Amazon S3 버킷을 생성합니다. 충분한 권한이 있는 관리자만 이 버킷을 삭제할 수 있습니다.

```
appstream-logs-us-west-2-1234567890123-abcdefg
```

세션 스크립트를 비활성화해도 S3 버킷에 저장된 로그 파일이 삭제되지 않습니다. 로그 파일을 영구적으로 삭제하려면 사용자 또는 적절한 권한이 있는 다른 관리자가 Amazon S3 콘솔이나 API를 이용해 이를 수행해야 합니다. WorkSpaces 애플리케이션은 버킷의 우발적 삭제를 방지하는 버킷 정책을 추가합니다. 자세한 내용은 [Amazon WorkSpaces 애플리케이션의 ID 및 액세스 관리](controlling-access.md)의 **IAM Policies and the Amazon S3 Bucket for Application Settings Persistence를 참조하세요.

세션 스크립트가 활성화되면 시작되는 각 스트리밍 세션에 고유한 폴더가 생성됩니다.

 계정 내 S3 버킷에 로그 파일이 저장되는 폴더의 경로는 다음 구조를 사용합니다.

```
bucket-name/stack-name/fleet-name/access-mode/user-id-SHA-256-hash/session-id/SessionScriptsLogs/session-event
```

***bucket-name***  
세션 스크립트가 저장되는 S3 버킷의 이름입니다. 이름 형식은 본 섹션의 앞부분에서 설명했습니다.

***stack-name***  
세션이 시작된 스택 이름입니다.

***fleet-name***  
세션 스크립트를 실행 중인 플릿 이름입니다.

***access-mode***  
사용자의 자격 증명 메서드: WorkSpaces 애플리케이션 API 또는 CLI의 `custom` 경우 , SAML의 `federated` 경우 , 사용자 풀의 사용자의 `userpool` 경우 .

***user-id-SHA-256-hash***  
사용자별 폴더 이름입니다. 이 이름은 사용자 식별자에서 생성한 소문자 SHA-256 해시 16진법 문자열을 이용해 생성됩니다.

***session-id***  
사용자의 스트리밍 세션의 식별자입니다. 각 사용자 스트리밍 세션은 고유한 ID를 생성합니다.

***session-event***  
세션 스크립트 로그를 생성한 이벤트입니다. 이벤트 값은 `SessionStart` 및 `SessionTermination`입니다.

다음 폴더 구조 예는 test-stack 및 test-fleet에서 시작된 스트리밍 세션에 적용됩니다. 세션은 ID가 `testuser@mydomain.com`인 사용자 AWS 계정 ID의 API`123456789012`와 미국 서부(오레곤) 리전(us-west-2)`test-stack`의 설정 그룹을 사용합니다.

```
appstream-logs-us-west-2-1234567890123-abcdefg/test-stack/test-fleet/custom/a0bcb1da11f480d9b5b3e90f91243143eac04cfccfbdc777e740fab628a1cd13/05yd1391-4805-3da6-f498-76f5x6746016/SessionScriptsLogs/SessionStart/
```

이 폴더 구조 예에는 사용자 컨텍스트 세션 시작 스크립트용 로그 파일 하나와, 시스템 컨텍스트 세션 시작 스크립트용 로그 파일 하나가 포함되어 있습니다(해당하는 경우).

# 다중 세션 플릿에서 세션 스크립트 사용
<a name="session-scripts-multi-session-fleets"></a>

다중 세션 플릿에서 세션 스크립트를 사용하는 경우 최적의 성능과 보안을 보장하기 위한 추가 요구 사항과 고려 사항이 있습니다.

## 요구 사항
<a name="session-scripts-multi-session-fleets-requirements"></a>

단일 세션 플릿에서는 지정된 인스턴스에 대해 **SessionStart** 및 **SessionTermination** 후크가 한 번만 실행됩니다. 이는 세션과 인스턴스가 1:1로 매핑되기 때문입니다. 다중 세션 플릿을 사용하는 경우 세션과 인스턴스 간에 N:M 매핑이 이루어지며, 각 세션은 자체 **SessionStart** 및 **SessionTermination** 후크를 실행합니다. 즉, 지정된 인스턴스에서 **SessionStart** 및 **SessionTermination** 후크를 여러 번, 그리고 다양한 순서로 실행할 수 있습니다. 최상의 환경을 위해서는 다중 세션 플릿에서 세션 스크립트를 사용할 때 다음 사항이 충족되어야 합니다.
+ 스크립트가 멱등성을 가짐

  이미 작업이 수행된 경우, 스크립트는 동일한 인스턴스에 대해 동일한 작업이 여러 번 실행될 때도 원활하게 처리해야 합니다.
+ 스크립트가 독립적으로 작동함

  스크립트는 세션별로 실행되므로 한 세션이 **SessionTermination**을 실행하는 동안 다른 세션이 **SessionStart**를 실행하는 경우 서로 간섭하거나 다른 세션의 환경을 방해해서는 안됩니다.
+ 스크립트 성능이 뛰어남

  다중 세션 인스턴스에서는 여러 세션을 동시에 프로비저닝할 수 있습니다. 즉, 세션 스크립트를 동시에 여러 번 실행할 수 있습니다. 스크립트는 효율적이어야 하고, 과도하게 리소스를 소비하지 않아야 하며, 인스턴스에 대한 다른 사용자의 환경이나 세션의 안정성에 영향을 미치지 않아야 합니다.

이러한 요구 사항 중 상당수는 세션 스크립트 로직을 스크립트가 실행 중인 특정 사용자 세션에 집중하는 방식으로 충족할 수 있습니다.

## 보안 고려 사항
<a name="session-scripts-multi-session-fleets-security"></a>

WorkSpaces 애플리케이션 이미지는 사용자가 스크립트 파일을 세션할 수 있는 쓰기 권한을 허용하도록 구성해서는 안 됩니다. 이렇게 하면 악의적인 사용자가 스크립트 파일을 수정할 수 있는 중요한 공격 벡터가 생깁니다. 이러한 파일은 구성에 따라 SYSTEM 권한이나 다른 사용자로 실행될 수 있습니다.

**중요**  
WorkSpaces 애플리케이션 이미지가 안전하게 구성되었는지 확인하는 것은 사용자의 책임입니다. 이는 여러 사용자가 동일한 인스턴스를 사용하는 다중 세션 인스턴스의 경우에 특히 중요합니다. 이미지가 안전하게 구성되지 않은 경우 해당 인스턴스의 모든 사용자에게 보안 위험이 있습니다.

다음은 이미지 및 세션 스크립트 파일에 대해 적용되어야 하는 사항입니다.
+ 사용자에게 세션 스크립트 파일을 수정할 수 있는 권한이 없습니다.
+ 사용자에게 세션 스크립트 config.json을 수정할 수 있는 권한이 없습니다. 이미지의 기본 동작은 관리자에 대한 액세스를 제한합니다.

세션 스크립트 실행 파일은 런타임 시 수정될 수 없는 안전한 위치에 저장해야 합니다.

서비스에서 세션 스크립트 실행 파일이 수정된 것을 감지하면 해당 인스턴스에서 해당 후크의 후속 실행이 실패하고 로그 파일을 Amazon S3에 업로드하며(Amazon S3 로깅이 활성화된 경우) 다음과 같은 메시지가 표시됩니다.

**인스턴스 프로비저닝 후 실행 파일이 수정되었기 때문에 세션 스크립트가 실행되지 않았습니다. 보안을 위해 실행을 건너뛰었습니다.**

사용 사례에서 런타임 시 세션 스크립트 실행 파일을 수정해야 하는 경우(예: 런타임 시 자동 업데이트 프로세스에 의해 수정된 EXE 파일을 가리키는 경우) 위 검사가 실패합니다. 이 경우 수정된 실행 파일로 실행을 리디렉션하는 스크립트를 사용하세요. 서비스가 보안 검사를 수행할 때 런타임 시 스크립트가 수정되지 않도록 합니다.

세션 스크립트 파일이 지나치게 큰 경우(100MB 이상) 인스턴스 및 세션 프로비저닝이 지연될 수 있으며, 보안 검사에 추가 시간이 소요됩니다(인스턴스 유형 및 사용 가능한 리소스에 따라 다름). 사용 사례에 대형 세션 스크립트가 필요한 경우 작은 스크립트를 사용하여 실행을 리디렉션하는 것을 고려하세요. 이렇게 하면 인스턴스 및 세션 프로비저닝 환경이 개선됩니다.

해당 서비스는 세션 스크립트 config.json에 정의된 실행 파일만 검사하며, 이는 대체/최선의 노력 방식일 뿐입니다. 세션 스크립트 실행 파일의 모든 코드 경로가 안전하며 최종 사용자가 수정할 수 없도록 하는 것은 사용자의 책임입니다.