시작 스크립트 실행

자체 시작 스크립트를 만들어 가상 머신에서 실행하면 인스턴스를 부팅할 때마다 자동화된 작업을 수행할 수 있습니다. 시작 스크립트로 소프트웨어 설치, 업데이트 수행, 서비스 사용 설정, 스크립트에 정의된 그 밖의 여러 작업이 가능합니다. 시작 스크립트를 사용하면 생성 시간의 새 인스턴스를 비롯한 가상 머신 인스턴스를 쉽게 프로그래매틱 방식으로 맞춤설정할 수 있습니다.

다음은 Apache 서버를 설치하고 시작하는 간단한 시작 스크립트의 예입니다.

#! /bin/bash
apt-get update
apt-get install -y apache2
cat <<EOF > /var/www/html/index.html
<html><body><h1>Hello World</h1>
<p>This page was created from a simple startup script!</p>
</body></html>
EOF

시작 스크립트는 시작 스크립트 메타데이터 키를 사용해 메타 데이터 서버를 통해 지정합니다. gcloud 명령줄 도구, API 또는 Google Cloud Platform Console을 사용하면 시작 스크립트를 제공할 수 있습니다.

시작하기 전에

이 작업에 필요한 권한

이 작업을 수행하려면 다음 권한이 있어야 합니다.

시작 스크립트 실행

네트워크를 사용할 수 있게 되면 인스턴스에서 항상 루트로 시작 스크립트를 실행합니다.

시작 스크립트에는 파일 형식의 제한이 없습니다. 시작 스크립트가 존재하면 Compute Engine에서 다음 작업을 수행합니다.

  1. 시작 스크립트를 인스턴스의 로컬 파일로 복사합니다.
  2. 실행할 수 있도록 파일의 권한을 설정합니다.
  3. 파일을 실행합니다.

예를 들어 bash 스크립트 대신 Python 스크립트를 제공할 수 있습니다. Compute Engine은 스크립트 유형에 상관없이 스크립트의 내용을 그대로 실행합니다.

bash가 아닌 스크립트를 실행하려면 운영체제에서 사용할 인터프리터를 알 수 있도록 파일 맨 위에 shebang 줄을 추가합니다. 예를 들어 Python 스크립트의 경우 다음과 같은 shebang 줄을 추가할 수 있습니다.

#! /usr/bin/python

로컬 시작 스크립트 사용

로컬 시작 스크립트란 로컬 컴퓨터에 있는 스크립트입니다. 로컬 시작 스크립트를 사용하려면 로컬 시작 스크립트 파일을 전달하거나 시작 스크립트의 콘텐츠를 메타데이터 서버에 직접 제공해야 합니다. 다음 하위 섹션의 예는 로컬 파일에서 또는 직접 입력을 통해 시작 스크립트 메타데이터를 추가하는 방법을 보여줍니다.

로컬 시작 스크립트의 메타데이터 값 길이에는 256KB의 제한이 적용됩니다. 이 제한을 초과한 시작 스크립트는 로컬로 로드할 수 없습니다. 이러한 경우에는 파일을 Google Cloud Storage에 저장하고 인스턴스 생성 시간에 스크립트 URL을 지정합니다. 자세한 내용은 Cloud Storage에 저장된 시작 스크립트 사용을 참조하세요.

시작 스크립트 파일 제공

gcloud 명령줄 도구로만 로컬 시작 스크립트 파일을 전달할 수 있습니다.

로컬 시작 스크립트 파일을 전달하려면 gcloud 명령줄 도구를 사용해 --metadata-from-file 플래그를 제공하고 이어서 메타데이터 키 쌍인 startup-script=PATH/TO/FILE을 제공합니다. 여기서 PATH/TO/FILE은 시작 스크립트의 상대 경로입니다.

gcloud compute instances create example-instance \
    --metadata-from-file startup-script=examples/scripts/install.sh

시작 스크립트 콘텐츠의 직접 제공

