自称フルスタックエンジニアのぶろぐ。

pythonやreactや、gcpやawsなどなどについて書いていこうかと思います。

GCP gcloud dockerコマンドが使えなくなった。

dockerのバージョン18.03までしかサポートしなくなったらしく、

gcloud docker

は使えなくなりました。

対応方法。

$ gcloud auth configure-docker

を実行します。

メモ

docker build -t asia.gcr.io/xxx/yyy .
gcloud docker -- push asia.gcr.io/xxx/yyy

のような、2ステップでやってた人は、

docker build -t core-app .
docker tag tag-name asia.gcr.io/xxx/yyy
docker push asia.gcr.io/xxx/yyy

となる。

murabo.hatenablog.com

GKE(kubernetes) を超要約すると

GKEとは

まずは、これだけのイメージで触ってみると楽だと思う。

Dockerとかコンテナーの初学者や未経験者は、Dockerを1から学ぼうとする人がいるかもしれないが、 まずは触ってみた方がすごく早いと思う。

デプロイするまでの触りとしては、

  • Dockerイメージを作る or 適当に選ぶ
  • それを使ったPodを作るためのyamlファイル(manifesto)を作る。
  • kubectl でデプロイする。
デプロイ
kubectl create -f xxxx.yaml

削除
kubectl delete -f xxxx.yaml

ちょっと書いてある事複雑そうに見えるけど、下記を何も考えずにやってみると良いかも

Redis と PHP を使用したゲストブックの作成  |  Kubernetes Engine のチュートリアル  |  Google Cloud

Kind

Deploy

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: sample
spec:
  replicas: 1 # 生成するpodsの数
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
      - name: sample-app
        image: xxx # podで動かしたいdocker image
        imagePullPolicy: Always
        env:
          # 環境変数はこのブロックに記載
        ports:
        - containerPort: 8080

Service

apiVersion: v1
kind: Service
metadata:
  name: sample-backend
spec:
  type: NodePort
  selector:
    app: sample-app # 管理下にするpod名
  ports:
  - port: 80 # このサービスで受けるport番号
    protocol: TCP
    targetPort: 8080 # 管理podに投げるport番号

Ingress

HTTP(S) LB用のManifest

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: sample-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: xxxx # 予約している静的IP名
spec:
  backend:
    serviceName: sample-backend # 待機するサービス
    servicePort: 80 # 待機するport

murabo.hatenablog.com

murabo.hatenablog.com

Google Cloud pubsub でハマった事。

ハマった事

クライアントライブラリからpublishして、messageidsが返却され成功しているのに、 subscriverで、メッセージが確認できない。

原因

同じ名前で、topicを消して、作り直した。

対応

一度消したトピック名は使わない。

murabo.hatenablog.com

murabo.hatenablog.com

django テストコード mock patch

テストコード ✕ mock ✕ patch

djangoでテストコード書くときに、APIにアクセスする処理をテストするために、mockでpatchした時のメモ。

    def _call_api(self, send_data):
        """
        api呼ぶだけの関数
        :param send_data:
        :return: response
        """
        return requests.post(self.endpoint, data=send_data)
from unittest import mock
from django.test import TestCase


class ApiBatchTest(TestCase):
    # アノテーションで、中身を変えたい関数を指定
    @mock.patch('path.to.Class._call_api')
    def test_api(self, mock_get):
        # mock_get(引数)で、変更したい関数のmockを受取、return_value(戻り値)を好きな状態に書き換える
        mock_get.return_value.status_code = 200
        mock_get.return_value['status'] = 200


        def json():
            """
            期待するresponseのjson()の結果っぽく作った。
            """
            return {
                'result': {
                    'A': 0.5,
                    'B': 0.5,
                    'C': 0.5
                },
                'attention': 'test',
                'status': 200
            };

        setattr(mock_get.return_value, 'json', json)

        # 上記によって、テスト実行される関数の中身のstatus_codeや、response.json()が上記の内容となる。

Google App Engine(GAE) WEBサービスを作ってみた

Google App EngineGoogle Cloud SQLGoogle Cloud Storage を使ってツイッター連動するWEBサービスを作ってみました。

 

まだβ版のステータスです。

 

上記サイトから、愚痴や不満をつぶやくと、@boooing1がツイッターに匿名で投稿もしてくれます。

 

