クラウドインフラ構築記

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

2023年6月25日
から hiruta
Amazon CodeWhispererセットアップしてみました。Identify Center 編 はコメントを受け付けていません

Amazon CodeWhispererセットアップしてみました。Identify Center 編

AWS Dev Day 2023のGeneral Sessionでも触れられて、Reject Dayでも、Dev Day のCFPに使っているスクリプト、ほぼCodeWhisperer でコード作成しているなど、注目のプロダクトです。

Github Copilot、Duet AI for code assistance などCode Generateがでています。

Organizations 配下のAWSアカウントでは、単独ではセットアップできない。

Oraganizationsの管理アカウントから有効化する必要があります

ユーザに紐付いたら、IAM Identify Centerのポータルに下記が追加されます

ここからは、Visual Studio Code(以下VSCode)側の作業になります。

前提として、AWS Toolkit拡張がインストールされていることが前提になります。

VSCodeから、AWS IAM Identify Centerに接続

Identify Center URL

リージョン選択

IAM Identify Centerのリージョンを選択

VSCodeの通知ウィンドウに、コードが表示されます

表示されたコードをブラウザの下記に入力

AWS Toolkitからアクセスを許可

これでCodeWhispererガ利用できます。

awk も対応しているようです。

# awk filter for test file
# Usage: ./test.sh < test.txt
awk '

BEGIN {
    # Set the field separator to a comma
    FS=","

    # Set the output field separator to a comma
    OFS=","

    # Set the output record separator to a newline
    ORS="\n"

    # Set the input record separator to a newline
    RS="\n"
}

{
    # Print the first field
    print $1
}

END {
    # Exit with a success error code
    exit 0
}

2023年6月17日
から hiruta
一番安価なCloudflare RegistrarにGoogle Domainsからドメイン移管してみました。 はコメントを受け付けていません

一番安価なCloudflare RegistrarにGoogle Domainsからドメイン移管してみました。

Google DomainsがSquarespaceに事業譲渡されるアナウンスがありました。

https://support.google.com/domains/answer/13689670?sjid=4934868726297743719-AP

想定する移行先の年間料金
TLD .bizの場合

Cloudflare Registrar $13.68
Google domains $15
Route53 19.00 USD
さくらインターネット 3,340円 = $23.55 ※1$ = ¥141.84で換算

上記で一番安価なCloudflare RegistrarにGoogle DomainsでホストしているドメインをTransferしてみました。

https://www.cloudflare.com/products/registrar/

移管元で、Privacy、Transfer lockしている場合は解除しておく。

移管手続きの流れ

Cloudflare accountを作成

(https://dash.cloudflare.com/sign-up)
cloudflareのBillingでPayment info情報を登録

Websitesの作成

移行元のホストゾーンに登録している情報をCloudflareのDNS Recordsに追加してくれる

Cloudflare Nameservers情報を移行元のNSに追加

Cloudflare Namerserversが認識されたら、移行元のNS情報を削除

(反映されるまで数時間かかる。)

下記表題のStatus Activeになった旨のメールが届く

[Cloudflare]: xxxxxx is now active on a Cloudflare Free plan

Domain Registration のTransfer Domainsから移行手続きがおこなえるようになります。

移行元で取得しておいたauthorization codeをいれる

Transfer request受け付けたメールが届く

Your transfer to Cloudflare Registrar is underway

Google Domains からの移管リクエストを確認する

移行元(この場合、Google Domains)から移管リクエストを承認するメールが届くので下記表題のメール文中に記載されている移管をキャンセルまたは承認リンクで承認する

承認したあとでCloudflareから購入がクレジットカードからチャージされた旨のメールが届く。

Your Cloudflare Purchase Confirmation

Transfer完了のメールが届き、移管完了となります。

Your transfer to Cloudflare Registrar has completed!

所感

defaultでWHOIS privacyに対応している。

Proxiedというモードだと、originのIPアドレスを隠蔽するが、wp-login.phpでTOO MANY REDIRECTとリダイレクトループでエラーになってしまっているので、現状DNSに戻しています。

こちらの設定をすることで解消。

https://developers.cloudflare.com/ssl/troubleshooting/too-many-redirects/

What is the difference between “Proxied” and “DNS Only”?
https://community.cloudflare.com/t/what-is-the-difference-between-proxied-and-dns-only/173310

Cloudflare REgistrar and WHOIS privacy
https://community.cloudflare.com/t/cloudflare-registrar-and-whois-privacy/36225

Request Cloudflair Registrar To Support .Dev Domain
https://community.cloudflare.com/t/request-cloudflair-registrar-to-support-dev-domain/330897

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等のロード処理で使ったりすると、マスキングしたデータができるので、本番そのまま検証に
もっていけないとかの場合に有益かと思います。