Help us understand the problem. What is going on with this article?

CloudRunの秘匿情報をSecretManagerで扱ってみる

概要

以前、CloudRunで秘匿情報を扱うのにberglas(GCPで秘匿情報を扱うためのOSS)を使用しましたが、2020年1月23日公式にGCPで秘匿情報を扱うためのサービスであるSecretManagerが公開されました。

紹介記事

https://cloud.google.com/blog/ja/products/identity-security/introducing-google-clouds-secret-manager

制限事項

まだベータ提供です。
東京リージョンもまだありません。(一番近くて台湾)

なので、GAでないと困る人や、秘匿情報を国外に保持したくない人はまだ使えないです。
ただ、今後GCPで秘匿情報を扱うのはこれが標準になっていくと思われます。

使い方

シークレットを作成する

セキュリティ→シークレットマネージャーから作成します。

スクリーンショット 2020-02-11 22.19.29.png

「sample-secret」というキーで、「usagisan」という文字列を格納しています。

なお、gcloudコマンドで作成する手順は、上記紹介記事の中に記載があります。

クライアント

シークレットを読み取る例は、下記ドキュメントのCreating and accessing secretsの章が参考になります。

https://cloud.google.com/secret-manager/docs/how-to?hl=ja

python(Django)での実装例

シークレットを取得して画面に表示するだけのサンプル。
(SecretManagerにアクセスするためのソースはここだけです。他は、Djangoの設定や、コンテナ化、CloudRunへのデプロイ手順です)
views.py

from django.shortcuts import render
from google.cloud import secretmanager_v1beta1 as secretmanager

# Create your views here.
from django.http import HttpResponse

def index(request):
    client = secretmanager.SecretManagerServiceClient()
    # プロジェクトID,シークレットID,バージョン番号
    name = client.secret_version_path('xxxx-xxx-xxxxxx', 'sample-secret', 1)
    response = client.access_secret_version(name)
    payload = response.payload.data.decode('UTF-8')
    return HttpResponse("Hello " + payload + "!")

urls.py

from django.contrib import admin
from django.urls import path
import app.views

urlpatterns = [
    path(r'^admin/', admin.site.urls),
    path(r'', app.views.index, name='index')
]

CloudRunで実行するためにイメージを作成します。

requirements.txt

django
google-cloud-secret-manager

Dockerfile

FROM python:3.8.1-slim

ENV PYTHONDONTWRITEBYTECODE 1  
ENV PYTHONUNBUFFERED 1 

RUN apt-get update \
    && apt-get upgrade -y \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    && pip install --upgrade pip

# 作業するディレクトリを変更
WORKDIR /app
# アプリのコピー
COPY . /app

# pythonのパッケージをインストール
RUN pip install -r requirements.txt

EXPOSE 8000

CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]

setting.pyの変更(セキュリティは一旦置いといて)

#ALLOWED_HOSTS = []
ALLOWED_HOSTS=['*']

# LANGUAGE_CODE = 'en-us'

# TIME_ZONE = 'UTC'

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

CloudRunにデプロイ

イメージをContainerRegistoryに保存

gcloud auth configure-docker
docker build -t asia.gcr.io/<プロジェクトID>/<イメージ名>:<タグ名> .
docker push asia.gcr.io/<プロジェクトID>/<イメージ名>:<タグ名>

デプロイ

ContainerRegistoryに登録したイメージを選択
スクリーンショット 2020-02-16 181236.png

東京リージョンを選択、未認証の呼び出しを許可をチェック、ポート番号を変更してデプロイ
スクリーンショット 2020-02-16 18.15.56.png

動作確認

デプロイが終わるとURLが発行されるので動作確認。
スクリーンショット 2020-02-16 21.30.44.png

きっとエラーになります。
スクリーンショット 2020-02-16 213255.png

SecretManagerへは明示的にアクセス許可を与えないと権限エラーとなるためですね。

というわけで、IAMに権限を付与します。
スクリーンショット 2020-02-16 21.38.09.png

再度アクセスすると、無事表示されました。
スクリーンショット 2020-02-16 21.38.45.png

おわりに

紹介記事ではberglasとの関係という内容で、berglasからでもアクセスできる記載がありましたが、これから始める人はSecretManagerを直接使えば良さそうですね。
今すでにberglasで運用している人は格納場所はSecretManagerに寄せてアクセスはberglasのままという使い方もできそうです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした