ラベル GCP の投稿を表示しています。 すべての投稿を表示
ラベル GCP の投稿を表示しています。 すべての投稿を表示

2020/07/24

GCP: GAE node.js standard 環境で、Facebook Messanger のBot を立ち上げるまで


  • Goal
    FacebookMessengerのBOTをGoogle App Engine Node.js Standard 環境上に立ち上げる。
    ・テキストメッセージながらオウム返し
    ・それ以外のメッセージなら「ああ、それな〜」と返す
  • How
    1. Facebook Developerでの作業
      (1)アプリの作成

      (2)Messangerプラットフォームの設定
      ・トークン作成で、PAGE_ACCESS_TOKENを作成


      ・Webhookとして、まずはmessages と、messaging_postbacksを有効にする。
      ・コールバックURLに、Google app engine のURLを入力
      ・トークン欄には、自分自身で決めた文字列を入力する。この値がFacebook側からGAEのWebhookに渡されるので、GAEのアプリケーション内のVERIFY_TOKENにセットする必要がある。
    2. GAE アプリケーションの作成
      (1)GCPプロジェクトを作成 (割愛)
      (2)GITからサンプルコードをPull
      git clone https://github.com/pumpkinpietea/facebookMessengerBot.git



      (3)Facebook Developerで発行したPAGE_ACCESS_TOKENと自身で決めたVERIFY_TOKENを貼り付ける

      (4)gcloud コマンドでDeploy
      $ gcloud init
               $ gcloud app deploy
    3. 完成

2020/06/07

GCP: ローカルからGCLOUDコマンドを叩くと pyenv: python2: command not found エラー

  • Issue
    gcloud コマンドをローカルから使おうとしたら、pyenv: python2: command not found エラーとなる
  • 環境など
    Mac mojave 10.14.6
    pyenv 1.2.8-182  ※homebrew でインストールしていない。(これが原因かも)
  • 原因
    文字通りなのですが、gcloudの中で、"python2" コマンドが呼び出されるけど、python2 コマンドが見つからないと言われている。


  • Solution
    .zprofile に、export CLOUDSDK_PYTHON=/usr/bin/python を追記
    これを追記することで、呼び出すPython環境を明示できて、python2 を呼ばなくなる。
    (しらんけど。。。)


  • 編集後記
    これは、元々、エラーがでるけど普通に動く。多分、python2 コマンド使って、だめならpython コマンドって順番に呼び出しているのかと想像。
    前のMACだと出なかったんだけど。。。

2020/06/06

GCP: Google Compute Engine にVSCODD 越しに接続する

  • Goal
    • VSCODEから、GCEインスタンス(開発環境)に接続開発する
    • そのとき、一応SSHのポートも変更する
  • How
    1. gcloud SDK のインストール(詳細はカツアイ)
    2. GCE インスタンスを作成し、静的IPを割り当てる (詳細はカツアイ)
    3. ローカル端末で、Keyを作成する
      ssh-keygen -t rsa -b 4096 -C "testUser"
    4. GCEの設定画面で、Keyを貼り付け
    5. PORT:22での接続テスト
      gcloudコマンド (静的IPの割当が不要。インスタンス名で接続できる)
      gcloud compute ssh testUser@instance-1 --ssh-key-file ./test_rsa
    6. GCEのOS上でのsshdのポート変更
      5で接続した状態で、GCEの内部のsshd_configファイルの設定を変更する
      sudo vi /etc/ssh/sshd_config

      以下に、接続したいポート番号を追加
      #Port 22
      Port 22011
      #AddressFamily any


      そのあとに、サービスのRESTARTとSTATUSを確認
      sudo systemctl restart sshd
      sudo systemctl status sshd
      確認して問題なければ、一旦GCEから抜ける
    7. GCPのネットワークの設定でPORTの変更
      以下のケースでは、22から22011へ変更
    8. ローカルから、SSHでアクセステスト
      ssh testUser@34.67.184.203 -p 22011 -i ~/.ssh/test_rsa
    9. config の設定を加えるとVSCODEのからアクセスできる
  • 編集後記
    GCEインスタンスの開発なら、VSCODE+RemoteDevelopmentで開発して、Cloud Source Repositories へPushし、Cloud BuildでSTG環境と本番へデプロイが良いのでしょうか?
    でも、GAEなら、Cloud Shell で開発して、Cloud Source Repositories+Cloud Buildもできて、それならどこでも開発できるとも思ったりします。
    開発経験の少ない素人なので、良い方法が単純に知りたい・・・

2020/05/31

GCP: Cloud Source Repositories のソースを別プロジェクトにPUSH(コピー)する方法 on Cloud Shell

  • Goal
    類似アプリを作成する必要があり、Cloud Source Repositoriesのソースを別プロジェクトのレポジトリにコピーしたい。
    開発は、cloud shell 上で行っているので、そこでコピーする
  • How
    元のプロジェクト名: s001
    新しいプロジェクト名: s002 とする
    1. プロジェクトs002 に、新しいRepositoryを作成 --- GCPのコンソールで作成


    2. 以下、Cloud Shell上での作業

  • 参考情報
    レポへのリンクは以下から取れる
  • 編集後記
    Cloud ShellとCloud Source Repositories に、加えてCloud Buildで、色々できるようになりたいが、まだ、調べるのに時間がかかりすぎ。。。

2020/05/06

GCP: Bigquery 関数でGROUP BYしようとするとエラーがでる --- bq


  • Goal
    Bigqueryで、Timestamp のデータをdate(日付)にグループ化&集計し、日付の新しいもの順にソートをしたい
  • How
    例1) グループ化して集計は、OK
    SELECT date(timestamp),count(1)
    FROM xxxxxxxxxxx
    GROUP BY date(timestamp)

    例2) 日付の新しいもの順に並べようとしたら。。。
    SELECT date(timestamp),count(1)
    FROM xxxxxxxxxxx
    GROUP BY date(timestamp)
    ORDER BY date(timestamp) DESC

    実行すると、エラー。。。
    SELECT list expression references column timestamp which is neither grouped nor aggregated at [1:13]

    例3) 別名(alias)付けると、エラーはでない。
    SELECT date(timestamp) as TARGET_DATE, count(1)
    FROM xxxxxxxxxxx
    GROUP BY TARGET_DATE
    ORDER BY TARGET_DATE DESC
  • 編集後記
    しょうもない事で、時間を潰してしまったので、メモ。。。
    GROUP BYだけならOKで、ORDER BYを付けるとNG。
    これって結構常識なんでしょうか?しらんかった。

2020/04/25

GCP: コンテナイメージから、GCEを立ち上げる方法 with Docker HUB -- GCP,GCE,docker


  • Goal
    • GCE(Google Compute Engine)に、コンテナイメージをDeployして立ち上げる。
    • Dockerのイメージは、DockerHUBから持ってくる。
  • How
    1. 準備:DockerHUBに、コンテナイメージを作成する。
      ①Github のrepositoryと、DockerHUBを連携させる
      ■連携の仕方
      https://docs.docker.com/docker-hub/builds/link-source/

      ドットインストールのPHP環境のテストをしたかったので、Docker fileなどを取得し、DockerHUBと連携させたGithubのrepositoryへpushする。すると、自動でDockerHUBにイメージが作成される!
      ■Githubのレポジトリ
      https://github.com/pumpkinpietea/dockerhub
      ■連携されたDockerhubのレポジトリ
      https://hub.docker.com/repository/docker/pumpkinpietea/github
    2. GCPのコンソールでGCEインスタンスをコンテナイメージを利用して立ち上げる。

      ■コンテナイメージ名に docker.io/アカウント名/レポ名 を入力する

    3. イメージを作成し、SSHでつないで見る。
      ~$ docker ps
      でコンテナIDを調べて
      ~$ docker exec -it コンテナ名 sh
      で、コンテナの中に入れる
  • Thanks!!
  • 編集後記
    • PHPの勉強をしようとして、ドットインストールさんの講座をみて進めようとしたが、Dockerをローカルmacには入れたくないと思い、GCPのf1-microインスタンスを使おうを思って取り組んだ。普通にインスタンス立ち上げて設定しようかとおもったが、少し調べてみたらコンテナイメージをDeployできるみたいなので試してみた。
    • GCE 1インスタンスで、 1コンテナとのこと。GKEの勉強しないと実業務には使えないかもしれないが、1インスタンスの開発環境の立ち上げとかには、。

2020/02/11

GCP: gcloud コマンドラインで、GAEの全インスタンスを停止する --- GCP,GAE,shellscript,gcloud

・Goal
 テストで作成したGAEの全サービスの全インスタンスをコマンドラインから削除・停止する。バージョン名等を指定せずに、どんどんデプロイすると稼働中のインスタンスが増える。それをコマンドラインで一気に全停止する。コンソール画面からだと、サービス毎/バージョン毎にプチプチと停止する必要があり面倒だった。。。

・How
 これが基本形
 ~$ gcloud app instances delete [instance ID] -v [version] -s [service]

・Example
# step1  一覧で確認
~ $ gcloud app instances list
SERVICE  VERSION  ID                                      VM_STATUS  DEBUG_MODE
default  master   00XXXXXXX                               N/A
test1    master   00XXXXXX1                               N/A
test2    master   00686ff30                               N/A

# step2 削除
~ $ gcloud app instances list | sed 1d | awk '{print $1, $2, $3}' | while read s v id; do gcloud app instances delete $id -v $v -s $s --quiet; done
Deleting the instance [default/master/00XXXXXXX].
Deleted [https://appengine.googleapis.com/v1/apps/---].
Deleting the instance [test1/master/00XXXXXX1].
Deleted [https://appengine.googleapis.com/v1/apps/---].
Deleting the instance [test2/master/00686ff30].
Deleted [https://appengine.googleapis.com/v1/apps/---].

# 説明
~ $ gcloud app instances list | \ # インスタンスのリストを出力
sed 1d | \ # 一行目をカット
awk '{print $1, $2, $3}' | \ # awk できれいにする。(この処理は不要・・・)
# 以下のハイライトの箇所で、順番に消していく。y/nを聞かれるので --quiet を追加
while read s v id; do gcloud app instances delete $id -v $v -s $s --quiet; done

2020/02/09

GCP: Cloud Tasksにおける queueの設定 (GAEの特定のserviceへリクエストを投げたい) -- GAE 2nd gen, Python3, gcloud

・背景
 GAEをタスクハンドラーとして使っている。
 GAE-py の2nd Genへの移行に伴い、従来のapp engine task queueは
 使えなくなり、Cloud Tasksへの移行が必要。
 それに伴い従来のqueue.yaml の設定も不要。
 今後は、コンソールからgcloudコマンドでqueueを作ることになるとのこと。
   https://cloud.google.com/tasks/docs/migrating?hl=ja

 そこで、試していたのだが、GAEのデフォルトじゃなくて、特定のサービスや、
 バージョンに対してのリクエストの投げ方が解らずハマる。。。
  http://[project ID].appspot.com/
  ではなくて例えば、
  http://[service]-dot-[project ID].appspot.com/
  にリクエストを投げたい。

・Goal
 GAEの特定のサービスに対するqueueを作成したい。

・How
 gcloud コマンドで、--routing-overrideを設定すればよい。

 [As-is]
XXX@cloudshell:~$ gcloud tasks queues describe queue-sample
name: projects/[project ID]/locations/us-central1/queues/queue-sample
rateLimits:
  maxBurstSize: 100
  maxConcurrentDispatches: 1000
  maxDispatchesPerSecond: 500.0
retryConfig:
  maxAttempts: 100
  maxBackoff: 3600s
  maxDoublings: 16
  minBackoff: 0.100s
state: RUNNING

 [変更]
XXX@cloudshell:~$ gcloud tasks queues update queue-sample --routing-override=service:test
WARNING: You are managing queues with gcloud, do not use queue.yaml or queue.xml in the future. More details at: https://cloud.google.com/tasks/docs/queue-yaml.
Updated queue [queue-sample].

 [To-be]
XXX@cloudshell:~$ gcloud tasks queues describe queue-sample
appEngineRoutingOverride:
  host: test.[project ID].appspot.com
name: projects/[project ID]/locations/us-central1/queues/queue-sample
rateLimits:
  maxBurstSize: 100
  maxConcurrentDispatches: 1000
  maxDispatchesPerSecond: 500.0
retryConfig:
  maxAttempts: 100
  maxBackoff: 3600s
  maxDoublings: 16
  minBackoff: 0.100s

state: RUNNING

・Thanks!!
https://cloud.google.com/sdk/gcloud/reference/tasks/queues/update#--routing-override

2019/08/04

GCP: GAE/Py から、ElasticSearch(GCE上で稼働)を呼び出す -- Python

  • GOAL: レコメンドエンジンとしてElasticSearchを立ち上げ&セットアップする。その後、Google App Engine(GAE)から、ElasticSearchAPIを呼び出して使う。
  • POINT
    1.GAE
    からの外部HTTPREST API)呼び出しは、POSTで行うこと! GETは使うな!!
    (GAE/Py27の環境で、requestsを利用して呼び出す場合)
    2.Logstash
    は、必ず「Ctrl+D」で終了させること!
    Ctrl+Z
    で終了させていたため、サービスが起動中となりハマりました。
  • HOW
    1.Martket Placeから、ELK(ElasticSearch+Logstash+Kibana)を起動
    2.Logstashを使って、CSVデータをElasticSearchにロード
    3.GAEから、ElasticSearchに検索クエリーを発行して結果を取得
    ----------------
    1.Martket Placeから、ELK(ElasticSearch+Logstash+Kibana)を起動
       ・Bitnamiの仮想マシンを選択
       ・手順に沿って、選択をしていくだけ


    2.Logstashを使って、CSVデータをElasticSearchにロード


    3.GAEから、ElasticSearchに検索クエリーを発行して結果を取得

2019/07/27

GCP: Iphoneから、端末位置情報をIoT分析環境に送信する -- python, GCP, IoTcore

Goal: 「IoTデータ分析環境立ち上げ on GCP」の環境に対して、Iphoneから位置情報データをPushするサンプル。Iphoneをエッジ端末として活用して、色々できそう。

How 

0. 前準備 Pythonista関連
   a)Pythonista のインストール
   https://apps.apple.com/jp/app/pythonista-3/id1085978097
   b)Gitを使いたかったら、stashをインストール
   https://github.com/ywangd/stash
   c)説明サイト ググったらたくさんあると思いますが、私は、以下のリンクを参照させていただきました。ありがとうございました。
   http://hitoriblog.com/?p=42145#Python-5




