์ž๋ฐ” ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ

์ž๋ฐ” ๋Ÿฐํƒ€์ž„์€ ์›น ์„œ๋น„์Šค์˜ ์ฝ”๋“œ์™€ ์ข…์† ํ•ญ๋ชฉ์„ ์„ค์น˜ํ•˜๊ณ  ์„œ๋น„์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์Šคํƒ์ž…๋‹ˆ๋‹ค.

app.yaml ํŒŒ์ผ์—์„œ App Engine ํ‘œ์ค€ ํ™˜๊ฒฝ์šฉ ์ž๋ฐ” ๋Ÿฐํƒ€์ž„์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

runtime: javaVERSION

์—ฌ๊ธฐ์„œ VERSION์€ Java MAJOR ๋ฒ„์ „ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ตœ์‹  Java ๋ฒ„์ „์ธ Java 21์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด 21์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ง€์›๋˜๋Š” ์ž๋ฐ” ๋ฒ„์ „๊ณผ ์ž๋ฐ” ๋ฒ„์ „์— ํ•ด๋‹นํ•˜๋Š” Ubuntu ๋ฒ„์ „์€ ๋Ÿฐํƒ€์ž„ ์ง€์› ์ผ์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

  1. Google Cloud CLI์˜ ์ตœ์‹  ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ฑฐ๋‚˜ gcloud CLI๋ฅผ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

    gcloud components update
    
  2. Maven์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•˜๋ ค๋ฉด pom.xml์— App Engine Maven ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    <plugin>
       <groupId>com.google.cloud.tools</groupId>
       <artifactId>appengine-maven-plugin</artifactId>
       <version>2.8.1</version>
    </plugin>

    gcloud app deploy ๋ช…๋ น์–ด ๋˜๋Š” App Engine Gradle ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ์„ ํฌํ•จํ•œ ๋‹ค๋ฅธ ๋ฐฐํฌ ์˜ต์…˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ผ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ JAR ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋ ˆ์ž„์›Œํฌ ํ˜ธํ™˜์„ฑ

App Engine ์ž๋ฐ” ๋Ÿฐํƒ€์ž„์—์„œ๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅ JAR ํŒŒ์ผ์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋Ÿฐํƒ€์ž„์—๋Š” ์›น ์ œ๊ณต ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์„œ๋ธ”๋ฆฟ ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ์ œํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ข…์† ํ•ญ๋ชฉ ๋˜๋Š” Netty ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ฐ™์€ ๋„คํŠธ์›Œํ‚น ์Šคํƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ์ œํ•œ ์—†์ด Grails, Blade, Play!, Vaadin ๋˜๋Š” jHipster ๋“ฑ ์›ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Maven ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ์ž๋ฐ” ๋Ÿฐํƒ€์ž„์— ๋ฐฐํฌ

Maven ํ”„๋กœ์ ํŠธ๋ฅผ ์†Œ์Šค ์ฝ”๋“œ๋กœ ๋ฐฐํฌํ•˜๊ณ  Google Cloud ๋นŒ๋“œํŒฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œํ•˜๊ณ  ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Maven ํ”„๋กœ์ ํŠธ๋ฅผ ์†Œ์Šค ์ฝ”๋“œ๋กœ ๋ฐฐํฌํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ์˜ ์ตœ์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์Œ์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

gcloud app deploy pom.xml

๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ ๋กœ๊ทธ๊ฐ€ ์ŠคํŠธ๋ฆฌ๋ฐ๋˜๋ฉฐ Google Cloud ์ฝ˜์†”์˜ Cloud Build ๊ธฐ๋ก ์„น์…˜์—์„œ ์ž์„ธํ•œ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GraalVM ์‹คํ–‰ ํŒŒ์ผ ์‚ฌ์šฉ

App Engine ํ‘œ์ค€ ํ™˜๊ฒฝ Java ๋Ÿฐํƒ€์ž„์—์„œ๋Š” GraalVM ๋„ค์ดํ‹ฐ๋ธŒ ์ด๋ฏธ์ง€ ์‹คํ–‰ ํŒŒ์ผ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. GraalVM ๋„ค์ดํ‹ฐ๋ธŒ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋ฐ” ์•ฑ์„ ์ปดํŒŒ์ผํ•˜๋ฉด app.yaml ํŒŒ์ผ์˜ entrypoint ์„ค์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํŒŒ์ผ ์ด๋ฆ„์ด myexecutable์ธ ์‹คํ–‰ ํŒŒ์ผ์—๋Š” ๋‹ค์Œ app.yaml ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