또는 콘솔, gcloud 명령줄 도구 또는 API를 사용하여 시작 스크립트의 내용을 직접 입력하거나 붙여넣을 수 있습니다.

콘솔

GCP 콘솔의 시작 스크립트 섹션에서 시작 스크립트를 직접 지정합니다.

  1. GCP Console에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 인스턴스 만들기를 클릭합니다.
  3. 새 인스턴스 만들기 페이지에서 인스턴스의 속성을 입력합니다. 고급 구성 옵션은 관리, 보안, 디스크, 네트워킹, 단독 임대 섹션을 확장합니다.
  4. 자동화 섹션의 시작 스크립트에서 시작 스크립트의 콘텐츠를 제공합니다.

    GCP 콘솔의 시작 스크립트 설정 스크린샷

  5. 만들기를 클릭하여 인스턴스를 만듭니다.

gcloud

gcloud 명령줄 도구로 --metadata 플래그를 지정하고 startup-script=[CONTENTS] 키 쌍을 사용해 시작 스크립트의 콘텐츠를 제공합니다. 여기서 [CONTENTS]는 시작 스크립트의 콘텐츠입니다.

예를 들어 다음 명령어는 시작할 때 일부 시스템 업데이트를 수행하고, Apache를 설치하고, 단일 웹페이지를 시작하는 인스턴스를 만듭니다. 이 명령어를 실행한 후 해당 인스턴스의 외부 IP 주소를 방문하면 index.html 페이지의 콘텐츠를 확인할 수 있습니다.

Linux 데스크톱에서는 다음과 같은 명령어를 실행합니다.

gcloud compute instances create example-instance --tags http-server \
--metadata startup-script='#! /bin/bash
# Installs apache and a custom homepage
sudo su -
apt-get update
apt-get install -y apache2
cat <<EOF > /var/www/html/index.html
<html><body><h1>Hello World</h1>
<p>This page was created from a simple start up script!</p>
</body></html>
EOF'

Windows 데스크톱인 경우 cmd 터미널에서 이 명령어를 실행하면 됩니다.

gcloud compute instances create example-instance --tags http-server --metadata startup-script="
apt-get update;
apt-get install -y apache2;
echo \"This page was created from a simple start up script!\" ^> /var/www/html/index.html"

마찬가지로 PowerShell을 사용하는 경우 --% 마커를 사용해 이 명령어를 실행하면 정확한 명령어를 gcloud 도구에 전달할 수 있습니다.

gcloud --% compute instances create example-instance --tags http-server --metadata startup-script="
apt-get update;
apt-get install -y apache2;
echo \"This page was created from a simple start up script!\" ^> /var/www/html/index.html"

API

API에서는 startup-script를 메타데이터 키로 사용해 요청의 메타데이터 속성 중 일부로 시작 스크립트를 제공합니다.

POST https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances

{
  ...
  "metadata": {
    "items": [
      {
       "key": "startup-script",
       "value": "#! /bin/bash\n\n# Installs apache and a custom homepage\napt-get update\napt-get install -y apache2\ncat <<EOF > /var/www/html/index.html\n<html><body><h1>Hello World</h1>\n<p>This page was created from a simple start up script!</p>\n</body></html>"
      }
    ]
  }
  ...
}

Windows 인스턴스의 시작 스크립트 제공

Windows 고유의 메타데이터 키를 사용하면 Windows 인스턴스에서 시작 스크립트를 실행할 수 있습니다. 아래 나열된 특수한 키 중 하나를 선택하세요. 각각의 키가 실행할 스크립트 유형과 일치해야 합니다. 인스턴스에 다양한 키를 전달해 여러 개의 스크립트를 지정할 수도 있습니다. 키별로 인스턴스당 한 번씩만 지정할 수 있습니다.

위의 동일 안내에 따라 로컬 시작 스크립트에 다음과 같은 키를 사용할 수 있습니다.