1. Pythonista を使って、端末の位置情報、スピード等を取得する
  a)Iphone上で、位置情報などを確認してみる




2. GCPのPub/Subにパブリッシュする。これの詳細は、前出のブログを参照

   a)GCP提供のサンプルプログラムをベースに追加加工する。

      https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/iot/api-client/mqtt_example
   をローカルPCにクローンして、Pythonの環境などをセットする。
   cloudiot_mqtt_example.pyをベースに変更を加えたものが以下。



 
   

2018/12/16

GCP: IoTデータ分析環境立ち上げ on GCP

Goal:ローカルPCをIoTGateway端末と見立てて、Bigqueryに、気温データをストリーミングインサートする。利用するサービスは、IoT Core --- Pub/Sub --- Dataflow --- Bigquery と連係する。
Gateway側には、データをPushする処理が必要だが、それ以外は、コーディング不要!

How
0. 準備:仮想IoTGateway として、気温/計測時間/デバイスIDを送るプログラムを作成
https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/iot/api-client/mqtt_example
をローカルPCにクローンして、Pythonの環境などをセットする。
cloudiot_mqtt_example.py を加工。変更箇所は、以下の通り。


1. Pub/Subのトピックを作成
(1)APIを有効にする
(2)トピックを作成する
トピックとは、メールボックスみたいなもの




2. デバイスをIoT Coreに登録する
(1)APIを有効にする
(2)端末レジストリを作成する
端末レジストリとは、デバイスのグループを作成すること
トピックの選択が必要。1で作成したトピックを選択する。
そうすると、この端末レジストリ内のデバイスから送られてきたメッセージは、そのトピックに投げ込まれる。
(3)端末を作成する(デバイスを登録する)
公開鍵の登録は一旦せずにデバイスを作成する。
公開鍵の種類は、 RS256_X509 とする。


3. 認証鍵の作成と登録
(1)デバイス側で、Google root certificate を取得する
wget https://pki.goog/roots.pem
あるいは、
curl https://pki.goog/roots.pem > roots.pem
で取得する
(2)鍵のペアを作成する
openssl req -x509 -newkey rsa:2048 -keyout rsa_private.pem -nodes -out rsa_cert.pem -subj "/CN=unused"
(3)公開鍵を、IoT Core のデバイスに貼り付ける
(4)private key は、ローカルマシンに保存

