クラウドインフラ構築記

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

2024年6月3日
から hiruta
THE CLOUD RUN書籍レビュー #技術書典 はコメントを受け付けていません

THE CLOUD RUN書籍レビュー #技術書典

技術書典で購入しましたCloud Run書籍レビューです。

https://techbookfest.org/product/jQP5REJPx6pwMFEyx8QHPN

第1章 Cloud Runとは

ECS Fargate、App Runner、Cloud Runを比較して、Cloud Runの構成シンプルさ、スケールで軍配があがることが書かれている

ECS Fargateのターゲット追跡、ターゲットトラッキングについて書かれていますが、ターゲット追跡以外に、ステップスケーリングの手段もあります。ステップスケーリングだと、CPU負荷等が高まったときにタスク数を複数増やせますが、リクエストをうけつけるまで2〜3分のラグはあるので、スパイクには耐えられない。

第2章 とりあえず触ってみよう

Cloud Run serviceを、Google Cloudのコンソールから作る方法について書かれています。

第3章 Cloud Runによるシステムデザイン

Cloud Run serviceを、Google Cloudのコンソールから作る方法について書かれています。

 

第3章 Cloud Runによるシステムデザイン

 

すべてのCloud Runは、HTTPのエンドポイントを持ちます。

Cloud TaskもHTTP EndpointでCloud Run エンドポイントを叩くことも可

 

一例として、Google WorkflowはHTTP エンドポイントをつなぎ合わせてワークフローを構成できる。

https://cloud.google.com/blog/ja/products/serverless/announcing-direct-vpc-egress-for-cloud-run

 

認証を利用して、特定Service Accountからの通信のみ許可することも可能。

Serverless VPC Connectorの欠点を網羅した、Direct VPC EgressでVPC内部通信も可能。

 Direct VPC Egressのmax instanceのQuotaに注意。

Cloud SQLへの通信、Auth Proxyで、TLSで暗号化できるとはいえ、データベース側がパブリックIP付与するので、データベースパブリック露呈してくなければ、Direct VPC Egressでプライベート通信がいいように思えます。

第4章 プロダクションレディな設計

サービスアカウントキーが漏洩したら、セキュリティ事故に繋がる可能性があるので、キー発行はせず、github actionからGoogle Cloudのサービスにアクセス手段は、Workload identify Federationを推奨。

Cloud Deployは、Skaffoldをベースにしたツールなので、Cloud Runだけでなく、GKEへのデプロイにも対応しています。

Cloud loggingからLog SinkでCloud Storageにも送ることガ可能

Cloud Run serviceには、Compute Engineのデフォルトサービスアカウントが付与されますが、Cloud Run serviceごとにService Acccountを分けたほうがいい。AWSだと、IAM Roleに相当します。

コンテナセキュリティについては、Cloud Runだけでなく他のGoogle Cloudのコンテナサービスにも応用できると思います。

コンテナのCPU負荷は60%前後を維持するのがよさそうか。

Cloud DeployでCPU Brustなどを定義するには、annotationsを定義します。

https://cloud.google.com/run/docs/reference/yaml/v1

Cloud Runに関することが設計思想をふくめて、もりだくさんに書かれている書籍になります。

2024年6月2日
から hiruta
Anthropic Claude 3でのTool useについて はコメントを受け付けていません

Anthropic Claude 3でのTool useについて

Anthropic Claude 3で、VertexAIやBedrockでも、Tool use (Function calling) つかえるようになりました、

https://docs.anthropic.com/en/docs/tool-use

 anthropic 0.28.0 

知りたい地区の天気をLLMに聞くと,locationを返して、Google GenCode API, openweathermap APIで現在の天気を返せるものがサクッと作れるようになりました。

from anthropic import AnthropicVertex
import requests
import json

