ken1714 / terrafom-gcp-sample

0 stars 0 forks source link

GCPで簡単なインフラを作ってみる #1

Closed ken1714 closed 9 months ago

ken1714 commented 9 months ago

terraform applyする前に少しハマったので共有。

# 使用したいGoogleアカウントでログイン(既にログイン済みであれば不要)
$ gcloud auth login
You are now logged in as [xxxxxx@example.com].
Your current project is [XXXXXX].  You can change this setting by running:
  $ gcloud config set project PROJECT_ID

# GCPにリソースを作成するための証明書(credentials)を発行。Terraformで明示的に指定しない場合デフォルトでこちらの証明書が使用される。
$ gcloud auth application-default login
Your browser has been opened to visit:

    https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=XXX....

Credentials saved to file: [C:\Users\UserName\AppData\Roaming\gcloud\application_default_credentials.json]

These credentials will be used by any library that requests Application Default Credentials (ADC).

Quota project "XXXXXX" was added to ADC which can be used by Google client libraries for billing and quota. Note that some services may still bill the project owning the resource.
ken1714 commented 9 months ago

gcloud auth application-default loginのログイン処理をあらかじめ実行することで、以下のようにわざわざcredentialsへのパスを書く必要がなくなる。

provider "google" {
  credentials = "${file("<your-credential-file-path>")}"
  project     = "project-id"
  region      = "asia-northeast1"
}
ken1714 commented 9 months ago

DockerイメージをGCPの自分のプロジェクトにpushする前に、以下の操作が必要。

$ gcloud auth configure-docker

その後は普通にpushするだけ。

$ docker push gcr.io/${project_id}/sample-nodejs
ken1714 commented 9 months ago

この辺りを参考にNode.jsのサンプルアプリを作ってみた。

const http = require('http');
const fs = require('fs');

let server = http.createServer((req, res) => {
    fs.readFile('./index.html', 'utf-8', (error, data) => {
        res.writeHead(200, { 'Content-Type': 'text/html' });
        res.write(data);
        res.end();
    });
});

server.listen(3000);
console.log('Server Start!');

index.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Hello Node.js</title>
    </head>
    <body>
        <h1>Hello Node.js</h1>
        <p>HTMLを表示する</p>
    </body>
</html>

Dockerfile

FROM node:20.11-alpine

WORKDIR /app
COPY . .

EXPOSE 3000

USER node
CMD ["node", "index.js"]

ただし、ポート3000を使用する場合、Cloud Run側でポートを開放する必要あり。

resource "google_cloud_run_v2_service" "default" {
    # ...

    template {
        #...
        containers {
            image = var.image
            ports {
                container_port = 3000
            }
        }
    }
}