runtime: 21 # or another supported runtime version.
entrypoint: ./myexecutable

Google Cloud ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ GraalVM ๋„ค์ดํ‹ฐ๋ธŒ ์ด๋ฏธ์ง€๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋„ค์ดํ‹ฐ๋ธŒ ์ด๋ฏธ์ง€ ์ปดํŒŒ์ผ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ž๋ฐ” ๋ฒ„์ „

์ง€์›๋˜๋Š” ์ตœ์‹  Java ๋ฒ„์ „์€ 21์ž…๋‹ˆ๋‹ค. Java ๋Ÿฐํƒ€์ž„์€ app.yaml ํŒŒ์ผ์— ์ง€์ •๋œ ์•ˆ์ •์ ์ธ ์ตœ์‹  ์ถœ์‹œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. App Engine์€ ์ƒˆ๋กœ์šด ํŒจ์น˜ ์ถœ์‹œ ๋ฒ„์ „์œผ๋กœ ์ž๋™ ์—…๋ฐ์ดํŠธ๋˜์ง€๋งŒ ๋ถ€ ๋ฒ„์ „์€ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Java 21.0.4์—์„œ ๋ฐฐํฌ๋˜๊ณ  ์ดํ›„ ๊ด€๋ฆฌํ˜• ํ”Œ๋žซํผ ๋ฐฐํฌ ์‹œ์— Java 21.0.5 ๋ฒ„์ „์œผ๋กœ ์ž๋™ ์—…๋ฐ์ดํŠธ๋  ์ˆ˜ ์žˆ์ง€๋งŒ Java 22๋กœ ์ž๋™ ์—…๋ฐ์ดํŠธ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

Java ๋ฒ„์ „์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋Ÿฐํƒ€์ž„์˜ Open JDK ํ™˜๊ฒฝ

App Engine์€ ์ตœ์‹  Ubuntu Linux ๋ฐฐํฌํŒ๊ณผ ์ง€์›๋˜๋Š” Java 17์šฉ openjdk-17-jdk ๋˜๋Š” Java 21 ๋Ÿฐํƒ€์ž„์šฉ openjdk-21-jdk์—์„œ gVisor๋กœ ๋ณดํ˜ธ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์—์„œ Java ์•ฑ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Java ๋ฒ„์ „์— ์ง€์›๋˜๋Š” Ubuntu ๋ฒ„์ „์€ ๋Ÿฐํƒ€์ž„ ์ง€์› ์ผ์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

App Engine์€ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์•ฑ์„ ๋‹ค์‹œ ๋ฐฐํฌํ•  ํ•„์š” ์—†์ด OpenJDK 17 ๋ฐ OpenJDK 21 ํŒจํ‚ค์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐํฌ๋œ ์•ฑ์€ ๋Ÿฐํƒ€์ž„์˜ /workspace ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. /srv์—์„œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ํ†ตํ•ด์„œ๋„ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

App Engine Java ์ถœ์‹œ ๋ฒ„์ „

2.x.x ๋ฒ„์ „์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ์ถœ์‹œ ์•„ํ‹ฐํŒฉํŠธ๋Š” ์˜คํ”ˆ์†Œ์Šค ์ถœ์‹œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub ์ €์žฅ์†Œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ข…์† ํ•ญ๋ชฉ

์ข…์† ํ•ญ๋ชฉ ์„ ์–ธ ๋ฐ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ข…์† ํ•ญ๋ชฉ ์ง€์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘

Spring Boot, Micronaut, Ktor ๋“ฑ์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅ uber JAR์„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. Maven ๋˜๋Š” Gradle ๋นŒ๋“œ ํŒŒ์ผ์ด ์‹คํ–‰ ๊ฐ€๋Šฅ Uber JAR์„ ์ƒ์„ฑํ•  ๋•Œ ๋Ÿฐํƒ€์ž„์€ Uber JAR ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” App Engine์ด app.yaml ํŒŒ์ผ์—์„œ ์„ ํƒ์ ์ธ entrypoint ํ•„๋“œ์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

runtime: java21 # or another supported runtime
entrypoint: java -Xmx64m -jar YOUR-ARTIFACT.jar

์—ฌ๊ธฐ์—์„œ YOUR-ARTIFACT.jar ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ jar์˜ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • app.yaml ํŒŒ์ผ์ด ์žˆ๋Š” ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ด๋‹น META-INF/MANIFEST.MF ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํŒŒ์ผ์— Main-Class ํ•ญ๋ชฉ์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ ํƒ์ ์œผ๋กœ ๋‹ค๋ฅธ ์ข…์†๋œ jar์˜ ์ƒ๋Œ€ ๊ฒฝ๋กœ ๋ชฉ๋ก์ด ์žˆ๋Š” Class-Path ํ•ญ๋ชฉ์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ž๋™์œผ๋กœ ์—…๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