스크립트 유형 sysprep 중 부팅 전에 실행 sysprep이 완료된 후 이후 부팅 시마다 실행
url 시작 스크립트 sysprep-specialize-script-url windows-startup-script-url
cmd 시작 스크립트 sysprep-specialize-script-cmd windows-startup-script-cmd
bat 시작 스크립트 sysprep-specialize-script-bat windows-startup-script-bat
ps11 시작 스크립트 sysprep-specialize-script-ps1 windows-startup-script-ps1

Google Cloud Storage에 저장된 시작 스크립트 제공

Google Cloud Storage에 스크립트를 저장하고 인스턴스를 만들 때 스크립트에 URL을 제공할 수 있습니다. 그러면 어디서나 시작 스크립트에 액세스할 수 있고 메타데이터 서버 제한도 우회할 수 있습니다.

스크립트에 대한 액세스 권한 설정

Google Cloud Storage에서 시작 스크립트를 사용하려면 스크립트에 액세스할 수 있는 권한이 필요합니다. 버킷 및 파일의 액세스 제어 설정에서 권한이 있는지 확인하세요.

기본적으로 액세스를 거부하는 명시적인 액세스 제어가 없는 한, 프로젝트 소유자 또는 편집자는 해당 프로젝트의 파일에 액세스할 수 있습니다.

시작 스크립트 제공

  1. 버킷을 만듭니다.버킷을 만들거나 기존 버킷을 사용할 수 있습니다. 새 버킷을 만드는 방법은 Google Cloud Platform Console에서 버킷 만들기 또는 gsutil에서 버킷 만들기를 참조하세요.
  2. 파일을 버킷에 업로드합니다. 안내에 따라 gsutil 또는 GCP Console을 사용해 객체를 업로드합니다.
  3. 새 인스턴스를 만들 때 시작 스크립트 파일의 URL을 제공합니다.

    콘솔

    1. GCP Console에서 VM 인스턴스 페이지로 이동합니다.

      VM 인스턴스 페이지로 이동

    2. 인스턴스 만들기를 클릭합니다.
    3. 새 인스턴스 만들기 페이지에서 인스턴스의 속성을 입력합니다. 고급 구성 옵션은 관리, 보안, 디스크, 네트워킹, 단독 임대 섹션을 확장합니다.
    4. 메타데이터 섹션에서 startup-script-url을 메타데이터 키로 제공합니다.
    5. 상자에 시작 스크립트 파일의 URL을 gs://[BUCKET]/[FILE] 또는 https://storage.googleapis.com/[BUCKET]/[FILE] 형식으로 제공합니다.
    6. ID 및 API 액세스 섹션에서 Cloud Storage의 시작 스크립트 파일을 읽을 권한이 있는 서비스 계정을 선택합니다. 예를 들어 서비스 계정에 저장소 객체 뷰어 역할의 권한이 있어야 합니다.
    7. 만들기를 클릭하여 인스턴스를 만듭니다.

    gcloud

    gcloud 명령줄 도구로 --scopes--metadata 플래그를 사용해 인스턴스를 만들고 startup-script-url 키를 지정합니다. --scopes 플래그가 가상 머신에 Google Cloud Storage에 액세스하여 시작 스크립트를 다운로드할 수 있는 권한을 제공합니다. 스크립트의 Google Cloud Storage URL은 gs://bucket/file 또는 https://storage.googleapis.com/bucket/file 형식으로 제공하면 됩니다.

    gcloud compute instances create example-instance --scopes storage-ro \
        --metadata startup-script-url=gs://bucket/startupscript.sh
    

    API

    API에서는 startup-script-url을 메타데이터 키로 사용해 요청의 메타데이터 속성 중 일부로 시작 스크립트를 제공합니다. 또한 가상 머신에서 시작 스크립트 파일에 액세스할 수 있도록 Google Cloud Storage 범위가 포함된 scopes 목록을 제공합니다.

    POST https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances
    
    {
      ...
      "serviceAccounts": [
        {
          "email": "default",
          "scopes": [
            "https://www.googleapis.com/auth/devstorage.read_only"
          ]
        }
      ],
      "metadata": {
        "items": [
          {
           "key": "startup-script-url",
           "value": "gs://bucket/myfile"
          }
        ]
      },
      "tags": {
        "items": []
      },
      "machineType": "zones/us-central1-a/machineTypes/n1-standard-1",
      "name": "example-instance"
    }
    

    기간

    gcloud 명령줄 도구로 --scopes--metadata 플래그를 사용해 인스턴스를 만들고 windows-startup-script-url 키를 지정합니다. --scopes 플래그가 가상 머신에 Google Cloud Storage에 액세스하여 시작 스크립트를 다운로드할 수 있는 권한을 제공합니다. 스크립트의 Google Cloud Storage URL은 gs://bucket/file 또는 https://storage.googleapis.com/bucket/file 형식으로 제공하면 됩니다.

    gcloud compute instances create example-windows-instance --scopes storage-ro \
       --metadata windows-startup-script-url=gs://bucket/startupscript.ps1
    

