クラウドインフラ構築記

現在AWSの構築支援に携わっております。今注視しているのは、GKE、BigQuery、Google Dataflowなどサービスを展開しているGoolge Cloud Platformです。

2023年6月11日
から hiruta
Kendra HANDS-ON 参加レポート はコメントを受け付けていません

Kendra HANDS-ON 参加レポート

はじめに

6/10(土)に開催された「JAWS-UG横浜 #58 Amazon Kendra HANDS-ON」を参加しました。

Kendraの基礎的説明をAWS関谷様から説明していただき、下記ブログ記事をベースに、streamlit + OpenAI & Kendra のアプリを作成するハンズオンでした。

https://aws.amazon.com/jp/blogs/news/quickly-build-high-accuracy-generative-ai-applications-on-enterprise-data-using-amazon-kendra-langchain-and-large-language-models/

イベントページ

https://jawsug-yokohama.connpass.com/event/279141/

kendra とは

kendra 、ML coreも含まれていて、セマンティック検索も行えて、$1,008/month(Enterprice edition)はコストパフォーマンスはいいのでは。

$810のDeveloper Edtion もあり

説明の資料は公開されないので、kendraについては詳しそう

ハンズオン

streamlintを利用して、便利なオープンソースのアプリフレームワークで、簡易なChatアプリを作れます。

LLMsとして、OpenAIを利用したので、Flan-T5-XL、Flan-T5-XXLのモデルをSageMaker Studio Jump Startからデプロイすることはなかったが、これらのモデルをデプロイするのに、ml.g5.2xlarge 、ml.g5.12xlargeを使うようで、これらのインスタンスタイプは、デフォルトは、Quota 0でデプロイできないので、Quota requestが必要。

OpenAIのFree Trial Userはたたけますが、三ヶ月経過した無料アカウントではAPIたたけなくなります。

https://help.openai.com/en/articles/4936830-what-happens-after-i-use-my-free-tokens-or-the-3-months-is-up-in-the-free-trial

本家のOpenAIを利用しますが、AzureOpenAIを使うのは、下記のように変更することで対応できます

openai.api_type = "azure"
openai.api_base = "https://xxxxxx.openai.azure.com/"
openai.api_version = "2023-03-15-preview"
openai.api_key = OPENAI_KEY

def generate_response(input_text):
  llm = AzureOpenAI(
    deployment_name="text-davinci-003",
    model_name="text-davinci-003", 
    openai_api_base=openai.api_base,
    openai_api_version=openai.api_version or "",
    openai_api_key=openai.api_key or "",
)

補足

SageMaker Studio domainの削除は、下記にはManagement consoleから削除できるようになっているが、削除する項目が見つからなかった。

AWS CLIでは削除するようになります。

https://docs.aws.amazon.com/sagemaker/latest/dg/gs-studio-delete-domain.html

Kendra、Connectorで、S3、Google Driveなどのデータも検索対象にすることが可能。インデックス作成に多少時間がかかる

2023年1月2日
から hiruta
2022年の振り返りと2023年の抱負記事 はコメントを受け付けていません

2022年の振り返りと2023年の抱負記事

2020から更新されてなかった個人ブログにリセットの意味で2022年の振り返りと2023年の抱負記事を投稿します

 

2022年の仕事

技術スタックとしては、Computeとして、Fargate、キャッシュ層として、ElasitCacheAPI層として、API Gateway、サービス間通信は、サービスメッシュとして、AppMeshCloudMapを活用して、AWS CDK によるインフラ構築を主に行ってきた。

12月に上記基盤を使ったものをサービスインできた。

サービスの制約等があり、理想な構成にはなっていないところもあり(メッシュからEgress通信制御、Prometheus

 

参加オフラインイベント

Innovators Hive at Google Cloud Next’22

Google Cloud Next’22の最後の日に招待制のイベント。2022年は主にオンラインイベントでしたが、ひさしぶりのオフラインイベントでした。

KubeDay

Sidecarless Ambient MesheBPFPodSecrurityStandardkyvernoのセキュリティについて気になった

 

登壇LT)

awsCustomResourceAurora Serverless v2リソースを作成してみた

https://docs.google.com/presentation/d/1uhI_LKlp_J2twNoLxHwByClsMIJ4fW-worZhHr6BBBs/edit?usp=sharing

上記作成した当時は、AWS CDK L1 Constructsすらまだ対応しておらず、

AWS Custom Resourceを利用して作成した発表資料になります。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.custom_resources-readme.html