4. サブスクライバーのを登録する
デバイスが、パブリッシャーなので、そのトピックの購読者を登録する。
ここでは、Bigqueryにセンサーの値を書き出すので、エクスポート機能を使う。
登録すると、自動的にCloud DataflowのJobが立ち上がる。
(1)Bigqueryに、データを登録するためのテーブルを登録する

(2)トピックのエクスポート登録を行う





5. テスト実行!!
デバイスを稼働させて、データがBigqueryに流れ込むのを確認する。


$ python iotdemo.py --cloud_region=us-central1 --project_id=iotdemo1 --algorithm=RS256 --private_key_file=rsa_private.pem --registry_id=demo-reg --device_id=iotdemo



Bigquery側は。。。。
成功!!
実に簡単に、分析環境の構築が可能。

2018/11/18

GCP: Cloud Shell上でのサンプルコマンド

備忘録
Cloud Shell上でのオペレーション

### Storageの操作
### GCE関連、Snapshotの作成

2018/10/14

GCP: Google App EngineのランタイムPython3.7を使ってみる2 -- Rest API

前回メモ(hello world with Python3.7)の続編。Restサービスの立上げ。
App Engine APIs が使えなくなっているので、代わりにGCPのPython用のライブラリを使う。(例えば、Datastoreの読み書きにndbは使えない。)

  • Goal
    GAE(Google App Engine) + python3.7ランタイム上にREST API(メソッドはPOST)を作成する。
    APIが呼び出されたら、GCP(Google Cloud Platform)のDatastoreに新規Entity(レコード)を追加する。
  • case
    名前、点数、教科名をjsonでPOSTしたら、GCPのDatastoreに書き込みして、Keyを返信する。
  • How
    1. 開発前準備
    1)開発環境に、google-cloud-datastoreをインストール
    2)
    GOOGLE_APPLICATION_CREDENTIALS 環境変数を設定
    あくまで、ローカルでテストするために必要。
    以下コマンドを打つと、betaコンポーネントのダウンロードを聞かれる。
    「Y」を入力すると、ダウンロードされて環境変数の設定までしてくれる。
    $ gcloud beta auth application-default login

    2. requirements.txt の中身。google-cloud-datastoreも追加すること。



    3. main.py の中身。


  • Result --- curlのサンプルと結果
    Toshiのhistoryが67点


    $ curl -i -H "Content-Type: application/json" -X POST -d '{"name":"toshi","points":67,"subject":"history"}' https://.appspot.com/addtest
    HTTP/2 201 
    content-type: application/json
    x-cloud-trace-context: 4140694e3538666bb96627febc6130e4;o=1
    date: Sun, 14 Oct 2018 14:08:21 GMT
    server: Google Frontend
    content-length: 35
    alt-svc: quic=":443"; ma=2592000; v="44,43,39,35"
    {"result":{"id":5635703144710144}}



GCP: Google App EngineのランタイムPython3.7を使ってみる1 -- Hello World

GAEのStandard Environment に、Python3のランタイムがbeta版でリリースされていたので使ってみる。SecondGenerationというらしい。OPENCVかPillowが使えるかどうか?までテストする予定。まずはHello Worldまで。
https://cloud.google.com/appengine/docs/standard/python3/
  • Goal
    GAEのStandardEnvironmentにおいて、Python3.7のランタイムを使ってHelloWorldする。
  • How
    1. app.yaml, main.py, requirement.txt を用意する。サンプルは以下。
      https://github.com/pumpkinpietea/py37.git
    $ ls -lt
    total 32
    -rw-r--r--@ 1 Toshi_Admin  staff  817 Oct 14 11:22 app.yaml
    -rw-r--r--  1 Toshi_Admin  staff  101 Oct 14 10:08 README.md
    -rw-r--r--@ 1 Toshi_Admin  staff  956 Oct 14 01:17 main.py
    -rw-r--r--@ 1 Toshi_Admin  staff  197 Oct 14 00:11 requirements.txt
    2. ローカルでテスト
         $ pip install -r requirements.txt
         $ python main.py
    3. deploy

          $ gcloud app deploy ./py37/app.yaml


  • Comment
    1. libフォルダーに、pip -t でインストールは不要。逆にすべてrequirements.txtに記入する必要がある。
    2. ローカルテスト用のdev_appsever.py は、使えない。
      逆に普通に、local で実行すればよい。便利になった!
    3. deploy は、gcloud コマンドで実施が必要、appcfg.py は、使えない。
    4. 普通のpython3をそのままGAE上で動かす事を狙っているようなので、Cとかのライブラリも動くと思われる。別途テスト予定。