시작 스크립트를 적용해 인스턴스 실행하기

실행 중인 인스턴스가 있는 경우 해당 인스턴스에 시작 스크립트를 추가한 후 인스턴스를 다시 시작하면 시작 스크립트가 실행됩니다. 또한 이후 재부팅할 때마다 시작 스크립트가 실행됩니다.

실행 중인 인스턴스에 시작 스크립트를 설정하려면 다음 안내를 따르세요.

콘솔

  1. VM 인스턴스 페이지로 이동합니다.
  2. 시작 스크립트를 추가할 인스턴스를 클릭합니다. 인스턴스 세부정보 페이지가 표시됩니다.
  3. 인스턴스 세부정보 페이지에서 다음 단계를 완료합니다.

    1. 페이지 상단에서 수정 버튼을 클릭합니다.
    2. 커스텀 메타데이터에서 항목 추가를 클릭합니다.
    3. 다음 키 중 하나를 사용해 시작 스크립트를 추가합니다.

      • startup-script: 이 키를 사용하면 직접 시작 스크립트 콘텐츠를 제공할 수 있습니다.
      • startup-script-url: 이 키를 사용하면 Google Cloud Storage URL을 시작 스크립트 파일에 제공할 수 있습니다.

gcloud

gcloud 명령줄 도구에서 instances add-metadata를 사용해 인스턴스에 메타데이터를 추가합니다. 사용 가능한 시작 스크립트 키 중 하나를 사용합니다.

  • --metadata startup-script=CONTENTS: 이 키를 사용하면 직접 시작 스크립트 콘텐츠를 제공할 수 있습니다.
  • --metadata startup-script-url=URL: 이 키를 사용하면 시작 스크립트 파일의 Google Cloud Storage URL을 제공할 수 있습니다.
  • --metadata-from-file startup-script=FILE: 로컬에 저장된 시작 스크립트 파일을 제공합니다.

예를 들면 다음과 같습니다.

gcloud compute instances add-metadata example-instance \
    --metadata-from-file startup-script=path/to/file
gcloud compute instances add-metadata example-instance \
    --metadata startup-script-url=gs://bucket/file

API

API에서 instances().setMetadata 메소드 요청을 전송해 새로운 메타데이터와 fingerprint 값을 제공합니다.

디지털 지문은 Compute Engine에서 생성된 임의의 문자열로서 낙관적 잠금을 수행하는 데 사용됩니다. 요청을 수행하기 위해서는 일치하는 디지털 지문 값을 제공해야 합니다. 요청 시마다 디지털 지문이 변경되며 일치하지 않는 디지털 지문을 제공할 경우 요청이 거부됩니다. 이를 통해 한 번에 하나의 업데이트만 실행할 수 있어 충돌이 방지됩니다.

인스턴스의 현재 디지털 지문을 얻으려면 instances().get 요청을 수행하고 디지털 지문 값을 복사합니다.

GET https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances/example-instance
{

 ...
 "name": "example-instance",
 "metadata": {
  "kind": "compute#metadata",
  "fingerprint": "zhma6O1w2l8="
 },
 "...
}