技術検証

GKE Autopilot

当ブログもGKE Autopilot + HTTPS Load Balancer + CloudSQL MySQL 5.7で作られています。

ECS Service Connect

ECS Service間でFastAPI で実装したアプリで動作確認した環境を作れます。

https://github.com/clouddev-code/ecs-service-connect-demo.git

上記で利用しているアプリは、Backgroundなタスク(スリープ60s) なものを実行するアプリで確認

https://github.com/clouddev-code/fastapi-sample.git

Django grpc framework

https://github.com/fengsp/django-grpc-framework

Django gRPCなサービスの環境をつくり、検証中

2023年に向けて

Cloud nativeな技術をつかいこなせるようにする

istioPrometheusgRPC

海外カンファレンスへの参加

https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/

2020年5月6日
から hiruta
モジュール化したpythonのコンテナイメージ化について はコメントを受け付けていません

モジュール化したpythonのコンテナイメージ化について

python で、モジュールをパッケージにするケースがあります。

  • example
    • Dockerfile
    • setup.cfg
    • setup.py
    • example
      • __init__.py
    • main.py

まずは、モジュール化に必要なファイルの作成。setup.cfg、setup.py、__init__.py

モジュール化するスクリプトを作成。greetという関数で、Hello World!を出力するだけの簡単なものになります。

# -*- conding: utf8 -*-
__version__ = '0.0.1'
def greet():
print('Hello World!') 

setup 設定ファイル。

[metadata]
name = example
version = attr:example.__version__
author = Your Name
author_email = your-email@example.com
description = example is a example package
url = http://example.com/your/project/page
license = Apache License, Version 2.0
classifier =
Development Status :: 1 - Planning
Programming Language :: Python :: 3.6

[options]
zip_safe = False
packages = find:

pipは、setup.pyの記述でインストールを行うので、setup.pyを作成します。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

from setuptools import setup

setup()

Dockerイメージで、モジュール化した関数を呼び出すpythonスクリプトを作成します。


import example

if __name__ == '__main__':
example.greet() 

最後に、Dockerfileを作成


FROM python:3.7.3

WORKDIR /app
COPY ./setup.py /app
COPY ./setup.cfg /app
RUN mkdir /app/example
COPY ./example/ /app/example/
RUN pip install -U .

COPY main.py /app
CMD ["python", "main.py"]

Dockerイメージをビルドを行い、

 docker build -t example .

イメージを実行すると、Hello World! が出力されれば成功です。

 docker run --rm -it example:latest 

 

2020年2月2日
から hiruta
Cloud Run full managed environementsでのTraffic Splitting #gcpja はコメントを受け付けていません

Cloud Run full managed environementsでのTraffic Splitting #gcpja

Cloud Run full managed environemntsでも、glcoud コマンドなら、できる返信いただき、試してみました。

( Cloud Run用Serverless VPCも優先度高く、対応中とのこと)

簡単な、python applicationで、試してみました。(チュートリアルにのっているものになります。)


import os

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
target = os.environ.get('TARGET', 'World')
return 'Hello  {}!\n'.format(target)