2018/09/02

GCP: GCP外のサーバーからDatastoreへデータをインポートする(GCPのKeyを使う場合)

  • Goal
    タブ区切りのテキストファイルをローカルマシン(OR AWSのEC2でも同じ)GCPのDatastoreにインポートする。pythonのプログラムで実施。

    前のPOSTのKeyを自分で設定しないバージョン

  • Case
    以下のようなテキストファイルを、Datastoreにインポートする。
    想定するのは、DatastoreをGAEのマスタのように利用していて、バッチで更新をするようなケース。keyは、GCPで自動設定されるKeyを使う。
    list.txtの中身(タブ区切り)
    id     shimei   score
    1234   山田      89
    2341   田中      90
    1238   佐藤      81

  • How
    1.GCPのコンソールで、Service Account Keyを作成する
     形式は、JSON
     権限は、DatastoreのOwner(これは、Import&Exportでも良いのかも?)
     作成された、JSONはローカルマシンのどこかに設置する。
    2.Google cloud datastore のクライアントライブラリをインストールする。
     ~$ pip install google-cloud-datastore
    3.pythonのプログラムでインポートする。
      ##utf-8に変換⇒Unicodeに変換して、インポートすること!
       あとで、Pythonから呼び出しをする事を想定している。


  • Result

GCP: GCP外のサーバーからDatastoreへデータをインポートする(keyを自分で設定する場合)

  • Goal
    タブ区切りのテキストファイルをローカルマシン(OR AWSのEC2でも同じ)GCPのDatastoreにインポートする。pythonのプログラムで実施。
    Keyは自分で設定したい。

    Keyを自分で設定する必要がない場合はこちら
  • Case
    以下のようなテキストファイルを、Datastoreにインポートする。
    想定するのは、DatastoreをGAEのマスタのように利用していて、バッチで更新をするようなケース。id をKeyとして登録したい。
    list.txtの中身(タブ区切り)
    id     shimei   score
    1234   山田      89
    2341   田中      90
    1238   佐藤      81
  • How
    1.GCPのコンソールで、Service Account Keyを作成する
     形式は、JSON
     権限は、DatastoreのOwner(これは、Import&Exportでも良いのかも?)
     作成された、JSONはローカルマシンのどこかに設置する。
    2.Google cloud datastore のクライアントライブラリをインストールする。
     ~$ pip install google-cloud-datastore
    3.pythonのプログラムでインポートする。
      ##utf-8に変換⇒Unicodeに変換して、インポートすること!
       あとで、Pythonから呼び出しをする事を想定している。


  • Result

2018/08/15

GCP: gcloud のバージョンアップ時のエラーと解消方法 on Windows Subsystem for Linux


  • GAEのFlexible environmentを利用するにあたり、コンソール画面でデプロイしたソースを見れるようにするには、gcloudを195以上にしないと駄目らしい。
  • 188から最新版にUPDATEしようとしたら、エラーが出たので経緯と対応手順メモ
  • 開発環境は、Windows10+Bash on windows(Ubuntu 16.04.3)

以下、ログ

~#
gcloud components update
# 普通にアップデートしようとしたら以下のエラー
ERROR: (gcloud.components.update)
You cannot perform this action because the Cloud SDK component manager is disabled for this installation. You can run the following command to achieve the same result for this installation:
sudo apt-get update && sudo apt-get --only-upgrade install kubectl google-cloud-sdk google-cloud-sdk-datastore-emulator google-cloud-sdk-pubsub-emulator google-cloud-sdk-app-engine-go google-cloud-sdk-app-engine-java google-cloud-sdk-app-engine-python google-cloud-sdk-cbt google-cloud-sdk-bigtable-emulator google-cloud-sdk-app-engine-python-extras google-cloud-sdk-datalab