그리고 나서 다음 메타데이터 키 중 하나와 디지털 지문 값을 사용해 instances().setMetadata 메소드에 요청을 전송합니다.

  • startup-script: 이 키를 사용하면 직접 시작 스크립트 콘텐츠를 제공할 수 있습니다.
  • startup-script-url: 이 키를 사용하면 시작 스크립트 파일의 Google Cloud Storage URL을 제공할 수 있습니다.

예를 들면 다음과 같습니다.

POST https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances/example-instance/setMetadata

{
 "fingerprint": "zhma6O1w2l8=",
 "items": [
  {
   "key": "startup-script-url",
   "value": "gs://bucket/file"
  }
 ]
}

시작 스크립트 재실행

시작 스크립트를 인스턴스에 연결하고 다음 명령어 중 하나를 실행하면 VM 인스턴스에서 시작 스크립트를 재실행할 수 있습니다.

Debian, CentOS, RHEL, SLES, Container-Optimized OS, Ubuntu 이미지:

$ sudo google_metadata_script_runner --script-type startup --debug

startup-script: INFO Starting startup scripts.
startup-script: INFO startup-script: Return code 0.
startup-script: INFO Finished running startup scripts.

Container-Optimized OS에서는 journalctl을 사용하여 시작 스크립트 출력을 볼 수도 있습니다.

$ sudo journalctl -u google-startup-scripts.service

시작 스크립트 출력은 다음 로그 파일에 기록됩니다.

  • CentOS 및 RHEL: /var/log/messages
  • Debian: /var/log/daemon.log
  • Ubuntu 14.04, 16.04, 16.10: /var/log/syslog
  • SLES 11 및 12: /var/log/messages

시작 스크립트의 커스텀 값 설정

여러 인스턴스에서 시작 스크립트를 실행하는 경우 시작 스크립트에 커스텀 값을 사용해야 하는 상황이 있을 수 있습니다. 여러 인스턴스에서 시작 스크립트를 실행하되 각 인스턴스에서 커스텀 메시지를 인쇄해야 하는 경우를 예로 들 수 있습니다.

커스텀 값을 인스턴스 생성 시간에 커스텀 메타데이터 키/값 쌍으로 지정하고 시작 스크립트에서 참조할 수 있습니다. 커스텀 메타데이터 키를 만드는 자세한 방법은 커스텀 메타데이터 설정을 참조하세요.

커스텀 메타데이터 키 쌍을 설정하고 나면 시작 스크립트를 수정해 새 메타데이터를 쿼리할 수 있습니다. 위의 동일 스크립트를 예로 들면 다음과 같이 수정할 수 있습니다.

#! /bin/bash
VALUE_OF_FOO=$(curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/foo -H "Metadata-Flavor: Google")
apt-get update
apt-get install -y apache2
cat <<EOF > /var/www/html/index.html
<html><body><h1>Hello World</h1>
<p>The value of foo: $VALUE_OF_FOO</p>
</body></html>
EOF

문제해결

메타데이터 서버의 네트워크 연결

Linux 가상 머신에 한해 Compute Engine이 커스텀 시작 또는 종료 스크립트 등의 정보를 메타데이터 서버에서 가져오기 전에 메타데이터 서버 연결을 기다립니다. 메타데이터 서버가 응답하지 않거나 네트워크가 아직 구성되어 있지 않으면 가상 머신의 부팅이 완료되지 않습니다.

v20160606 이전 이미지가 있는 Linux 가상 머신에 한해 직렬 포트 출력에 "Waiting for metadata server, attempt N"이 표시됩니다. 여기서 N은 시도한 횟수입니다.

이 같은 문제는 자체적으로 해결해야 하는 일시적인 네트워크 문제로 인해 최대 7분간 지속될 수 있습니다. 7분이 지나도 문제가 자체적으로 해결되지 않으면 가상 머신 인스턴스를 다시 만드세요.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Compute Engine 문서