if __name__ == "__name__":
app.run(debug=True,host='0.0.0.0', port=int(os.environ.get('PORT', 8080))


FROM python:3.7

ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . .

RUN pip install Flask gunicorn

CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 app:app

最初に、latestリビジョンでアップロードします。

 gcloud builds submit --tag gcr.io/xxxxxxxx/hellowrld 

Cloud Runへデプロイ

 gcloud beta run deploy --image gcr.io/cxxxxxxxx/hellowrld 

わかりやすいように、上記pythonスクリプトで、Helloのところを、Helllo 2として別リビジョンでアップロード

 gcloud builds submit --tag gcr.io/xxxxxxxx/hellowrld:canary 

再度、Cloud Runにデプロイ。

 gcloud beta run deploy --image gcr.io/xxxxxxxx/hellowrld:canary 

gcloud alpha run deploy の、–no-traffic オプションで、次デプロイしたリビジョンへのトラフィックをこないように制御できるので、カナリアリリースようなことが、できそう。

リビジョンごとのトラフィックを下記コマンドで設定します。

 gcloud alpha run services update-traffic hellowrld --platform=managed --to-revisions=hellowrld-00003-hub=90,hellowrld-00001-kay=10 

マニュアルには、下記に記載。

https://cloud.google.com/sdk/gcloud/reference/alpha/run/services/update-traffic

 

コンソール上での表記

 

 

 

Billable container instance time でも割り振り状態は確認できます。

2019年11月10日
から hiruta
pyenv/virtualenv環境で、Cloud Codeを使うには はコメントを受け付けていません

pyenv/virtualenv環境で、Cloud Codeを使うには

Visual Stdio Codeに、ptyhonをpyenvの仮想環境で使う場合、ちょっと設定が必要になります。

Google Cloud SDKが一部サブコマンド、python3に対応していないものがあるので、python 2.7を使う必要がある、かつ別で、python 3系を使いたい場合があるので、pyenvでpythonバージョンを切り替えて使っている。

pyenv -m venvはpython3になるので、ptyhon2系はこちらで、python仮想環境を作ります。

 pyenv -m virtualenv .env 

activateの確認。

 . .env/bin/activate 

VS Codeに、Cloud Codeのプラグインをインストールします。

https://cloud.google.com/code/docs/vscode/install?hl=en

Cloud Codeのプラグインをインストールできましたら、setting.jsonを編集します。

(pythonプラグインも必要です。)

python.pythonPathに、pyenv -m virtualenvでインストールしたpython pathを指定、ポイントになるのは、python.terminalactivateEnvironment をオンにすることです。

 {
"python.pythonPath": "/Users/hiruta/.venv/bin/python",
"python.venvPath": "~/.pvenv",
"python.terminal.activateEnvironment": true
}

Cloud Codeで、GKE Clusterを作成することができますが、すべてのオプションには対応していないようです。

Enable Istio、Enable Cloud Run for Anthosはありますが、preemptible VM、custom vpcは指定できるオプションは見つけられないようです。

2019年6月16日
から hiruta
BigQueryによる可視化、そして ML – “BigQuery GIS + ML on government open data” #gcpja #gcpug はコメントを受け付けていません

BigQueryによる可視化、そして ML – “BigQuery GIS + ML on government open data” #gcpja #gcpug

BigQuery (BigQuery Geo Viz)を使って、Average Rent Percent Difference From Previous Yearの平均をDataprepでのデータマイニング
から、BigQuery Geo Vizへの可視化、BigQueryMLによる学習、推論まで書かれています。

https://medium.com/@williszhang/bigquery-gis-ml-on-government-open-data-2605ed9d2e8

ここでは、DataprepのReceipeについていくつかポイントを記載します。

 extractpositions col: {Facility Address} type: last count: 6 

Facility Addressに、”4733 BRADLEY BLVD CHEVY CHASE MD 20815″ と入っているが、
文字列のlast(最後末)を抜き出すときReceipe

Extract by positions
このfunctionsはスペースはカウントされないので、下記でトリムしてやる必要がある。

 textformat col: zipcode type: trimwhitespace 
 filter type: custom rowType: single row: ISMISMATCHED(zipcode, ['Zipcode']) action: Delete 

filter関数。vaildな値かどうかを判定して、rowを削除するかのアクションを設定することができる。

https://cloud.google.com/dataprep/docs/html/ISMISMATCHED-Function_57344747

このブログの例だと、Zip codeチェックに使用しています。
他にも、電話番号、E-Mail、クレジットカード、IPアドレス、URL、日付時間等のチェックができる。

Code Violations CSV. Wrangle recipe について

 drop col: {Date Assigned}: Drop 

としているが、BigQueryに登録するschemaで、Date_Assignedを指定しているので、Too many columneとなり怒られてしまう。


Code Violations CSV. Wrangle recipeから、”drop col: {Date Assigned}: Drop” をDelete(削除)することでbq loadできることは確認しています。

最終的にこんな感じになります。

Dataprep ML学習させる前に、イレギュラーなデータを除去できるDataprepの有益性を改めて実感。

2019年6月9日
から hiruta
Cloud Endpoints for Cloud Functions #gcpug #gcpja はコメントを受け付けていません

Cloud Endpoints for Cloud Functions #gcpug #gcpja

BackendのCloud FunctionsのAPI managementできる Extensible Service Proxy(以下ESP)が可能に。
Google Accountによる認証、JSSON Web Token (JWT)などをESPで担うこともできる。
また、Cloud Endpointsにて、Quota制御なども

https://cloud.google.com/endpoints/docs/openapi/get-started-cloud-functions

Stackdriver loggingに下記が記録されているので、runtime自体nginxが動いていると思われる。

 2019-06-09 12:07:55.420 JST
2019/06/09 03:07:55 [warn] 1#1: Using trusted CA certificates file: /etc/nginx/trusted-ca-certificates.crt

手順は上記で使えるようになります。
ESP用のRuntimeを、Cloud Runでデプロイするようになります。

 gcr.io/endpoints-release/endpoints-runtime-serverless:1.30.0 

ENDPOINTS_SERVICE_NAMEを上記Cloud RunにデプロイしたRuntimeの環境変数に設定しておく必要があるが、
「Getting Started with Endpoints for Cloud Functions」のドキュメントには下記記載となっているが、ドキュメントが古いのか、configuurations updateコマンドはない。

 gcloud beta run configurations update \
--service CLOUD_RUN_SERVICE_NAME \
--set-env-vars ENDPOINTS_SERVICE_NAME=YOUR_SERVICE_NAME 

下記のようにする必要があります。

 gcloud beta run services update CLOUD_RUN_SERVICE_NAME \
--set-env-vars ENDPOINTS_SERVICE_NAME=YOUR_SERVICE_NAME 

Cloud FunctionsのIAM Supportで、Extensible Service Proxyからのトラフィックのみ通すこともできるようになります。
(ただし、本機能はαユーザのみ使うことが可能)

 gcloud alpha functions add-iam-policy-binding FUNCTION_NAME \
--member "serviceAccount:ESP_PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role "roles/cloudfunctions.invoker" 

JSON Web Token (JWT)による認証で、service accountを使う例。

https://cloud.google.com/endpoints/docs/openapi/service-account-authentication

上記チュートリアル内で、roles/serviceAccountTokenCreaterを、service accountの権限に付与するのだが、gcloudだと以下エラーとなってしまう。
console上だと問題ないのだが。

 $ gcloud projects add-iam-policy-binding PROJECT_ID --member serviceAccount:hello-test@PROJECT_ID.iam.gserviceaccount.com --role roles/serviceAccountTokenCreater
ERROR: Policy modification failed. For a binding with condition, run "gcloud alpha iam policies lint-condition" to identify issues in condition.
ERROR: (gcloud.projects.add-iam-policy-binding) INVALID_ARGUMENT: Role roles/serviceAccountTokenCreater is not supported for this resource. 

JWT token認証スキップしようとすると、下記となり、バックエンド(Cloud Functions)に飛ばなくなります。

 {
"code": 16,
"message": "JWT validation failed: Missing or invalid credentials",
"details": [
{
"@type": "type.googleapis.com/google.rpc.DebugInfo",
"stackEntries": [],
"detail": "auth"
}
]
}

また、Auth0、Firebaseなどとも連携できます。
Using Firebase to authenticate users https://cloud.google.com/endpoints/docs/openapi/authenticating-users-firebase
Using Auth0 to authenticate users https://cloud.google.com/endpoints/docs/openapi/authenticating-users-auth0

JWT validationのサンプルは下記で公開されています。
https://cloud.google.com/endpoints/docs/openapi/service-account-authentication#python

2019年2月17日
から hiruta
Cloud Data Loss Prevention (DLP) APIをpython にて試してみました。 #gcpja #gcpug はコメントを受け付けていません

Cloud Data Loss Prevention (DLP) APIをpython にて試してみました。 #gcpja #gcpug

センシティブデータを検知、マスキングできるCloud Data Loss Prevention (DLP) APIを、pythonにて試してみた備忘録です。
Cloud DLP APIをおそらく、GCPしかなかったはず

まず、cloud DLP用のサービスアカウント作成します。

サービスアカウント作成

 gcloud iam service-accounts create dlp-api --display-name "dlp-api"

サービスアカウント用credentialsを発行

 gcloud iam service-accounts keys create ./key.json --iam-account dlp-api@xxxxxxxxxxxxxxxx.iam.gserviceaccount.com

dlp用の権限ロールを付与

 gcloud projects add-iam-policy-binding cms-production-1225 --member serviceAccount:dlp-api@xxxxxxxxxxxxxxxx.iam.gserviceaccount.com --role roles/dlp.user

gcloudで権限確認する場合は以下で。(gcloudでRequireされるpythonは2.7なので、DLPで必要なpythonとは差がある)

 gcloud auth activate-service-account --key-file key.json

Macとかローカル環境で試す場合は、環境変数にて

 export GOOGLE_APPLICATION_CREDENTIALS=../key.json

次に、Cloud DLP用のpyton moduleをインストール
https://googleapis.github.io/google-cloud-python/latest/dlp/index.html
Cloud DLPは、python 3.4以上をサポートしています。自分はpython 3.7.2で確認

https://googleapis.github.io/google-cloud-python/latest/dlp/index.htmlに記載しているサンプルコードそのままで動かなかった。上記サイトに記載しているサンプルは引数がAPIとは異なっているのが原因。ドキュメントのほうも更新してくれるといいのですが。

試したコードは以下になります。


from google.cloud import dlp_v2

client = dlp_v2.DlpServiceClient()

parent = client.project_path('xxxxxxxxxxxxxxxxxxx')
name = 'EMAIL_ADDRESS'
info_types_elements = {'name' : name }
info_types = [info_types_elements]
inspect_config = {'info_types' : info_types}

deidentify_config = {
'info_type_transformations': {
'transformations': [
{
'primitive_transformation': {
'character_mask_config': {
'masking_character': 'x',
'number_to_mask': 20
}
}
}
]
}
}
value = 'My email is not example@example.com , aaa@bbb.com , xxxx@xxxxx.co.jp '
items = {'value' : value }
response = client.deidentify_content(parent, deidentify_config,inspect_config, items)
print(response)

下記のようにメールアドレスをマスキングして出力してくれる。

 My email is not xxxxxxxxxxxxxxxxxxx , xxxxxxxxxxx , xxxxxxxxxxxxxxxx

取り込み時、Cloud Functions、Google dataflow等のロード処理で使ったりすると、マスキングしたデータができるので、本番そのまま検証に
もっていけないとかの場合に有益かと思います。

2019年1月20日
から hiruta
Stackdriver Trace for PHP で、wordpressサイトをモニタリングしてみました。 はコメントを受け付けていません

Stackdriver Trace for PHP で、wordpressサイトをモニタリングしてみました。

Performance insightツールである、Stackdriver Trace for PHPを自運営しているwordpress環境に
組み込んでみました。

別は下記を参照します。

https://cloud.google.com/trace/docs/setup/php

まず、OpenCensus extension をインストール
peclコマンドがない場合は、apt install php7.2-devにて入れます。(Ubuntu 18.04.1 LTSの場合)

opencensus-alphaは、php7以上でないとインストールできません。

次に、comoserコマンドにより、OpenCensus Stackdriver exporter composer packageをインストール
直下にvendorフォルダが作成されます。

wp-config.phpに、下記を書き込めばOKです。

 

 

 

 

 

 

 

 

 

 

( https://opencensus.io/api/php/integrating-wordpress/)

GCEインスタンスの場合、Cloud API access scopesにおいて、 Stackdriver Trace がアクセスできるようにしておく
必要があります。

2018年12月15日
から hiruta
CloudBuild 事始め はコメントを受け付けていません

CloudBuild 事始め

Container Builder 改め、CloudBuildについて、すこし試してみました。

CloudBuildの詳細についてはこちらです。
https://cloud.google.com/cloud-build/

CloudBuild用のコンテナを使って、CI処理を組んでいきます。対応ランタイムは下記となる。

Bazel、Curl、Docker、Dotnet、Gcloud、Git、Go、Gradle、Gsutil、Kubectl、Mvn、Npm、Wget、yarn

cloudbuild.ymlの例。Cloud Functionsのデプロイ例。Cloud Buildとリージョンちがくても問題はない。

 steps:
- name: gcr.io/cloud-builders/gcloud
args:
- "functions"
- "deploy"
- "http"
- "--entry-point=hello_test_http"
- "--region=us-central1"
- "--runtime=python37"
- "--trigger-http" 
 gcloud builds submit --config cloudbuild.yaml . 

権限周りではまったこを一点。

1度下記エラーがでたことがあった。

 Already have image (with digest): gcr.io/cloud-builders/gcloud
ERROR: (gcloud.beta.functions.deploy) ResponseError: status=[403], code=[Forbidden], message=[The caller does not have permission]
ERROR: build step 0 "gcr.io/cloud-builders/gcloud" failed: exit status 1

IAMの権限エラーによるものとなりますので、cloudbuildのserviceaccountに付与してやる必要がある

 gcloud iam service-accounts add-iam-policy-binding ${PROJECT}@appspot.gserviceaccount.com \
--member=serviceAccount:${NUM}@cloudbuild.gserviceaccount.com \
--role=roles/iam.serviceAccountUser --project=${PROJECT}

GCEインスタンスから、GCP APIを叩く場合も、同じく失敗することがあります。以前は大丈夫だったが、仕様が変更になったのか。