・課題

Dockerfileでゴリゴリやっちゃったんで、GKEにしたい。

 

httpsリダイレクトすると、ヘルスチェックでこけるから出来てない。

 

そもそもPV少ない笑

 

 

 

 

 

Google App Engine(GAE) のdeployの話 Part3.1 ~デプロイに失敗しまくる話2~

以前、GAEのデプロイがあるタイミングからエラーループに見舞われると書いたんですが、

murabo.hatenablog.com

全くの勘違いというか、こちらの知識不足でした・・・

djangoで開発していたんですが、settingsのALLOWED_HOSTに、IPやらドメインを指定したことで、 GAEの監視チェックの疎通が失敗してしまうことが原因でした。

回避策は

ALLOWED_HOSTS = [
    '*'
]

にすること。

監視のIPが、コロコロと変わるため、追加していっても同様のエラーが発生しました。

もし同じdjango使いの人のお役に立てれば幸いです。

【見落としてしまった原因】 発見が遅れたのは、エラーログをちゃんと見れてなかった(流れすぎてて見る気が失せてた)ためです。

deployが進行すると下記のようなログが出たタイミングでバージョン管理されているので

24e374a2929b: Pushed
52097cf6d5fa: Pushed
f22232098317: Pushed
0456c72748aa: Pushed

latest: digest: sha256:9723bc8ea076e9f6b0bc2aa8b01336ee3df639ae84433f7dce41c8666a4700c2 size: 4739
DONE

そのあとに、loggingで下記の設定を行うことで、deployに関したlogだけ表示させることができます。

f:id:murabo408:20180326143916p:plainf:id:murabo408:20180326143821p:plain

ちゃんとlog見ないとだめですね・・・・

GCP ~Google Cloud Container Builder編~

Google Cloud Container Builder

コンテナ イメージをビルドしてくれるサービスです。

やることはシンプルにビルドなので、ノーガードで攻め込んだら、無知すぎて手痛い洗礼を受けました・・・・ (GCPやり始めてこんなんばっかだな・・・)

まず、サンプルっぽいソースに下記のようにコマンド実行しました。

$ gcloud container builds submit --tag gcr.io/<your-project-name>/sample .
Creating temporary tarball archive of 9 file(s) totalling 37.2 KiB before compression.
Uploading tarball of [.] to [gs://<your-project-name>_cloudbuild/source/1521708458.84-95f75ef8e09d4812a685644476bc3d91.tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/<your-project-name>/builds/6b561f37-83d9-40a6-8059-bf7b65e6e289].
Logs are available at [https://console.cloud.google.com/gcr/builds/6b561f37-83d9-40a6-8059-bf7b65e6e289?project=<your-project-name>].
------------------------------------------------------------------------------------------- REMOTE BUILD OUTPUT -------------------------------------------------------------------------------------------
starting build "6b561f37-83d9-40a6-8059-bf7b65e6e289"

FETCHSOURCE
Fetching storage object: gs://<your-project-name>_cloudbuild/source/1521708458.84-95f75ef8e09d4812a685644476bc3d91.tgz#1521708460698522
Copying gs://<your-project-name>_cloudbuild/source/1521708458.84-95f75ef8e09d4812a685644476bc3d91.tgz#1521708460698522...
/ [1 files][ 12.1 KiB/ 12.1 KiB]
Operation completed over 1 objects/12.1 KiB.
BUILD
Already have image (with digest): gcr.io/cloud-builders/docker
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /workspace/Dockerfile: no such file or directory
ERROR
ERROR: build step 0 "gcr.io/cloud-builders/docker" failed: exit status 1
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ERROR: (gcloud.container.builds.submit) build 6b561f37-83d9-40a6-8059-bf7b65e6e289 completed with status "FAILURE"

なんやねん・・・・と

結果だけのべる・・・ (ポルナレフのもじろうと思ったけどそんな気力もなくなったので本当に結果だけ)

上記のコマンドは Dockerfileが存在するディレクトリで実行 すること!

僕、kubernetesのyamlとかある、一個上の階層でやっちまってたんです・・・・orz

たったこれだけなのに、すごーく遠回りしました・・・・

ドキュメントもっと親切にしてほしい・・・・

だけど、

「覚えたぞォォ!」

無知すぎてさーせんでした。

murabo.hatenablog.com