์•ฑ์ด HTTP ์š”์ฒญ์„ ์ˆ˜์‹ ํ•˜๋ ค๋ฉด ์ง„์ž…์ ์€ PORT ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ง€์ •๋œ ํฌํŠธ์—์„œ ์ˆ˜์‹  ๋Œ€๊ธฐํ•˜๋Š” ์›น ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. PORT ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฐ’์€ App Engine ์ œ๊ณต ํ™˜๊ฒฝ์—์„œ ๋™์ ์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. app.yaml ํŒŒ์ผ์˜ env_variables ์„น์…˜์—์„œ๋Š” ์ด ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ์ง„์ž…์ ์„ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋ฐ ์ง์ ‘ ์ข…์† ํ•ญ๋ชฉ๋งŒ ํฌํ•จํ•˜๋Š” ์”ฌ JAR ํŒŒ์ผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•˜๊ณ  ํŒจํ‚ค์ง•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ App Engine ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ „์ฒด uber JAR ํŒจํ‚ค์ง€ ๋Œ€์‹  ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ๋งŒ ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

PORT ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

์•ฑ ๋กœ๊ทธ ํŒŒ์ผ์— ํฌํŠธ 8080 ๋ฐ NGINX์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด ์•ฑ์˜ ์›น ์„œ๋ฒ„๊ฐ€ ๊ธฐ๋ณธ ํฌํŠธ 8080์—์„œ ๋ฆฌ์Šจํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด App Engine์ด NGINX ๋ ˆ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์‘๋‹ต์„ ์••์ถ•ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PORT ํ™˜๊ฒฝ ๋ณ€์ˆ˜(์ผ๋ฐ˜์ ์œผ๋กœ 8081)๋กœ ์ง€์ •๋œ ํฌํŠธ์—์„œ HTTP ์š”์ฒญ์— ์‘๋‹ตํ•˜๋„๋ก ์›น ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