def main():
    LOCATION = "us-central1"

    client = AnthropicVertex(region=LOCATION, project_id="xxxxxxx")
    response = client.messages.create(
        max_tokens=1024,
        tools=[
        {
            "name": "get_weather",
            "description": "Get the current weather in a given location",
            "input_schema": {
            "type": "object",
            "properties": {
                "location": {
                "type": "string",
                "description": "The city and state, e.g. San Francisco, CA"
                }
            },
            "required": ["location"]
            }
        }
        ],
        messages=[{"role": "user","content": "柏の天気を教えて?"}],
        model="claude-3-haiku@20240307",
    )
    #  print(message)
    print(response.content[-1].input)

    payload = {'address': response.content[-1].input['location'], 'key': 'xxxxxxxxxxxxxxxx'}
    r = requests.get('https://maps.googleapis.com/maps/api/geocode/json', params=payload)
    # print(r.text['results'][0].geometry.location)
    d=json.loads(r.text)
    loc = d['results'][0]['geometry']['location']
    print(loc)
    # curl "https://api.openweathermap.org/data/3.0/onecall
    payload2 = {'lat': loc['lat'], 'lon': loc['lng'], 'lang': 'ja',  'appid': 'xxxxxxxxxxxxxxxxxx'}
    r2 = requests.get('https://api.openweathermap.org/data/3.0/onecall', params=payload2)
    d2 = json.loads(r2.text)
    print(d2['current']['weather'])
if __name__ == "__main__":
    main()
 {'location': '柏, 千葉'}
{'lat': 35.8675958, 'lng': 139.9757575}
[{'id': 500, 'main': 'Rain', 'description': '小雨', 'icon': '10d'}]

 

2024年6月1日
から hiruta
Search Engineering Tech Talk 2024 Springに参加してきました。受講レポート #searchtechjp はコメントを受け付けていません

Search Engineering Tech Talk 2024 Springに参加してきました。受講レポート #searchtechjp

Search Engineering Tech Talk 2024 Spring #searchtechjp

https://search-tech.connpass.com/event/318126/

RAG改善からみたクエリ・ドキュメント理解とリランキング(FRAIM株式会社 水野多加雄 さん)

 

  • 適切なドキュメントが根拠の上位にこない
  • 同じキーワードが含まれる関係のないドキュメントがランクイン
  • ユーザのクエリ意図に合った回答ができていない
  • 用語定義を聞いているのに、関連のオペーレーション方法をかえしてしまう

の課題にたいして、どう改善するコトについての話

  • SetFit
  • Reranking
    • japanese-reranker Cross-Encoder ベースモデルを日本語データセットJSQuAD等を用いて学習したもの

自然言語処理シリーズ-2 質問応答システム
質問応答タスクの分析が詰め込まれている。RAG改善のヒントになれそう
https://www.coronasha.co.jp/np/isbn/9784339027525/

文書登録時のチャンク、メタデータでドキュメントを絞り混むことが大事になる。

MongoDB Atlas Search, Vectorsearchの紹介、デモ (MongoDB Singapore 林田千瑛 さん)

MongoDB Atlas Searchの特徴の説明がありました。

データベース、検索エンジンが分離されていると、同じデータだけどOLTPと検索を二重持ちデータ同期も複雑。パイプラインの開発も必要
レイテンシー劣化も起こる

MongoDB は、3つのシステムを1つに集約データの同期も必要ない
セキュリティも安全

MongoDBトは別にAtlas ノードがある
インデックス更新も同時にされり

20240320 MLOps勉強会 v39
https://www.youtube.com/live/x24JCS-XLGU?si=Bs7IgxIPcZiHeB-X&t=584

検索失敗率のモニタリングから改善まで (株式会社ユーザベース 崔 井源 さん)

検索しても記事や動画を開かず離脱したものを検索失敗している
ここをモニタリング

プッシュ通知の文言で検索して失敗
既存は公開日順なので古い記事はなかなかでない

検索キーワードとして登録
通知されたコンテンツをアプリでみつけるのが難しいので検索ホーム
ラインキングロジックを改善
公開してからの経過日数、人気度合いをバランス良く考慮
重みを元に

Elasticsearchでトークンのオフセットがズレるバグについて (株式会社LegalOn Technologies 神田 峻介 さん)

Lucene.Elasticserach Character Filer
ユニコード正規化するとトークンのオフセットに不正の値が入るバグ
頻繁におきるものではない

Doc Character Filter TokenizerToken Filterで登録される
ユニコード正規化、形態素解析、ストップワード除去など

start_offsert
end_offset

平成が人文字の一個のunicodeとして
空文字列として認識してしまう

CharFilter offsets correction is wonky https://issues.apache.org/jira/browse/LUCENE-6595

対象外にしても、0.12%と検索結果への影響は少なそう

char_filter
unicode_set_filter https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-icu-normalization.html

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は指定できるオプションは見つけられないようです。