~# sudo -E apt-get update
# 私の環境では −E が必要
Hit:1 http://archive.ubuntu.com/ubuntu xenial InRelease
Get:2 http://packages.cloud.google.com/apt cloud-sdk-xenial InRelease [6,372 B]
Err:2 http://packages.cloud.google.com/apt cloud-sdk-xenial InRelease
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FB
(省略)
Reading package lists... Done
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: http://packages.cloud.google.com/apt cloud-sdk-xenial InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FB
(省略)
# よくわからないけど、Public Key が使えないとかなんとか。。。
# Google Groupsのトピによると、以下でKeyを追加せよとのこと

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1326  100  1326    0     0   2062      0 --:--:-- --:--:-- --:--:--  2062
OK

# 再トライ 
~# sudo -E apt-get update
Get:1 http://packages.cloud.google.com/apt cloud-sdk-xenial InRelease [6,372 B]
Hit:2 http://archive.ubuntu.com/ubuntu xenial InRelease
Get:3 http://packages.cloud.google.com/apt cloud-sdk-xenial/main amd64 Packages [45.3 kB]
Hit:4 http://archive.ubuntu.com/ubuntu xenial-updates InRelease
Get:5 http://security.ubuntu.com/ubuntu xenial-security InRelease [107 kB]
Fetched 158 kB in 1s (84.8 kB/s)
Reading package lists... Done

# うまくいった
# つづいて、SDKのUPDATE 余計なパッケージ名もあるけど、そのまま実行

~# sudo -E apt-get --only-upgrade install kubectl google-cloud-sdk google-cloud-sdk-datastore-emulat
or google-cloud-sdk-pubsub-emulator google-cloud-sdk-app-engine-go google-cloud-sdk-app-engine-java google-cloud-sdk-app
-engine-python google-cloud-sdk-cbt google-cloud-sdk-bigtable-emulator google-cloud-sdk-app-engine-python-extras google-
cloud-sdk-datalab
Reading package lists... Done
Building dependency tree
Reading state information... Done
Skipping google-cloud-sdk-app-engine-go, it is not installed and only upgrades are requested.
Skipping google-cloud-sdk-app-engine-java, it is not installed and only upgrades are requested.
Skipping google-cloud-sdk-app-engine-python, it is not installed and only upgrades are requested.
Skipping google-cloud-sdk-app-engine-python-extras, it is not installed and only upgrades are requested.
Skipping google-cloud-sdk-bigtable-emulator, it is not installed and only upgrades are requested.
Skipping google-cloud-sdk-cbt, it is not installed and only upgrades are requested.
Skipping google-cloud-sdk-datalab, it is not installed and only upgrades are requested.
Skipping google-cloud-sdk-datastore-emulator, it is not installed and only upgrades are requested.
Skipping google-cloud-sdk-pubsub-emulator, it is not installed and only upgrades are requested.
Skipping kubectl, it is not installed and only upgrades are requested.
The following package was automatically installed and is no longer required:
  snap-confine
Use 'sudo apt autoremove' to remove it.
Suggested packages:
  google-cloud-sdk-app-engine-java google-cloud-sdk-app-engine-python google-cloud-sdk-pubsub-emulator
  google-cloud-sdk-bigtable-emulator google-cloud-sdk-datastore-emulator kubectl
The following packages will be upgraded:
  google-cloud-sdk
1 upgraded, 0 newly installed, 0 to remove and 155 not upgraded.
Need to get 19.2 MB of archives.
After this operation, 28.8 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://packages.cloud.google.com/apt cloud-sdk-xenial/main amd64 google-cloud-sdk all 212.0.0-0 [19.2 MB]
Fetched 19.2 MB in 11s (1,652 kB/s)
(Reading database ... 50185 files and directories currently installed.)
Preparing to unpack .../google-cloud-sdk_212.0.0-0_all.deb ...
Unpacking google-cloud-sdk (212.0.0-0) over (188.0.1-0) ...
Processing triggers for man-db (2.7.5-1) ...
Setting up google-cloud-sdk (212.0.0-0) ...

# 完了 
~# gcloud --version
Google Cloud SDK 212.0.0
alpha 2018.08.13
beta 2018.08.13
bq 2.0.34
core 2018.08.13
gsutil 4.33