/*
 * Copyright 2019 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.appengine;

import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

public class Main {

  public static void main(String[] args) throws IOException {
    // Create an instance of HttpServer bound to port defined by the 
    // PORT environment variable when present, otherwise on 8080.
    int port = Integer.parseInt(System.getenv().getOrDefault("PORT", "8080"));
    HttpServer server = HttpServer.create(new InetSocketAddress(port), 0);

    // Set root URI path.
    server.createContext("/", (var t) -> {
      byte[] response = "Hello World!".getBytes();
      t.sendResponseHeaders(200, response.length);
      try (OutputStream os = t.getResponseBody()) {
        os.write(response);
      }
    });

    // Create a second URI path.
    server.createContext("/foo", (var t) -> {
      byte[] response = "Foo!".getBytes();
      t.sendResponseHeaders(200, response.length);
      try (OutputStream os = t.getResponseBody()) {
        os.write(response);
      }
    });

    server.start();
  }
}

์ด์ „ ์ž๋ฐ” ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ

Java 8๊ณผ ์ง€์›๋˜๋Š” ์ตœ์‹  Java ๋ฒ„์ „ ๊ฐ„์˜ ์ฐจ์ด์ ์€ Java 8์—์„œ ์ตœ์‹  Java ๋Ÿฐํƒ€์ž„์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ™˜๊ฒฝ ๋ณ€์ˆ˜

๋‹ค์Œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ๋Ÿฐํƒ€์ž„์—์„œ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค๋ช…
GAE_APPLICATION App Engine ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ID์ž…๋‹ˆ๋‹ค. ์ด ID๋Š” ์œ ๋Ÿฝ์— ๋ฐฐํฌ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ 'e~'์™€ ๊ฐ™์ด 'region code~'๋กœ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
GAE_DEPLOYMENT_ID ํ˜„์žฌ ๋ฐฐํฌ ID์ž…๋‹ˆ๋‹ค.
GAE_ENV App Engine ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค. standard๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
GAE_INSTANCE ์„œ๋น„์Šค๊ฐ€ ํ˜„์žฌ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์ธ์Šคํ„ด์Šค ID์ž…๋‹ˆ๋‹ค.
GAE_MEMORY_MB ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์„ธ์Šค์— ์ œ๊ณต๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–‘(MB)์ž…๋‹ˆ๋‹ค.
GAE_RUNTIME app.yaml ํŒŒ์ผ์— ์ง€์ •๋œ ๋Ÿฐํƒ€์ž„์ž…๋‹ˆ๋‹ค.
GAE_SERVICE app.yaml ํŒŒ์ผ์— ์ง€์ •๋œ ์„œ๋น„์Šค ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์„œ๋น„์Šค ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด default๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
GAE_VERSION ์„œ๋น„์Šค์˜ ํ˜„์žฌ ๋ฒ„์ „ ๋ผ๋ฒจ์ž…๋‹ˆ๋‹ค.
GOOGLE_CLOUD_PROJECT ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์—ฐ๊ฒฐ๋œ Google Cloud ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค.
PORT HTTP ์š”์ฒญ์„ ์ˆ˜์‹ ํ•˜๋Š” ํฌํŠธ์ž…๋‹ˆ๋‹ค.
NODE_ENV(Node.js ๋Ÿฐํƒ€์ž„์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ) ์„œ๋น„์Šค๊ฐ€ ๋ฐฐํฌ๋˜๋ฉด production์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”.

app.yaml ํŒŒ์ผ์— ์ถ”๊ฐ€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ NODE_ENV ์™ธ์—๋Š” ์œ„ ๊ฐ’์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

HTTPS ๋ฐ ์ „๋‹ฌ ํ”„๋ก์‹œ

App Engine์€ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์—์„œ HTTPS ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์š”์ฒญ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์›๋ณธ ์š”์ฒญ IP์™€ ํ”„๋กœํ† ์ฝœ์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ IP ์ฃผ์†Œ๋Š” ํ‘œ์ค€ X-Forwarded-For ํ—ค๋”์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ด ์ •๋ณด๊ฐ€ ํ•„์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ”„๋ก์‹œ๋ฅผ ์‹ ๋ขฐํ•˜๋„๋ก ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์‹œ์Šคํ…œ ์•ก์„ธ์Šค

๋Ÿฐํƒ€์ž„์—๋Š” ์ฝ๊ธฐ ์ „์šฉ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๋””๋ ‰ํ„ฐ๋ฆฌ์™€ ํ•จ๊ป˜ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ /tmp ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. /tmp์— ์“ฐ๋Š” ๋ฐ ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์„œ๋ฒ„

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ ์ธ์Šคํ„ด์Šค๋Š” App Engine ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค์™€ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์„œ๋ฒ„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • http://metadata
  • http://metadata.google.internal

๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์„œ๋ฒ„๋กœ ์ „์†ก๋˜๋Š” ์š”์ฒญ์—๋Š” ์š”์ฒญ ํ—ค๋” Metadata-Flavor: Google์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ—ค๋”๋Š” ์š”์ฒญ์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์ „์†ก๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋‹ค์Œ ํ‘œ์—๋Š” ํŠน์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด HTTP ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๋‚˜์—ด๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์—”๋“œํฌ์ธํŠธ ์„ค๋ช…
/computeMetadata/v1/project/numeric-project-id ํ”„๋กœ์ ํŠธ์— ํ• ๋‹น๋œ ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.
/computeMetadata/v1/project/project-id ํ”„๋กœ์ ํŠธ์— ํ• ๋‹น๋œ ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค.
/computeMetadata/v1/instance/region ์ธ์Šคํ„ด์Šค๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ๋ฆฌ์ „์ž…๋‹ˆ๋‹ค.
/computeMetadata/v1/instance/service-accounts/default/aliases
/computeMetadata/v1/instance/service-accounts/default/email ํ”„๋กœ์ ํŠธ์— ํ• ๋‹น๋œ ๊ธฐ๋ณธ ์„œ๋น„์Šค ๊ณ„์ • ์ด๋ฉ”์ผ์ž…๋‹ˆ๋‹ค.
/computeMetadata/v1/instance/service-accounts/default/ ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ๊ธฐ๋ณธ ์„œ๋น„์Šค ๊ณ„์ •์ด ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.
/computeMetadata/v1/instance/service-accounts/default/scopes ๊ธฐ๋ณธ ์„œ๋น„์Šค ๊ณ„์ •์— ์ง€์›๋˜๋Š” ๋ชจ๋“  ๋ฒ”์œ„๊ฐ€ ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.
/computeMetadata/v1/instance/service-accounts/default/token ๋‹ค๋ฅธ Google Cloud API์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ธ์ฆํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ฆ ํ† ํฐ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ”„๋กœ์ ํŠธ ID๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ ค๋ฉด http://metadata.google.internal/computeMetadata/v1/project/project-id์— ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.