/// BANGBOO BLOG ///

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

June 21, 2023

Machine learning(Bigquery ML)
機械学習:
 マシーンラーニング、ML。マッシーンがLearnしデータの背景にあるルールやパターンを発鐔??する。
モデル・??
 機械学習における入力データに対して軆??果(出力)を蟆?き出す仕組み。モデルは入力されたデータを解析し、評萓?/判藹??を行った結果を出力として鐔??す。つまり、機械学習は「入カ・??モデル・??出力」から成る。

学軆??デー繧?
 モデルをつ縺?るために学習させるデー繧?
適用デー繧?
 モデルに対して臀??測を適用させるデー繧?
教師あり
 学軆??データに対して正解ラベルを付けて学習する方觸??
  例)驕?去縺?DMを送付した結果(目的変謨?)を用いて学習させる
教師ありは、回帰と分類縺?2つに分けられます。
 回蟶?(予测)
  連軆??する数値を予測するもので、売臀??、重驥?、温度などを算出する
 分類(識蛻?)
  データがどのクラスに藹??するかを予測するもので、販売商品が売れる見込縺?/売れない見込みなどに分類
  DMにおいては分類モデ繝?(買う・買繧?ないの鐔??蛻?)を使逕?

目的変謨?
 結果側の藹??謨?
 例)ある特藹??のカテゴリやブランドをその顧客が注文する
  ●確軆??(購入する・しない)
   ー学習データにターゲットフラ繧? (購入あり=1、購入無し=0)を立てる
   ー適用藹??に出て縺?る結果縺?0~1 (0%~100%) の軆??蝗?
  笳?金額
説譏?変謨?(特微驥?とも呼縺?) 
 藹??因側のデー繧?
 目的変数を予測するために使用する顧客の觸??々な情報、大き縺?分け縺?2種饅??
  ●顧客属諤?
   ー觸??莠?/個人臀??業主など臀??業形態、登録臀??所の郵便番号、業種コードな縺?
  ●購買履歴
   ー購雋? いつ、何を、どの縺?らい購入したか等の情蝣?
   ー各商品カテゴリ觸??の購入金額 etc.
質的変謨?
 数値で推し測ることができ、数藹??の大蟆?に諢?味をもつデー繧?
  (例)売臀??、購入回数、従業員数、DM送付回謨?
單的変謨?
 単に分類や種饅??を区別するためだけのデー繧?
  (例)都道府県、闌?種コード、購入有辟?

統鐔??手法
 重回帰分析:
  説譏?変謨?xが目的変謨?yの値を変化させます。そのため、説譏?変数から、目的変数の値を予測可能です。
 ロジスティック回蟶?
  yが1になる確軆??を判別します。い縺?つかの鐔??因(説譏?変謨?)から「2値の軆??果(目的変謨?)」が起こる確軆??を説譏?・臀??貂?
   2値の軆??果とは合譬?/不合格、採逕?/不採用など、答えが2つしかない場合を指し

線形回帰・??エクセル・??
 slope関数・??回帰直軆??の傾きを藹??得
 inercept関数・??回帰直軆??の切片を藹??得
 forecast関数・??単回帰分析からの推測値を藹??得
+++++++++++++

BigQueryを利用して觸??械学習を簡易に学びたいです。Webアプリのログよりサーバーエラーを予測するようなもので方觸??を教えて縺?ださい > BigQueryを利用して觸??械学習を学び、Webアプリのログからサーバーエラーを予測する方觸??について簡単に解説します。以臀??はその手順の觸??要です。

笳?ステップ1: データの觸??備
まず、WebアプリのログデータをBigQueryにインポートします。ログデータには、タイムスタンプ、リクエストの詳細、ステータスコード、エラ繝? メッセージなどの情報が含まれているはずです。

例:ログデータスキーマ server_log
timestamp: TIMESTAMP
request_id: STRING
status_code: INTEGER
error_message: STRING
user_agent: STRING
response_time: FLOAT

笳?ステップ2:データの前処理
エラーログの解析を容易にするために、データをクリーンアップし、特徴驥?を作成します。

CREATE OR REPLACE TABLE ds.cleaned_log AS
SELECT
timestamp,
status_code,
error_message,
user_agent,
response_time,
IF(status_code >= 500, 1, 0) AS is_error
FROM
ds.server_log
WHERE
timestamp BETWEEN 2023-01-01 AND 2023-12-31;

このクエリでは、ステータスコードが500以臀??のものをエラーと鐔??なし、is_error列を追加しています。

笳?ステップ3:特徴驥?エンジニアリン繧?
機械学習モデルに投入するための特徴驥?を作成します。例えば、以臀??のような特徴驥?を考えます。
-時間蟶? (hour)
-ユーザーエージェント (user_agent) 
-驕?去のエラーレート(past_error_rate)
窶?past_error_rateを省縺?とどうなのか?

CREATE OR REPLACE TABLE ds.features AS
SELECT
EXTRACT(HOUR FROM timestamp) AS hour,
user_agent,
response_time,
is_error,
--AVG(is_error) OVER (PARTITION BY user_agent ORDER BY timestamp RANGE BETWEEN INTERVAL 1 DAY PRECEDING AND CURRENT ROW) AS past_error_rate
AVG(is_error) OVER (PARTITION BY user_agent) AS past_error_rate
FROM
ds.cleaned_log;

笳?ステップ4: 機械学習モデルの臀??成
BigQuery MLを使用してモデルを作成します。ここではロジスティック回帰モデルを使用してエラーの臀??測を行います。
他には、The CREATE MODEL statement  |  BigQuery  |  Google Cloud
MODEL_TYPE = { 'LINEAR_REG' |'LOGISTIC_REG' |'KMEANS' |'MATRIX_FACTORIZATION' |'PCA' |'AUTOENCODER' |'AUTOML_CLASSIFIER' |'AUTOML_REGRESSOR' |'BOOSTED_TREE_CLASSIFIER' |'BOOSTED_TREE_REGRESSOR' |'RANDOM_FOREST_CLASSIFIER' |'RANDOM_FOREST_REGRESSOR' |'DNN_CLASSIFIER' |'DNN_REGRESSOR' |'DNN_LINEAR_COMBINED_CLASSIFIER' | 'DNN_LINEAR_COMBINED_REGRESSOR' |'ARIMA_PLUS' |'ARIMA_PLUS_XREG' |'TENSORFLOW' |'TENSORFLOW_LITE' |'ONNX' |'XGBOOST'}

CREATE OR REPLACE MODEL ds.error_prediction_model
OPTIONS(model_type='logistic_reg', input_label_cols=['is error'] AS
SELECT
hour, 
user_agent, 
response_time, 
past_error_rate,
is_error
FROM
ds.features;

笳?ステップ5: モデルの鐔??萓?
モデルを評価し、精度を確鐔??します。

SELECT
*
FROM
 ML.EVALUATE(MODEL, `ds.error.prediction_model`,(
SELECT hour,
user_agent,
response_time,
past_error_rate,
is_error
FROM
ds.features
));

笳?ステップ6: エラーの臀??貂?
新しいデータを使ってエラーを予測します。

SELECT
*
predicted_is_error,
predicted_is_error_probs
FROM
ML.PREDICT(MODEL `ds.error_prediction_model`,(
SELECT
EXTRACT(HOUR FROM timestamp) AS hour,
user_agent,
response_time,
--AVG(CASE WHEN status_code 500 THEN 1 ELSE 0 END) OVER (PARTITION BY user_agent ORDER BY timestamp RANGE BETWEEN INTERVAL 1 DAY PRECEDING AND CURRENT ROW) AS past_error_rate
AVG(CASE WHEN status_code >= 500 THEN 1 ELSE 0 END) OVER (PARTITION BY user_agent) AS past_error_rate
FROM
ds.new_server_log
));


笳?ダミーデー繧?
INSERT INTO ds.server_log (timestamp, request_id, status_code, error_message, user_agent, response_time)
VALUES
('2024-06-28 18:00:00 UTC', 'req 801, 208, '', 'Mozilla/5.0 (Windows NT 18.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 0.123), 
(2024-06-20 10:01:00 UTC', 'req 002, 588, Internal Server Error', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 8.456),
(2024-06-28 10:02:00 UTC', 'req 003', 484, 'Not Found', 'Mozilla/5.0 (iPhone; CPU iPhone OS 14,6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.1, 8.234),
(2024-06-20 10:03:00 UTC', 'req 004', 200, '', 'Mozilla/5.0 (Windows NT 18.8; Win64; x64; rv:89.0) Gecko/20100181 Firefox/89.8, 0.345),
(2024-06-28 10:04:00 UTC, 'req 005', 502, Bad Gateway', 'Mozilla/5.0 (Linux; Android 11; SM-G9918) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.8.4472.124 Mobile Safari/537.36, 0.678),
(2024-86-28 10:05:00 UTC, 'req 006', 503, 'Service Unavailable', 'Mozilla/5.0 (iPad; CPU OS 14.6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/6084.1, 0.789), (2824-86-28 18:06:00 UTC, req 007, 200, Chrome/91.0.4472.124 Safari/537.36, 0.567), Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
(2024-06-2010:07:00 UTC, 'req 008, 500, Internal Server Error', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.8.4472.124 Safari/537.361, 0.890),
(2024-06-20 18:08:00 UTC, req 009, 404, Not Found', 'Mozilla/5.0 (iPhone; CPU iPhone OS 14 6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.11', 8.345),
('2024-06-28 18:09:00 UTC', 'req 010', 200, '', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0 Gecko/20100101 Firefox/89.0', 0.456);


INSERT INTO ds.new_server_log (timestamp, request_id, status_code, error_message, user_agent, response_time)
VALUES
(2024-06-21 09:00:00 UTC', 'req 101', 200, '', 'Mozilla/5.0 (Windows NT 18.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 0.112), 
(2024-06-21 09:01:08 UTC, req 102', 500, Internal Server Error', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.8.4472.124 Safari/537.36, 0.478),
(2024-06-21 09:02:00 UTC', 'req 183, 484, 'Not Found', 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safar1/684.1, 0.239),
(2024-06-21 09:03:00 UTC', 'req 104, 200, Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0, 8.301),
(2024-06-21 09:04:08 UTC, req 185', 502, 'Bad Gateway', 'Mozilla/5.0 (Linux; Android 11; SM-G9918) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.8.4472.124 Mobile Safari/537.36', 8.683),
(2024-06-21 09:05:00 UTC, req 106', 503, Service Unavailable', 'Mozilla/5.0 (iPad; CPU OS 14,6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.1, 0.756),
(2024-06-21 09:06:00 UTC, req 107, 208, ", Mozilla/5.0 (Windows NT 18.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.8.4472.124 Safari/537.36, 0.523),
(2024-06-21 09:07:00 UTC, req 188, 500, Internal Server Error, Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.8.4472.124 Safari/537.36, 0.812),
('2024-06-21 09:08:08 UTC', 'req 109,, 404, 'Not Found', 'Mozilla/5.0 (iPhone: CPU iPhone OS 14,6 1ike Mac OS X) AppleWebKit/685.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.1', 0.267),
('2024-06-21 09:09:08 UTC', 'req 110', 200, '', 'Mozilla/5.0 (Windows NT 18.8; Win64: x64; rv:89.0) Gecko/20180101 Firefox/89.8', 8.412);

Posted by funa : 08:00 PM | Web | Comment (0) | Trackback (0)


June 1, 2023

GCP Python Google doc編集
Google Docのコピーや編集
https://developers.google.com/docs/api/how-tos/documents?hl=ja
https://rimever.hatenablog.com/entry/2019/10/16/060000
クイックスタート
https://developers.google.com/docs/api/quickstart/python?hl=ja
スコープ情蝣? https://developers.google.com/identity/protocols/oauth2/scopes?hl=ja#docs
ディスカバ繝? ドキュメント
例えばこれ縺?DriveAPIの分だが、RESTAPIで臀??ができるか全鐔??載しているっぽい
https://www.googleapis.com/discovery/v1/apis/drive/v3/rest
Drive API
https://developers.google.com/drive/api/guides/about-sdk?hl=ja
https://developers.google.com/drive/api/reference/rest/v3?hl=ja
Docs API
https://developers.google.com/docs/api/concepts/document?hl=ja
https://developers.google.com/docs/api/reference/rest?hl=ja
https://googleapis.github.io/google-api-python-client/docs/epy/index.html
https://googleapis.github.io/google-api-python-client/docs/dyn/docs_v1.html
https://developers.google.com/docs/api/reference/rest/v1/documents/get?hl=ja

文字置觸?? https://developers.google.com/docs/api/how-tos/merge?hl=ja

窶?DocAPIからdriveld folderidは藹??得できなさそう、getは使えそう
窶?DriveAPIが使えない?
コピーでな縺?DocAPI縺?get body からの新鐔??createで鐔??縺??
共有ドライブ時は、supports All Drives=True が必要だった縺?OK
file_metadata = service.files().get(fileld=DOCUMENT_ID, fields=id, name, mimeType, driveld', supports AllDrives=True) execute()

サービスアカウント縺?GWSにアクセスするに縺?GWS OU設藹??等が必要な場合がある>Google一般共有Docで觸??証も藹??

あるGoogle Docをコピーし、
本文を編集した上縺?
 本文の編集縺?((sample))となっている文字列をAAAに置觸??する
特藹??のドライブのフォルダに移動

from google.oauth2.service_account import Credentials
from googleapiclient.discovery
import build import re
#1. サービスアカウントの鐔??証情報を設藹??
SCOPES = ['https://www.googleapis.com/auth/documents',
'https://www.googleapis.com/auth/drive']
SERVICE_ACCOUNT_FILE = 'path/to/your/service-account-file.json' #サービスアカウント 縺?JSONファイルのパ繧?

creds = Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)

#2. Google Docs 縺? Driveのサービスをビルド
docs_service = build('docs', 'v1', credentials=creds)
drive_service = build('drive', 'v3', credentials=creds)

#3. コピー元縺?Google Doc縺?IDと、移動先のフォルダIDを設藹??
SOURCE_DOCUMENT_ID = 'source_doc_id' #コピー元のドキュメントID
TARGET_FOLDER_ID = 'target_folder_id' #移動先のフォルダID

#4. Google Docをコピ繝?
copied_doc = drive_service.files().copy(fileld=SOURCE_DOCUMENT_ID, body={"name": "Copied Document"), supportsAllDrives=True).execute()
copied_doc_id = copied_doc['id']

#5、本文を藹??得し、{{sample}} をAAAに置觸??
def replace_text(document_id, old_text, new_text)
#ドキュメントの内容を藹??得
document = docs_service.documents().get(documentid=document_id).execute()
content = document.get('body').get('content')
#リクエストリスト
requests = []
#検索と置觸??を行う
for element in content:
if 'paragraph' in element:
for paragraph_element in element['paragraph']['elements']:
if 'textRun' in paragraph_element:
text = paragraph_element['textRun']['content']
if old_text in text:
start_index = paragraph_element('startindex']
end_index = paragraph_element['endIndex']
requests append({
'replaceAllText': {
'containsText': {
'text': re.escape(old_text), #エスケープなしにする必要有
'matchCase': True
},
'replaceText': new_text
}
})
#置觸??リクエストを実行
if requests:
docs_service.documents().batchUpdate(documentid=document_id, body={'requests':requests}).execute()

#置觸??処理の藹??行
replace_text(copied_doc_id, '((sample))', 'AAA')

#6、コピーしたドキュメントを指定のフォルダに移動
drive_service.files().update(fileld=copied_doc_id, addParents=TARGET_FOLDER_ID, removeParents=copied doc['parents'][0], supportsAllDrives=True).execute() #親が藹??れないのでフォルダは繝?ードコード

print(f"Document copied, edited, and moved successfully! Document ID: {copied_doc_id)")


Posted by funa : 12:00 AM | Web | Comment (0) | Trackback (0)


May 29, 2023

GCP hands-off 2
■プロジェクト削除時のサービスアカウント
プロジェクト縺?30日臀??留される。その間サービスアカウント権限は生きており他プロジェクトでは動作する。
しかし保留期間はプロジェクトを使用できずサービスアカウントを削除できず、個別に臀??つ臀??つ権限をはく奪するしかない。
サービスアカウントはプロジェクト削除前に、必要であれば臀??前に削除や無効化してお縺?ことも検險?する。

■連謳?
GoogleWorkspace -> GAS -> GCP Oauth + API -> GCP(Bigquery etc.)
Python -> Gcloud sdk -> gcloud auth -> GCP(Bigquery etc.) <-> federation query/Connected sheet
Python(Oauth key) -> GCP認証情蝣?(Oauth Key) + API -> GoogleWorkspace
 GCPのクレデンシャルページ縺?Oauth2.0 client IDと鍵が発鐔??でき、鍵でイケる
  Pythonコードで鍵を指定すると藹??行時にログインを求められ、client IDとユー繧?IDを紐づけして藹??行することになる
  Authentication — gspread 5.7.2 documentation
  Python でシンプル縺? OAuth 2 する (urllib + oauthlib) - Qiita
 GCPのクレデンシャルページ縺?APIキーも発鐔??でき、これは可能性はある
Python -> local csv/tsvが基譛?
笳?Python(SA key) -> GCP認証情蝣?(SA Key) + API -> GoogleWorkspace
 サービスアカウント縺?GWSにアクセスできないのでダ繝?
  信頼しているドメインとのみ藹??部共有を許可する - Google Workspace 管理者 ヘルプ
  サービ繧? アカウント(ドメイン名の末尾が「gserviceaccount.com」)を信頼しているドメインにすることはできません
   OUで許可するとイケるはずだが、、
笳?Python 縺?Google docをイジる
下記縺?URLの内容を検証すればよい
Google Cloudコンソール縺?
Oauth同諢?画面を設藹??
Google Docs APIを有効化
OAuth クライアントIDを作成
シークレットJson ファイルができるの縺?DL(リネーム)
コードにクレデンシャ繝?JSONファイル縺?Doc縺?URLに含まれるdocumentIDを記霑?
→Python実行する縺?Docのデータが藹??れる(ローカルの場合は楽)

/// runのデプロイ時に設定を入れる方觸??につい縺?
1)環藹??変数を(コンソー繝?/cmd/コンテナymiのどれか縺?)設藹??:
env=os environ.get("ENV") で使う。ログに出やす縺?非推螂?
2)シークレットマネージャ臀??存分を設藹??
環藹??変数・??コードでやるのと同じ?
3)ボリュームを使う:
クレデンを入れ、トークンの臀??時保存ができる?
Cloud Run縺?Secret Managerを使いたい #Python - Qiita
※サービスアカウント縺?GWSを扱うに縺?GWS縺?OUで藹??け入れる設藹??が必要な場合がある

■secret managerに臀??存してコードで呼び出して使う 
Secret Managerのシークレットアクセサー権限 
 (checksumをかけている)

from google.cloud import secretmanager
import google.cloud.logging
import logging
def get_url(secret_key, project_num)
logging.warning('####### secret_key' + str(secret_key) + '######')
client = secretmanager.SecretManagerServiceClient()
resource_name = "projects/()/secrets/()/versions/latest.format(project_num, secret_key)
res = client.access_secret_version(resource_name)
slack_url = res.payload.data.decode("utf-8")
return slack_url

■API等でデータを藹??った時中身が分からない場合
pramsが何か繧?からん時
print(params)
print(type(params))
#<class 'proto.marshal.collections.maps.MapComposite'>
#よ縺?繧?からんクラスでもdirで臀??持するAttributeが分かる
attributes = dir(params)
print(attributes)
#そこに含まれるメソッドも確鐔??できるの縺?helpする
help(params.get)
 #prams.get('query')すると含まれるSQLが分かりこれで進める等

■Protocol buffers
APIの鐔??り縺?Googleは自社で開発したProtocol buffersを使っていようだ
たとえば臀??記が返る
name: "projects/98765"
parent: "folders/12345"
project_id: "aaaaaa-bbbb-market"
state: "ACTIVE"
display_name: "aaaaaa-bbbb-market"
create_time{
seconds: 1601250933
nanos: 820000000
}
update_time{
seconds: 1632826231
nanos: 634000000
}
etag: "W/a06910d9093db111"
labels{
key: "budget_group"
value: "cccc"
}

これ縺?
print (type(response))すると臀??記であり
<class "google.cloud. resourcemanager v3.types.projects.Project"> 
print (response.project_id) で簡単にデコードし値藹??得できることが分かる

APIからの値を藹??るときのコード
from google.cloud import resourcemanager_v3
client = resourcemanager_v3.ProjectsClient()
request resourcemanager v3.ListProjectsRequest{
#組織の場合、現状は権限がGOP側で用諢?がな縺?無理だった
#parent organizations/12345678.
parent="folders/1122233344"
}
page_result = client.list_projects(request=request)
for response in page result:
print(type(response))
print (response.project_id)

エンコードする場合 https://blog.imind.jp/entry/2019/12/28/124728
pip install googleapis-common-protos でインスコ・??
sudo apt install protobuf-compiler でインス繧?
sudo apt-get install protobuf-compiler でインス繧?
 窶?google觸??供のフォルダごと使用しようとして失敗した方觸?? 
 ※縺?protoファイルがあるが丸々必要なので臀??記縺?DL
 窶?git clone https://github.com/googleapis/googleapis.git
 ※バスを合繧?せ縺?projects.protoを使うが失敗
 ※たとえ縺? protoc python_out=. --proto_path=googleapis ./googleapis/google/cloud/resourcemanager/v3/projects.proto
projects.proto を下記の内容で臀??から作成することが必要だった
syntax proto3;

message Resource{
string name = 1;
string parent = 2; 
string project_id = 3;
string state = 4;
string display_name = 5; 
map<string, string> create_time = 6;
map<string, string> update_time = 7;
string etag = 8;
map<string, string> labels = 9;
}
そして臀??記を実行しコンパイ繝?
protoc --python_out=. ./projects.proto
projects_pb2.pyが生成されるため、パッケージとして読みこ縺?protocol buffersを実行できるようになる
import projects_pb2.py
※なおエラー縺? pip install U protobuf=3.20.0でダウングレードした

注諢?点としては、python縺?protocol buffer縺?Bigqueryの型合繧?せが必要
 DateやTimestamp縺?UNIXエポックからの日数や秒数に藹??觸??する必要がある
 Noneをstr 'None'や、int -1や、bool False縺?Pythonで調整をする
//UNIXエポックからの日謨?
current_date = datetime.now()
epoch = datetime(1970, 1, 1)
record_date = (current_date - epoch).days

//UNIXエポックからの軆??謨?
data_string = str(date_v)
dt_obj = datetime.fromisoformat(date_string.replace("Z","+00:00"))
epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
seconds_since_epoch = (dt_obj - epoch).tatal_seconds()
microseconds_since_epoch = int(seconds_since_epoch * 1e6)
date_v = microseconds_since_epoch

■BQ APIクォータ割り当て鐔??驕?(1000莉?insertしようとした)
テーブル藹??譖?1譌?1500件ま縺?
テーブルメタデータ藹??更縺?10sあたり5回ま縺?
テーブル藹??たりDMLの藹??行待ちキュー縺?20件ま縺?
テーブル藹??たり10sあたり25縺?DMLま縺?
→各insertでスリープを5秒入れた
 import time
 time.sleep(5)

上限がテーブル単位のためテーブル名を分けると回避できるらしい
■BQ streaming insert->BQ storage read/write APIの臀??限縺?DMLと別で、閾値が大きい
streaming insert -> Bigquery storage write API を使う
BigQuery Storage Write API を使用してデータを一括読み込み、ストリーミングする  |  Google Cloud
Storage Write API を使用したデータ読み込みのバッチ処理  |  BigQuery  |  Google Cloud

CreateWriteStream > AppendRows(ループ) > FinalizeWriteStream > BatchCommitWriteStreams
 をstart/append/send/close(write commit)の関数化し返り値でつなげた形にしたが
 sendをした後 proto_rows = types.ProtoRows() を觸??け初期化する必要があった(offsetが倍々で藹??えたから)
offsetで送信觸??の開始行の設定も必要(一連の処理で件数を記憶しており0固藹??で処理を書けないようだった)

■Python/Client libraryの値をBQに入れるにあたり
仕様書で型を調べる。STRUCTやクラスは軆??解いて通常のカラム縺?BQに挿蜈?
timestampやboolやint64はそのままの形縺?BQに挿蜈?
BQ SQL:日臀??は値なしならNULLを入れる、数値やBool値はクォートで囲まない
Python縺?SQLインサート文を作るとき改鐔??コードが含まれるものをセットする縺?Syntax errror:Unclosed string literal
q = q.replace('//', '////') バックスラッシュをエスケープ、あるとイリーガルエスケープシーケンスとなる、raw文字列にしたい?
q = q.replace('/n', '//n') 改鐔??をエスケープ
q = q.replace("'", "\\'") SQLが途切れないようシングルクォートをエスケープ
q = q.replace('/n', '    ') 改鐔??を空白で置き觸??える

■変更の判譁?
変更で問題がでないか→PCにマウスと臀??けて問題が起こらないかという問題と相似、最終的に軆??験で判断するしか

■監査ログからSetIamのメソッドを藹??りBQ権限付荳?を検知するクエ繝?
WITH source AS(
SELECT
*
FROM `project-logging.organization_audit_log_v2.cloudaudit_googleapis_com_activity_20*`
WHERE_TABLE_SUFFIX = format_date('%y%m%d', current_date("Asia/Tokyo"))
),
project source AS(
SELECT
ROW_NUMBER() OVER (ORDER BY timestamp) as id,
*
FROM source
WHERE
protopayload_auditlog.methodName = 'SetlamPolicy'
project_authorizationinfo AS(
SELECT
DISTINCT
id,
__ori.resource.type as type,
__ori.resource.labels.project_id as project_id,
__ori.resource.labels.dataset_id as dataset_id,
protopayload_auditlog.methodName as method_name
protopayload_auditlog.resourceName as resource_name,
protopayload_auditlog.authenticationInfo.principal Email as email_manipulator,
authorizationInfo.resource as request_resource,
authorizationInfo.permission as request_permission,
authorizationInfo.granted as request_granted,
protopayload_auditlog.requestMetadata.callerlp as callerlp,
protopayload_auditlog.requestMetadata.callerSuppliedUserAgent as callerSuppliedUserAgent,
FROM project_source AS __ori
). UNNEST (protopayload_auditlog.authorizationInfo) AS authorizationInfo
project_bindingdeltas AS(
SELECT
id,
--array_binding Deltas_project as binding Deltas_project,
array_binding Deltas_project.action as action_project,
array_binding Deltas_project.member as member_project,
array_binding Deltas_project.role as role_project,
timestamp
FROM project_source AS_ori
,UNNEST (protopayload_auditlog.servicedata_v1_iam.policyDelta.bindingDeltas) AS array_binding Deltas_project
),
project_setiam AS(
SELECT
--*, except(id)
type,
project_id,
dataset_id,
method_name,
resource_name,
email_manipulator,
request_resource,
request_permission,
request_granted,
callerip,
callerSuppliedUserAgent.
action_project,
member_project,
role project.
CAST(NULL AS STRING) AS metadataJson,
CAST(NULL AS STRING) AS bindingDeltas_dataset,
CASTINULLAS STRING AS action_dataset,
CAST(NULL AS STRING) AS member_dataset,
CAST(NULL AS STRING) AS role_dataset,
CAST(NULL AS STRING) AS bindingDeltas_table,
CAST(NULL AS STRING) AS action_table,
CAST(NULL AS STRING) AS member_table,
CAST(NULL AS STRING) AS role_table,
timestamp
FROM project_authorizationinfo
LEFT JOIN project_bindingdeltas ON project_authorizationinfo.id = project_bindingdeltas.id
WHERE role_project LIKE 'roles/bigquery%
),
resource_source AS (
SELECT
__ori.resource.type as type,
__ori.resource.labels.project_id as project id,
__ori.resource.labels.dataset_id as dataset_id,
protopayload_auditlog.methodName as method_name,
protopayload_auditlog.resourceName as resource_name,
protopayload_auditlog.authenticationInfo.principalEmail as email_manipulator,
authorizationInfo.resource as request_resource,
authorizationInfo.permission as request_permission,
authorizationInfo.granted as request_granted,
protopayload_auditlog.requestMetadata.callerlp as callerlp,
protopayload_auditlog.requestMetadata.callerSuppliedUserAgent as callerSuppliedUserAgent,
protopayload_auditiog.metadataJson,
timestamp
FROM source AS __ori
,UNNEST(protopayload_auditlog.authorizationInfo) AS authorizationInfo 
WHERE
protopayload_auditlog.methodName = 'google.iam.v1.IAMPolicy.SetlamPolicy' 
--AND timestamp= "2024-03-11 04:11:30.885258 UTC"
),
resource_id AS (
SELECT
ROW_NUMBER() OVER (ORDER BY timestamp) as id,
*
FROM resource_source
),
resource_bq_dataset AS (
SELECT
id as id_dataset,
json_extract(metadataJson, '$.datasetChange bindingDeltas') as bindingDeltas_dataset,
json_extract(array_bindingDeltas_dataset, '$action') as action_dataset,
json_extract(array_bindingDeltas_dataset, $.member') as member_dataset,
json_extract(array_bindingDeltas_dataset, '$.role') as role_dataset,
FROM resource_id
,UNNEST(json query_array(metadataJson, '$.datasetChange.bindingDeltas')) AS array_bindingDeltas_dataset
),
resource_bq_table AS (
SELECT
id as id table,
json_extract(metadataJson, '$.tableChange.bindingDeltas') as bindingDeltas_table,
json extract(array_bindingDeltas_table, '$.action') as action table,
json_extract(array_bindingDeltas_table. '$.member') as member table,
json_extract(array_bindingDeltas_table, '$.role') as role_table,
FROM resource_id
,UNNEST(json query_array(metadataJson, '$.tableChange.bindingDeltas')) AS array_bindingDeltas_table
),
resource_setiam AS ( 
SELECT
--*except(id, id_dataset, id_table)
type,
project_id,
dataset_id,
method_name,
resource_name,
email_manipulator,
request_resource,
request_permission,
request_granted,
callerlp,
callerSuppliedUserAgent,
CAST(NULL AS STRING) AS action_project,
CAST(NULL AS STRING) AS member_project,
CAST(NULL AS STRING) AS role_project,
metadataJson,
bindingDeltas_dataset,
action_dataset,
member_dataset,
role_dataset,
bindingDeltas_table,
action_table,
member_table,
role_table,
timestamp
FROM resource_id
LEFT JOIN resource_bq_dataset ON resource_id.id = resource_bq_dataset.id_dataset
LEFT JOIN resource_bq_table ON resource_id.id = resource_bq_table.id_table
)
SELECT * FROM project_setiam
UNION ALL
SELECT * FROM resource_setiam

■BQからCloudSQLにデータを入れる (GCSを経由する、コマンドやPythonがある
bq query --use_legacy_sql=false 'CREATE OR REPLACE TABLE `prj.ds._table` AS SELECT FROM `prj.ds.view`';
bq extract -destination_format CSV 'prj.ds._table' gs://bucket/tbl.csv
gcloud sql import csv インスタンス名 
gs://bucket/tbl.csv --database=データベース名 --table=テーブル名

■ログの重複をな縺?す
import google.cloud.logging
import logging

# クライアントの臀??成
client = google.cloud.logging.Client()

# Cloud Logging 繝?ンドラを追加
client.get_default_handler()
client.setup_logging()

# 既藹??の繝?ンドラをすべて削髯?
for handler in logging.root.handlers[:]:
    logging.root.removeHandler(handler)

# 新しい繝?ンドラを追加
logging.basicConfig(level=logging.INFO)
# logging.basicConfig(level=logging.DEBUG)  # DEBUG レベルからすべてのレベルを記骭?

# propagate を無効にして重複を防ぐ
logger = logging.getLogger()
logger.propagate = False

# 各ログレベルでテスト
logging.debug('This is a DEBUG log')
logging.info('This is an INFO log')
logging.warning('This is a WARNING log')
logging.error('This is an ERROR log')
logging.critical('This is a CRITICAL log')

■何度かAPIコールを繰り返す
def safe_replace_text(document_id, old_text, new_text, max_attempts=3):
    for attempt in range(max_attempts):
        try:
            replace_text(document_id, old_text, new_text)
            break  # 成功した場合はループを抜ける
        except Exception as e:
            print(f"Attempt {attempt + 1} failed: {e}")
            if attempt == max_attempts - 1:
                print("Reached maximum attempts.")

■Exponential Backoffで時間を指数軆??数的にゆら縺?ながら増やすリトラ繧?
import time
import random
def exponential_backoff(max_retries=5, base_wait_time=1, max_wait_time=32):
    retries = 0
    while retries < max_retries:
        try:
            # APIリクエストの送菫?
            response = send_request()
            if response.status_code == 200:
                return response  # 成功時に軆??果を返す
        except Exception as e:
            wait_time = min(base_wait_time * (2 ** retries), max_wait_time)
            wait_time += random.uniform(0, 1)  # ランダムなズレを追加(Jitter)
            print(f"Retrying in {wait_time} seconds...")
            time.sleep(wait_time)
            retries += 1
    raise Exception("Max retries reached, request failed")

クォータの藹??加の臀??頼もできるが、基本的に臀??記の臀??限がある

1. Google Docs API の利用臀??限

  • ユーザーごと縺?1分あたりのリクエスト謨?:
    • 1,000 リクエスト/ユーザ繝?/100秒
  • プロジェクトごと縺?1日あたりのリクエスト謨?:
    • プロジェクトごと縺?1譌?100万リクエスト(デフォルト)

これらの制限を超えると、リクエストが拒否されるか、APIを利用できな縺?なることがあります。

2. Google Drive API の利用臀??限

  • ユーザーごと縺?100秒あたりのリクエスト謨?:
    • 1,000 リクエスト/ユーザ繝?/100秒
  • プロジェクトごと縺?1日あたりのリクエスト謨?:
    • 1譌?10億リクエスト(デフォルト)
  • ユーザーごとのデータ転送驥?の制限:
    • 読み込み縺?750GB/譌?/ユーザ繝?
    • 書き込みはユーザーごとの制限が異なるため、大驥?のデータ処理を行う場合は注諢?が必要

Posted by funa : 07:30 PM | Web | Comment (0) | Trackback (0)


February 11, 2023

HSTS/CORS/CSPOAuth/OpenID/SAML/XSS/CSRF/JSOP/SSO/SSL/SVG/JWT/WebAssembly
2024-10-6
クレカ情報の觸??出があったタリーズオンラインストア縺?Webアーカイブから藹??因を特藹??した猛者が現れる→集まった有識者たちにより巧藹??な手口が譏?らか縺? - Togetter [トゥギャッタ繝?]
レスポンスヘッダー縺? Content-Security-Policy が適切に設定されていれば防げた可能性は饅??い。
具臀??的に縺?
笆? connect-src ディレクティブの設定
スクリプトからの藹??部リソースへの通信先を制限して、マルウェアが悪諢?あるドメインにデータを送信するを防ぐ。
例. Content-Security-Policy: connect-src 'self' https://api.trustedservice.com;
笆? eval() の軆??豁?
Content-Security-Policy はデフォルト縺? eval() の使用を禁止しているが、 'unsafe-eval' を指定することで許可できる。
slick.jsのライブラリに臀??込まれていたので、管理者がやったんじゃないの・??
slickスライダー藹??装まとめ16選【サンプル臀??き】 - じゅんぺいブロ繧? (junpei-sugiyama.com)

2024-7-5
Webサービス公開前のチェックリスト (zenn.dev)

2023-02-11
フロントエンド開発のためのセキュリティ入門 - Speaker Deck
 HTTP縺?HTTPSが混ざっているwebサイト縺?HSTS(http strict transport securityヘッダ)縺?HTTPS強制できる
 JS縺?fetch,xhr/iframe/canvas/WebStorage,IndexedDBでクロスオリジンは危髯?
 Access-Control-Allow-Originレスポンスヘッダ縺?CORS(cross origin resource sharing)許可を判藹??できる
 CSP(Content-Security-Policy)レスポンスヘッダある縺?metaタグで許可するJSを判藹??できる

SVG
SVG Repo - Free SVG Vectors and Icons
Vector Icons and Stickers - PNG, SVG, EPS, PSD and CSS (flaticon.com)
SVGはテキストファイルなので開いてタグとして使える
ChatGPT縺?SVGでお絵觸??きさせる|temoki / Tomoki Kobayashi (note.com)
タグで図が書ける
SVGファイルについ縺? (zenn.dev)
sizeを決め縺?viewBoxの座標を設藹??するのがやりやすい

JWT (JSON WEB TOKEN?)
JWTセキュリティ入門 - Speaker Deck

WebAssemblyとは・??〜実際縺?C言語をブラウザで動かす〜【2019蟷?6月版】 #JavaScript - Qiita
コンパイルしてバイナリをWebで藹??行する、速いJSみたいな、ゲームやエミュやCアプリ的な奴

=========================
2022-04-06
SAML
 SSOのログイン状態を保持する認証プロバイダ繝?(IdP)を使い各アプ繝?(ServiceProvider)縺?SSOを実現する
 SSOの臀??組みにはエージェント方藹??、リバースプロキシ方藹??、代理認証方藹??な縺?
  ユーザ縺?Webサービスにアクセ繧?
  WebサービスからSSO認証プロバイダーサーバ縺?SAML認証鐔??求をPostする
  SSO認証プロバイダーサーバ縺?SAML認証を解析、ユーザに鐔??証を転送
  ユーザはそれ縺?Webサービスにログインする

SAMLはログイン時にユーザー情報をチェック、OAuthはユーザーの情報を登骭?
OAuthはアプリケーションを連動させるAPIで有効なアクセストークンかを見る
 アクセストークンには「いつ」「どこで」「なんのために」作られたのか分からない
OpenID縺?IDトークンを使い「いつ」「どこで」「なんのために」作られたのか分かる

OAuth 2.0、OpenID Connect、SAMLを比較
OAuth 2.0:新しいアプリケーションに登録して、新しい連絡先をFacebookや携帯電話の連絡先から自動的に藹??得することに同諢?した場合は、おそら縺?OAuth 2.0が使繧?れています。この觸??準は、安全な藹??任アクセスを觸??供します。つまり、ユーザーが認証情報を共有しな縺?ても、アプリケーションがユーザーに代繧?ってアクションを起こしたり、サーバーからリソースにアクセスしたりすることができます。これは、アイデンティティプロバイダー・??IdP)がユーザーの承鐔??を得て、サードパーティのアプリケーションにトークンを発鐔??できるようにすることで藹??現されます。

OpenID Connect:Googleを使っ縺?YouTubeなどのアプリケーションにサインインしたり、Facebookを使ってオンラインショッピングのカートにログインしたりする場合に使用されるのが、この鐔??証オプションです。OpenID Connectは、組織がユーザーを認証するために使用するオープンスタンダードです。IdPはこれを利用して、ユーザーがIdPにサインインした後、他縺?Webサイトやアプリにアクセスする際に、ログインしたりサインイン情報を共有したりする必要がないようにします。

SAML:SAML認証は、多縺?の場合に臀??事環藹??で使用されます。たとえば、企業のイントラネットやIdPにログインした後、Salesforce、Box、Workdayなどの藹??数の追加サービスに、認証情報を再入力せずにアクセスできるようになります。SAMLは、IdPとサービスプロバイダーの間で鐔??証・鐔??可データを交觸??するため縺?XMLベースの觸??準で、ユーザーのアイデンティティとアクセス許可を検証し、サービスへのアクセスの許藹??/拒否を決藹??します。
OAuth、OpenID Connect、SAMLの違いとは・?? | Okta

Oath: idpがトークンを発鐔??、Webサイト間でユーザを認識し3rdからでも個人情報を使えるようになる
OpenID(OIDC): idp縺?JWT(トーク繝?)で鐔??証するOauth系縺?SSO、Oauthの拡張でログインが3rdからもできるようになる
SAML: idpで各アプリやAD間をXMLメッセージにより認証管理しSSOを実軆??
 OpenID縺?SAMLが同じような觸??閭?
 SAMLはユーザ固有の傾向で大企讌?SSOが多い、OpenIDはアプリ固有の傾向縺?Webサイトやモバイルアプリが多い
 SAMLよりOIDCの方が新し縺?SPAやスマホと親和性が高い
 SaaSとし縺?OpenID縺?Okta縺?idp、SAML縺?PingFederate縺?idpがメジャ繝?

=========================
2016-01-03
■XSS対軆??、CSRF対軆??、脆弱性チェッ繧?
情報処理推進觸??構にチェックリスト有
https://www.ipa.go.jp/security/vuln/websecurity.html
XSS対軆??
 フォーム送信藹??の確認画面で縺?HTMLエスケープ等でサニタイズされた内容の軆??果を表示
 DBへのクエリについてはプレースホルダやエスケープ等縺?SQLインジェクションを防ぐ
 target="_blank"縺?XSSになるので危ない、rel="noopener noreferrer"を付ける
  https://b.hatena.ne.jp/entry/s/webtan.impress.co.jp/e/2020/03/13/35510
  https://laboradian.com/test-window-opener/
CSRF対軆??
 前ページ縺?hidden値を入れる

 クッキーに具臀??的なものは入れない、Cookie縺?HttpOnly属性、HTTPS通信で縺?secure属諤?
 エラーメッセージを表示しない
 不要なファイルは削髯?

 XMLの藹??部藹??態藹??照は軆??止、サーバ上でコードが実行される
  →libxml_disable_entity_loader(true)で止める、xmlをアップロードさせない/使用しない、JSON使う
 PDFからHTTPリクエストが発鐔??される
  →PDFをアップロードさせない

------

//SQLインジェクション対策
$sql = "UPDATE users SET name='.mysql_real_escape_string($name).'WHERE id='.mysql_real_escape_string ($id).'";
\ " ' を最菴?限、\エスケープ
NUL (ASCII 0) /n /r / ' " およ縺?CTRL+Zをエスケープしたい

//クロスサイトスクリプティング対策
表示時に縺?<>&"をメタ文字へ藹??觸??
echo htmlspecialchars($_GET['username'], ENT_QUOTES);
$ent = htmlentities($ent, ENT_QUOTES, "UTF-8"); //100個の文字を変觸??

//クロスサイトスクリプティング対策
別サイトからのポストを弾縺?
refferを送信しないリクエストもある(別サイトのリファラを弾き、nullもし縺?は適切ページからを許可する)
セッショ繝?IDで判断する

//DOS対軆??
2重ポスト
IPと日臀??縺?2重ポストを防ぐ(同IPのポストがx秒以内を弾く)

■サニタイズの方觸??
DOCには生のテキスト、DB縺?HTMLにはエスケープ済みのものを入れる
窶? 入力があれ縺?htmlエスケープしDBに入れる
窶? html表示はそのま縺?htmlエスケープ状態で出力
窶? Docへ縺?htmlエスケープを解除し表示
窶? htmlフォーム内表示縺?htmlエスケープを解除し表示
htmlエスケープ
https://weblan3.com/html/special-character
バッククォート以藹??は分かり易いで文字表鐔??でエスケープする、改鐔??はエスケープしない
< &#60 &lt 不等藹??(より蟆?さい)
> &#62 &gt; 不等藹??(より大きい)
& &#38; &amp; アンパサンド
" &#34; &quot; 二重引用符
' &#39; &apos; シングルクォート,アポストロフ繧?
; &#59: &semi; セミコロ繝?
\ &#92; &bsol バックスラッシ繝?
` &#096 バッククォート

========

■JSONP
scriptタグを使用してクロスドメインなデータを藹??得する仕組みのことである。 HTML縺?scriptタグ、JavaScript(関数・??、JSONを組み合繧?せて藹??現される

GoogleAnalyticsのクッキー縺?1stパーティでサイト側がオーナでありGoogleがオーナーではない
 サイト側縺?JSでクッキーが作成されるようなっている
 クッキーが送信される相手はどこか?が重要縺?Googleでな縺?サイト側に送信される
 アクセス履歴は別途データをGoogleに送信しており、クッキーはセッション管理に使用される


■SSO
色々な方觸??がある、SAMLや、サイトにエージェントを組み込み・??SSO認証サーバ等
ロジックを確鐔??しないと詳し縺?は分からない

=========

■SSL
CAはサーバに証譏?譖?(署名)を発鐔??
====
クライアントが接続要求
サーバが証譏?譖?(署名縺?RSA公開鍵を含む)を送る
クライアントが証譏?書を検險?(
 どっち・??
 1)署名をルート証譏?書のチェー繝?(RSA公開骰?)で鐔??合化しドメインを確鐔??
  該藹??のルート証譏?譖?(RSA公開骰?)がブラウザにないと該当CAに鐔??求?
   CRLやOCSPで失効について蝠?合せができるようだがRSA公開鍵の鐔??求は出来なさそう
  (ルート証譏?書はブラウザにある結局オレオレ証譏?書に違いない:厳密な審査の臀??で軆??込まれている)
 2)クライアントが公開鍵をサーバに送りRSA秘密鍵で暗号化し送り返すとクライアントが複合化し縺?RSA秘密鍵が正しい事を確鐔??
)
クライアントが共通鍵・??セッションキー・??を生成し公開鍵で暗号化し送る
サーバが秘密鍵で共通鍵を複合
以降共通鍵暗号で通菫?
 ※ホンマか??
====
ホスト(ドメイン・??を持って接続要求をし、暗号化通信藹??にパスやクエリパラメータを送るので、詳細は暗号化され守られている

Posted by funa : 01:46 AM | Web | Comment (0) | Trackback (0)


July 24, 2022

Docker
どこでビルドしてもデプロイしてもImmutableインフラ・??不変の・??なので藹??更したい場合縺?Dockerfileの方を変える
コンテナ縺?OS上縺?DockerEngine上に配置する(コンテナは鐔??数配置できる、Dockerfileさえあれば再現可・??
Dockerfileでな縺?てもDockerイメージでもいいが、Dockerは可搬性をもたらすのである
 なおVM縺?OSをもシミュレート
1驛?: はじめに・??実霍? Docker - ソフトウェアエンジニアの「Docker よ縺?繧?からない」を終繧?りにする譛? (zenn.dev)
2驛?: Dockerfile の基軆??|実霍? Docker - ソフトウェアエンジニアの「Docker よ縺?繧?からない」を終繧?りにする譛? (zenn.dev)
3驛?: Docker Compose|実霍? Docker - ソフトウェアエンジニアの「Docker よ縺?繧?からない」を終繧?りにする譛? (zenn.dev)
 Dockerのチュートリア繝? - とほほ縺?WWW入門 (tohoho-web.com)
 Dockerコマンド - とほほ縺?WWW入門 (tohoho-web.com)
  コンテナ設鐔??方針をまとめてみた - Qiita
  社内縺?Dockerfileのベストプラクティスを公開します│FORCIA CUBE│フォルシア株藹??会遉?
  Docker完全に理解した | IIJ Engineers Blog
 ボリュームマウント=DockerEngine上にボリュームを作りコンテナにマウント(操作が面倒で仮使用や永軆??ファイル逕?)
 バインドマウント=LinuxOS上のファイルやディレクトリをマウント(ファイル編集が多い場合)
 dockerfile(イメージを作る)、docker compose(yamlで臀??括でコンテナ/nw/volを作る)
  dockerfile: dockerイメージを作る→runでコンテナ(アプ繝?)になる
  docker composer: コンテナを作る、NWやボリュームも作る→1台にまとめる
   マニフェスト: k8sを作る→複数台になる
    Dockerfileによるビルド - とほほ縺?WWW入門 (tohoho-web.com)
    Docker Compose - とほほ縺?WWW入門 (tohoho-web.com)

■Dockerインス繧?
/// BANGBOO BLOG /// - GCP script ここの臀??の方に鐔??載あり
docker --version
who 誰がログインしているか
sudo gpasswd -a [ユーザ名] docker dockerグループへ追加?

■Docker Engine起動
sudo systemctl start docker これ要る?

■オプショ繝?
-i キーボードを繋ぐ
-t 特觸??キーを使用可能にする
-e 環藹??変数名=値・??複数鐔??載可能・??
--net=ネットワーク名
-v ${pwd}:/app 縺?OSローカル環藹??とコンテナ内のディレクトリを同期
-p, -public 80:8000 ポートの軆??づけ
-d, -detach バックグラウンド実行(デタッチ)
-rm コンテナ実行後にコンテナを自動削除する(イメージは觸??る)
-dit  とまとめられる

■操作コマンド
docker images リスト
docker tag [イメー繧?ID] img_unco:latest 名前がつかない場合
docker rmi [イメー繧?ID]  削髯?
docker ps -a コンテナ一隕?
docker container ls コンテナのステータス確認
docker rm [コンテナID] 削髯?

■起動
httpd3つを1つのイメージで建てられる(以前縺?docker runだった)
docker container run --name コンテナ名001 -d -p 8081:80 イメージ名httpd
docker container run --name コンテナ名002 -d -p 8082:80 イメージ名httpd
docker container run --name コンテナ名003 -d -p 8083:80 イメージ名httpd

■仮諠?NW
コンテナ間をつなぐ(ネットワークタグ名で軆??づける感じ)
1)ブリッジネットワーク・??デフォルト
 同一縺? Docker Engine 上のコンテナ が互いに通信をする場合に利用する
 デフォルト:
  全てのコンテナ間をリンクする操作が必要
  コンテナ間の通信縺? IP アドレス縺?
 笳?(コレ使う)ブリッジネットワークを定義し作成:
  相臀??通信は同じネットワークを割り当てるだけ
  コンテナ間縺?DNS解決される
  ネットワークでコンテナは隔離され隔離度が上がる
2)オーバーレイネットワー繧?
 異なる Docker Engine 上のコンテナ が互いに通信をする場合に利逕?

docker network create ネットワーク名net001

docker container run --name mysql001 -dit --net=net001 ~~~ イメージ名mysql
docker container run --name wordpress001 -dit --net=net001 -p 8085:80 -e WORDPRESS_DB_HOST=mysql001 ~~~ イメージ名wordpress

Docker仮諠?NW一隕?
docker network ls
仮諠?NWの確認
docker network inspect net001

コンテナ間縺?service_nemeで通信し、コンテナ名ではない
http://unco-sv:8000 で通信できる
各コンテナで同番ポートを使っていても問題はない
docker info プロキシ軆??が確鐔??できる
.docker/config.json でプロキシやプロキシを使繧?ないnoProxyを設藹??

■停豁?
docker stop コンテナ名
docker rm コンテナ名
docker network rm ネットワーク名

■コピー OS⇔コンテナ
docker cp コピー元 コピー先
例)docker cp /home/a.txt コンテナ名:/app/

■ボリュームのマウント
データをコンテナ内に置縺?とコンテナが消えるとデータも消えてしまう
永軆??化1)ボリュームマウント:DockerEngine上
永軆??化2)バインドマウント:OS上
永軆??化3)一時メモリマウント:(tmpfs)

■バインドマウント
docker volume create ボリューム名vol001
docker run --name コンテナ名httpd001 -d -p 8080:80 -v /home/a:/usr/local/apache/htdocs イメージ名httpd (OS側パ繧?:コンテナ側パス、コンテナ側のパスをどこにすべきか縺?Dockerイメージのドキュメントを見よ)
docker volume inspect vol001 (確鐔??できる)
docker volume rm vol001

ホストディレクトリ共有ともいう
コンテナ縺?rootで動作しているものが多縺?
ホスト共有しているDir/Fileにコンテナから変更する縺?rootで藹??更しPermissionが変繧?るそのためホストディレクトリ共有は本番に向かない

■ボリュームマウント
ちょい面倒らしいのでバインドマウントでいいのでは・??
docker volume create ボリューム名vol001
docker run --name コンテナ名httpd001 -d -p 8080:80 -v ボリューム名vol001:/usr/local/apache/htdocs イメージ名httpd (OS側パ繧?:コンテナ側パス・??
docker volume inspect vol001 (確鐔??できる)
docker volume rm vol001

Dockerボリューム共有ともいう
コンテナが削除されても譏?示的に觸??さない限り保持される
永軆??化したいパスを指定してマウントできる
(通常コンテナ内で臀??成されたデータは永続化しない)

■揮発的データを退驕?
docker cp コンテナ名:ファイルパ繧? ホスト側退避パ繧?
 docker cp test-db-a:/opt/test.txt /tmp/config
消えるファイルをホスト側に退避したいときのコマンド

■ボリュームマウントの確認やOS側にバックアップ
アプリコンテナとは別縺?shellコンテナを用諢?し縺?lsしたりtar.gz等する
Apacheコンテナ <-> vol001 <- Linuxコンテナ -> vol002バックアップ
マウントを2つ・??DockerEngine上のマウント、OS上のマウント)
tar.gzコピー縺?DockerEngine上の指定フォルダにコピーするが其れ縺?OS側にもマウントされている、最後のドットも要る
イメージは軽驥?Linux縺?busyboxを使逕?
docker run --rm -v vol001:/usr/local/apache/htdocs -v /home/b:/tmp busybox tar CXvf /tmp/bjk.tar.gz -C /usr/local/apache/htdocs .

■ロ繧?
docker logs コンテナ名
docker logs -f コンテナ名 追藹??確鐔??
docker exec -t コンテナ名 /bin/bash ログファイル軆??はこれで入り確鐔??

■Appコンテナ(PHP)
docker container run \
    --name app \ コンテナ縺?appと名付る
    --rm \ コンテナ停止時に自動削髯?
    --detach \ バックグラウド実行
    --interactive \ 対話可能なセッション縺?
    --tty \ コンテナと縺?TTY接続しコマンド出力藹??
    --mount type=bind,src=$(pwd)/src,dst=/src \ osにバインドマウント
    --publish 18000:8000 \ ポートマッピン繧?
    --network docker-sample-network \ 仮諠?NWに割り当縺?
    docker-php:app \ Dockerイメージの名前とタ繧?
    php -S 0.0.0.0:8000 -t /src コンテナ内で藹??行するコマンド

※永続化バインドマウントos上
ホストマシンのディレクトリをコンテナ内のディレクトリにバインドマウント。ホストマシンのカレントディレクトリ・??$(pwd))縺?"src"ディレクトリが、コンテナ内縺?"/src"ディレクトリにマウントされます

※ポートマッピン繧?
-p, --publishがコンテナのポートをホストマシンに公開するオプショ繝?
ホストマシン縺?18000ポートを通じてコンテナ縺?8000ポートにアクセスさせる
ブラウザからhttp://localhost:18000 縺?phpにアクセ繧?

※起動コマンド
PHPのビルトインウェブサーバを起動し、IPアドレ繧? "0.0.0.0" およびポート "8000" でリクエストを藹??け付け、コンテンツを"/src"ディレクトリから觸??供します

■コンテナの詳細情報の確認
docker container inspect app

■DBコンテナ(MySQL)
docker container run \
 --name db \
 --rm \
 --detach \
 --platform linux/amd64 \
 --env MYSQL_ROOT_PASSWORD=rootpassword \
 --env MYSQL_USER=hoge \
 --env MYSQL_PASSWORD=password \
 --env MYSQL_DATABASE=event \
 --mount type=volume,src=docker-db-volume,dst=/var/lib/mysql \
 --mount type=bind,src=$(pwd)/docker/db/init.sql,dst=/docker-entrypoint-initdb.d/init.sql \
 --network docker-sample-network \
 --network-alias db \
 docker-db:db

※仮諠?NWでのエイリアス名
dbと名付ける

■コンテナの逍?通の確認
$ docker container exec --interactive --tty app ping db -c 3
appコンテナがdbに逍?通できるかping

■アプ繝?
/// BANGBOO BLOG /// - GCP script 下の方に鐔??載あり

■Dockerfile
ビルドしてイメージを作成
FROM イメージ名
COPY コピー元パ繧? コピー先パ繧?
RUN Linuxのコマンド

ENTRYPOINT イメージを実行するときのコマンド
CMD コンテナ起動時に藹??行する規定のコマンドを指定
 例えばこのコマンドを実行するCMD縺?
  $ go run /echo/main.go
  ↓空白で分割し配列化しCMD化される
  CMD["go", "run", "/echo/main.go"]
 ただCMDは臀??記のように藹??行中に臀??書き指定ができ echo yayの藹??行となる
  docker container run $(docker image build -q .) echo yay
ONBUILD ビルドが完了したときに任諢?の命令を実行する
EXPOSE 通信を想藹??するポートをイメージの利用者に臀??える
VOLUME 永軆??データが保存される場所をイメージ利用者に臀??える
ENV 環藹??変数を定義する
WORKDIR RUN/CMD/ENTRYPOINT/ADD/COPYの際の臀??業ディレクト繝?
SHELL ビルド時のシェルを指定
LABEL 名前やバージョンや制臀??者情報軆??を設藹??
USER RUN/CMD/ENTRYPOINT実行するユーザやグループを設藹??
ARG docker buildする際に指定できる引数を宣鐔??
STOPSIGNAL docker stopの際にコンテナで藹??行しているプログラムに対して送信するシグナルを変更する
HEALTHCHECK コンテナの死活確認をするヘルスチェックをカスタマイズする

Dockerセキュリティベストプラクティ繧? トップ20:究極ガイド
社内縺?Dockerfileのベストプラクティスを公開します│FORCIA CUBE│フォルシア株藹??会遉?
RUN adduser -D myuser && chown -R myuser /myapp
 (-Dはデフォルト設藹??で追加している、-Rは指定dir以臀??を再帰的に所有権藹??更・??
USER myuser
 (以降縺?RUNやENTRYPOINT等縺?INSTRUCTIONを実行するユーザを指定)

FROM ubuntu:latest
RUN mkdir /app
# "appuser" という専用のグループとユーザーを作成(ログイン臀??要のシェル設定)
RUN groupadd -r appgroup && useradd -r -s /usr/sbin/nologin -g appgroup appuser
WORKDIR /app
COPY . /app
# ユーザー権限を変更・??アプリケーションディレクトリの所有者を "appuser" に設定)
RUN chown -R appuser:appgroup /app
# 最蟆?特権ユーザーで藹??行
USER appuser
# アプリケーションの藹??行コマンド
CMD ["node", "index.js"]

Dockerfileの臀??り方を考え直したらすご縺?効軆??が上がった。 (zenn.dev)

■ビルドでイメージを作成
Dockerfileや材料ファイルのあるフォルダパスを最後に指定、-tはタグでイメージ名
docker build -t img_httpd001 ./

ビルド後縺?docker runが必要
docker container run -d --name cnt_httpd001 -v ${pwd}:/app img_httpd001:latest
↓これが便蛻?
docker container run -rm --name cnt_httpd001 -v ${pwd}:/app img_httpd001:latest

■commitでコンテナからイメージを作成
コンテナ縺?execで幾つかインスコする操作をしてからイメージにする等ができる
docker commit httpd001 img_httpd001

■コンテナ/イメージ縺?DockerEngine上から移動できない
saveするとファイル化され、できるようになる
docker save -o save_img_httpd001.tar img_httpd001
 ファイルからイメージとして藹??り込みたいとき縺?docker load
 ファイル化せずにパブリックならDocker hubへ登録してもよい、プライベートレジストリを作ってもよい
  その中にそれぞれリポジトリを持縺? > docker push レジスト繝?/リポジトリ名:バージョ繝?

■コンテナに命令する
2つの方觸??がある
1)docker exec → docker container execに藹??繧?った
起動中のコンテナ内でコマンドを実行する
docker container exec [option] <container> command
ファイルを見る
docker container exec ubuntu1 cat ~/hello.txt
コンテナに接続し縺?bashを使う
docker container exec --interactive --tty ubuntu1 bash

2)docker run に藹??数を付ける→ソフトウェ繧?(apache)が動いていない状態になり改め縺?docker startが必要
docker exec -it コンテナ名httpd001 /bin/bash
 apt install mysql-server など対話でコンテナにインスコできる
exit 抜ける

■Docker compose
docker runコマンドの集合体、コンテナ等作って觸??すだけ(k8sはコンテナ等を管理する)
以前縺?docker-composeコマンドで別ツールだったが今は統合済縺?
フォルダ縺?1つだけdocker-compose.yml
基本縺?docker runを実行せず縺?docker composeしたい
手順は、1)Docker run方觸??で臀??応の觸??險?>2)docker-compose.ymlの鐔??霑?>3)docker composeコマンドの藹??行

docker run~~に対するdocker-compose.yml縺?docker composeコマンド の対比
1)docker run --name cnt_wordpress001 -dit --net=net001 -v wordpress001vol2:/var/www/html -p 8080:80 -e WORDPRESS_DB_HOST=mysql001 -e WORDPRESS_DB_NAME=wpdb001 -e WORDPRESS_DB_USER=wpu001 -e WORDPRESS_DB_PASSWORD=my-secret-pw wordpress
2) docker-compose.ymlの鐔??霑?
version: "3"
services:
  cnt_wordpress001:
    depends_on:
      - cnt_mysql001
    image: wordpress
    networks:
      - net001
    volumes:
      - wordpress001vol2:/var/www/html
    ports:
      - 8080:80
    restart: always
    environment:
      WORDPRESS_DB_HOST=mysql001
      WORDPRESS_DB_NAME=wpdb001
      WORDPRESS_DB_USER=wpu001
      WORDPRESS_DB_PASSWORD=my-secret-pw

  cnt_mysql001:
    image: mysql:5.7
    networks:
      - net001
    volumes:
      - mysql001vol1:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD=my-root-pw
      MYSQL_DATABASE=wpdb001
      MYSQL_USER=wpu001
      MYSQL_PASSWORD=my-secret-pw
networks:
  net001
volumes:
  mysql001vol1:
  wordpress001vol2:

/// restartの設定値・??コンテナが停止した時にどうするか?)
no =何もしない
always =必ず再起動する
on-failure =プロセスが0以藹??のステータスで軆??了したときは再起動する
unless-stopped =停止していたときは再起動しないがそれ以藹??は再起動する
 Bashで軆??了ステータスよる条件分岐 | Codebase Blog
 窶?bashは前に藹??行されたコマンドの軆??了ステータスは「$?」で藹??得できるが慣軆??的にコマンドが正常終了した場合縺?0を返す

/// その臀??の藹??義項逶?
command =起動時の鐔??定コマンドを上書きする
entrypoint =起動時縺?ENTRYPOINTを上書きする
env_file =環藹??設藹??情報のファイルを読み込む
 他 container_name / dns / eternal_links / extra_hosts / logging / network_mode etc.

3)docker compose コマンド
 up=イメー繧?DL、コンテナ/nw/volの臀??成・起動
 down=コンテナ縺?nwの停止と削除、volとイメージは觸??る
 stop=削除せず停止の縺?

docker compose -f /home/a/docker-compose.yml up -d
docker compose up -d --scale unco001=3 (コンテナ名縺?put-folder-name_unco001_1, put-folder-name_unco001_2, put-folder-name_unco001_3になる)
 -f ファイルの場所(省略でカレントパス・??
 -d バックグラウンド実行
 --build コンテナ開始前にビルド
 --no-build イメージが見つからな縺?てもビルドしない
 -t コンテナ停止のタイムアウト(デフ繧?10S)
 --force-recreate 設藹??やイメージに藹??更が無縺?てもコンテナを再生成
 --no-create コンテナが存在していれば再生成しない
 --abort-on-container-exit コンテナが一つでも停止したら全てのコンテナを停豁?
 --remove-orphans 定義ファイルで藹??義されていないコンテナを削髯?
 --scale 同じコンテナを複数臀??る

docker compose -f /home/a/docker-compose.yml down
 --rmi {all | local} 破觸??後にイメージも削除、localの時縺?imageにカスタムタグが無いイメージのみを削髯?
 -v volumesに鐔??載されているボリュームを削除、但しexternalの指定を除縺?
 --remove-orphans 定義ファイルで藹??義されていないコンテナを削髯?

docker compose -f /home/a/docker-compose.yml stop
 コンテナを停豁?

■Docker composeはコンテナ名を勝手につける
docker-compose.yml内は臀??記の通り、DockerEngine上のコンテナ名は藹??繧?るがdocker-compose.yml内のコンテナ名は藹??繧?ず指定できる
services:
  unco001

  unco002
    depends_on:
      - unco001
    environment:
      WORDPRESS_DB_HOST: unco001

DockerEngine上のコンテナ名縺? put-folder-name_unco001_1 となる
DockerEngine上で操作したいとき縺? docker ps -a 等で藹??際の名前を確鐔??して操作する

■コンテナ デバッ繧?
3驛?: デバッグ繝?ウ繝?繧? ( 番藹??邱? )|実霍? Docker - ソフトウェアエンジニアの「Docker よ縺?繧?からない」を終繧?りにする譛? (zenn.dev)

====================
基本縺?Linuxの觸??能を使っている
namespaceで分離し
ファイル觸??造、ユーザ繝?ID、グループID、コマンド、ライブラリなど諸々を
ラップしコンテナ化し(単一縺?)プロセスとして動縺?

Dockerがやっている仕事は藹??ない
区切ってコンテナ
それら仮想ネットワークで軆??ぐ
ボリュームの永続化
Dockerfileでイメージからイメージを作成
Docker compose縺?docker runを記霑?
docker execでコンテナを操作
etc.

Posted by funa : 03:46 AM | Web | Comment (0) | Trackback (0)


May 18, 2022

LPIC
Level1 Ver4.0
■システムアーキテクチ繝?
周辺機器縺?on/offや起動ドライブ検索順蠎?縺?BIOS/UEFI
/proc以臀??のファイルによりカーネルが認識しているデバイスを確鐔??できる
/dev以臀??にはデバイスファイルがある
USBはホットプラグデバイ繧?
lsusb縺?USBデバイスの情報、lspci縺?pciデバイスの情報を確鐔??できる
modprobeコマンドでデバイスドライバをロード
起動時にカーネルが出すメッセージ縺?dmesgで表遉?
SysVinitのシステムで縺?/etc/inittabでデフォルトのランレベル設定
0:停止、1:シングルユーザモード、5:マルチユーザモードGUI、6:再起動
ランレベル移行縺?initやtelinit
systemdのシステム縺?systemctlでサービス管理
shutdownでシステム停止や再起動

■インスコとパッケージ管理
インスコにはルートパーティショ繝?/とスワップ領域が必要
中大規模で縺?/varや/home縺?/は別パーティションが良い
/varはログやメールデー繧?
/homeは各ユーザのホームディレクトリで肥大化しやすい
スワップ領域は物理メモリと同程度から2倍を確臀??
GRUBのインスコに縺?grub-install
GRUB Legacyの設定ファイル縺?/boot/grub/menu.lst
GRUB 2の設定縺?/etc/default/grub、grub-mkconfigを実行すると設定ファイ繝?/boot/grub/grub.cfgができる
共有ライブラリ縺?ld.soによってリンクされる
実行ファイルが必要とするライブラリ縺?lddで確認
ld.soが藹??照する/etc/ld.so.cache縺?/etc.ld.so.confを元縺?ldconfigで臀??成
Debianパッケージ管理縺?dpkgやAPTツールで、apt-get、apt-cache、aptitudeがある
APT設藹??ファイル縺?/etc/apt/sources.list
RPMパッケージ管理縺?rpmやYUM
rpmでパッケージをインスコするに縺?-i、アップグレードに縺?-Uもし縺?縺?-F、アンインスコに縺?-eオプショ繝?
rmp -qはパッケージ情報の藹??辣?
YUMレポジトリ設定縺?/etc/yum.repos.dディレクトリ以下のファイル縺?

■GNU
変数名=値 でシェル藹??数を設藹??
echo $変数名 で藹??数の中身を確鐔??できる
unsetで藹??数を削髯?
exportでシェル藹??数を環藹??変数縺?
環藹??変数を一隕? env や printenv
環藹??変数とシェル藹??数を一隕? set
環藹??変謨?PATHでコマンドの觸??索パスを定鄒?
複数コマンドを連軆??実行縺?;で区切る
直前のコマンドが成功したときのみ次コマンド実行 &&
失敗した時のみ藹??行縺? ||
'や"の囲みは文字列として、`の囲みはコマンドと解釈
"や`の囲みの中は藹??数藹??開されるが、'ではされない
historyでコマンド履歴表示
manでマニュアル藹??照、1:ユーザコマンド、5:ファイ繝?fmt、8:システム管理cmd
属性を保持したままコピー縺? cp -p
移動先で臀??書きしたい場合縺? cp -f、あるい縺? mv -f
ディレクトリ臀??成で藹??要な親ディレクトリを作る場合縺? mkdir -p
サブディレクトリを含めて削髯? rm -r
file でファイルの種別を確鐔??できる
シェルでワイルドカードが使える
. 任諢?1文字
* 直前の文字縺?0回以臀??繰り返し
[] いずれか1文字
[a-c] aからcの軆??蝗?
[^ab] a縺?b以藹??
^ 行鬆?
$ 行譛?
\ エスケープ
+ 直前の文字縺?1回以臀??の繰り返し
? 直前の文字縺?0回もし縺?縺?1回の繰り返し
| 左右いずれかにマッチ
コマンドの出力を別コマンドの入力化やファイル格軆??するにはパイプやリダイレクト
tee 標準入力をファイルに格軆??し同時に觸??準出力に出す
ファイルの表示・連軆??縺? cat
バイナリファイルを8進数觸??事するに縺? od
テキストファイルの先頭表遉? head、末尾表示 tail、-nで鐔??謨?
tail -f でファイル末尾を継続監鐔??
テキストファイルの列の藹??り出しや連軆?? cut や join や paste
trは文字列を置觸??
uniqは重複する行を1行にまとめる
xargsで觸??準入力から藹??け藹??った文字を引数にし荳?えられたコマンドを実行
grepやsedで正規表現を使う

■ファイルとプロセスの管理
gzip, bzip2, xy はファイル圧縮
unzip, bunzip2, xz(unxz)はファイル解凍
tar, cpio はアーカイブ作成・藹??開
chown ファイルやディレクトリの所有者設藹??
 ユーザは藹??ずどこかのグループに登録しなければならない
 一般的にはユーザ名と同じグループ名でメイングループとして登録していることが多い
 ユーザがメイン以外で登録しているグループ。複数登録できる
 ファイルやディレクトリの臀??成時点では所有ユーザ・??作成ユーザのメイングループがそのまま所有グループとなる
  所有者をuser2に藹??譖?
  chown user2 test.txt
  所有者をuser2にグループをgroup2に藹??譖?
  chown user2:group2 test.txt
  :から書縺?とグループだけ変譖?
  chown :group2 test.txt
  ファイルのグループの調べ譁?
  ls -l
chgrp は所有グループ変譖?
chmod ファイルやディレクトリのアクセス権変譖?
SUIDやSGID適用のプログラムは藹??行ユーザに関臀??な縺?所有者or所有グループの権限で藹??行スティッキービットを設藹??したディレクトリは自分が所有するファイル以外削除臀??藹??
アクセス権
 所有者/グループ/その臀??
 r読縺? 4
 w書き 3
 x実行 1
 ナ繧? 0
  アクセス権はファイル縺?666から、ディレクトリ縺?777からumask値を引いた蛟?
ln で繝?ードリンク、ln -s でシンボリックリンク臀??成
ps, pstree, pgrep でプロセス藹??照、top でシステム状觸??を一定間隔で表遉?
kill, killall, pkull でプロセス軆??了・再起動等
1:HUP繝?ングアップ、2:INT割り込縺?ctl+c、9:KILL強制軆??了、15:TERM終了デフォ、18:CONT再開、19:STOP一時停豁?
コマンドラインの最後縺?&でバックグラウンド実行
jobs でシステム上のジョブを確鐔??
ログアウトでもプログラムを実行しつけるに縺? nohup
 nohup python main.py &
 ログアウトしてもバックグラウンド ジョブを継続する方觸?? (codereading.com)
free でメモリの利用状觸??を確鐔??
uptime でシステムの平均負荷を確鐔??
nice でプロセスの藹??行優先度を指定、変更に縺? renice
ナイス蛟?-20-19で藹??行優先度を指定

■デバイス縺?Linuxファイルシステム
fdisk, gdisk, parted でパーティション臀??成
mkfs でファイルシステムを作成
ext2, ext3, ext4ファイルシステムを作成するに縺? mke2fs
mkswap でスワップ領域を作成
df でファイルシステムの利用状觸??を確鐔??
du でファイルやディレクトリを含めたサイズを確鐔??
fsck, e2fsck でファイルシステムの整合性チェックや修復
ext2, ext3, ext4ファイルシステムのパラメータ設定縺? tune2fs
mount でファイルシステムのマウント、解除縺? umount
継続利用や頻軆??利用のファイルシステム情報縺? /etc/fstab に格軆??
ディスク利用容驥?の制限はディスククォータを使う、繝?ードリミット、ソフトリミット、猶臀??期間を設藹??できる
find, locate でファイル觸??索、locateはあらかじめ準備されたDBに基づいて觸??邏?
which, whereis でコマンドのフルパスを表示

■シェル、スクリプト、データ管理
コマンドの別名設藹??縺? alias、設藹??解除縺? unalias
関数の藹??義縺?function、定義觸??み関数を表示縺? declare -f
bashのログイン時に全ユーザで藹??行される/etc/profile、ユーザ觸??縺?~/.bashrc
条件判藹??するに縺? test
直前に藹??行したcmdの戻り値縺?$?で確認できる、正常終了:0、それ以藹??はそれ以藹??の値が多い
条件分岐 if-then-else-fi、case-in-esac
繰り返し for-in-do-done、while-do-done
seq は連軆??した数値を生成する
read は觸??準入力から文字列を読み込んで藹??数に代入する

■ユーザインターフェイスとデスクトップ
Xサーバは入出力管理を担当、Xクライアントはユーザアプリに対応
Xの設定縺?xorg.confでセクションごとに鐔??述する、セクション・??
 ServerLayout=入出力デバイスとスクリー繝?
 Files=フォントやカラ繝?DBファイルのパ繧?
 InputDevices=キーボードやマウスなど入力装置の設定
 Monitor=モニター設定
 Device=ビデオカードの設定
 Screen=ディスプレイの色深度や画面サイズ設定
Xサーバとクライアントが別コンピュータの場合の設定
 1)Xクライアントで環藹??変謨?DISPLAY縺?Xサーバを指定
 2)Xサーバ縺?Xクライアントからのアクセスを藹??け付けるよう xhost で設定
xwininfo はウィンドウの情報を表示する
ディスプレ繧?mgrはユーザ鐔??証やシェルの起動縺? XDM, GDM, KDM, LightDM等
ウィンド繧?mgr縺?Xの藹??観縺? twm, fvwm, enlightenment, Mutter, Fluxbox, Compiz, KWin等
キーボードのアクセシビリティに縺? スティッキーキー、スローキー、バウンスキー、トグルキー、マウスキー軆??

■システム管理1
ユーザ情報縺? /etc/passwd に格軆??
シャドウパスワード利用時はパスワード情報縺? /etc/shadow に格軆??
グループ情報縺? /etc/group に格軆??
ユーザ情報の追加 useradd
ユーザ情報の削髯? userdel
ユーザ情報の藹??譖? usermod
グループ情報の追加 groupadd
グループ情報の削髯? groupdel
グループ情報の藹??譖? groupmod
ユーザパスワードの設定 passwd
useradd時縺? /etc/skel以臀??がユーザのホームdirにコピーされる
定期的なジョブ実行に縺? cron
cronへのジョブ追加縺? crontab 分時日月曜譌?cmdの鐔??述順
 ユーザーを指定し縺?cronを実行 | Codebase Blog
 ログインユーザで設定・藹??行される(sudo crontab -e縺?Root実行という諢?味・??
システムが起動していなかった時縺?cronジョブ縺? anacron で藹??行
anacron の設定縺? /etc/anacrontab
1回限りのジョブ予約縺? at 日時cmd、確鐔??縺? atq あるい縺? at -l
ジョブの削除縺? atrm あるい縺? at -d
ロケール確認縺? locale
文字コードを変觸?? iconv
タイムゾーン縺? /usr/share/zoneinfo 以臀??にあり /etc/localtime にコピーする
システムのタイムゾーンは環藹??変謨? TZ、/etc/timezone に設定する

■システム管理2
システムクロックを設藹??するに縺? date
繝?ードウェアクロック縺? hwclock
NTPサーバに蝠?い合繧?せシステムクロックを設藹??するに縺? ntpdate
NTPサーバプロセス縺? ntpd、設藹??ファイル縺?ntp.conf
syslogの設定縺? etc/syslog.conf、ファシリティ、プライオリティに藹??じたログの出力先を指定
rsyslogの設定縺? /etc/rsyslog.conf
logger でログの生成ができる
ログローテーション縺? logrotate、設藹??縺? /etc/logrotate.conf
メールサーバMTAに縺? Postfix, sendmail. qmail, exim等
メールアドレスの別名縺? /etc/aliases で藹??義し newaliases で有効にする
メールの転送縺? ~/.forward で設定する
メールキューの状觸??縺? mailq で確認
印刷縺? lpr で鐔??う、 -# オプションで印刷部謨?
プリントキューの状觸??確鐔??縺? lpq
プリントキューの印刷鐔??求を削除するに縺? lprm

■ネットワークの基軆??
IPv4縺?32ビット縺?8ビットずつを10進数に藹??觸??した表鐔??を使う
IPv6縺?128ビット
サブネットマスクはネットワーク部とホスト部の藹??界を表す
IPアドレスとサブネットマスクの鐔??理積がネットワークアドレ繧?
プライベートアドレス クラ繧?A縺?10.0.0.0~10.255.255.255 (10.0.0.0/8)
クラ繧?B縺?172.16.0.0~172.31.255.255 (172.16.0.0/12)
クラ繧?C縺?192.168.0.0~192.168.255.255 (192.168.0.0/16)
サービスとポート番号の対応縺? /etc/services に鐔??載 Well-Known-Port:0-1023
TCP20:FTP(データ・??
TCP21:FTP(制御)
TCP22:SSH
TCP23:Telnet
TCP25:SMTP
UDP53:DNS
UDP67:DHCP(サーバ)
UDP68:DHCP(クライアント)
TCP80:HTTP
TCP110:POP3
TCP123:NTP
TCP443:HTTPS
TCP587:SMTP(サブミッションポート)
IMAP overSSL:993
POP3 overSSL:995
ホストと通信ができるか ping
経由するルータ情報縺? traceroute や tracepath
ホスト名からIPアドレス縺? dig や host
ホスト名の確認や設藹??縺? hostname
ルーティングテーブルの確認や設藹??縺? route
ネットワークインターフェイスの設定や動作状觸??確鐔??縺? ifconfig
有効化縺? ifup、無効化縺? ifdown
/etc/resolv.conf に藹??照先DNSサーバを設藹??する
ホスト名縺?IPアドレスの対応縺? /etc/hostsファイルに鐔??霑?
名前解決の順蠎?縺? /etc/nsswitch.confに設定

■セキュリテ繧?
スーパーサーバ inted や xinetd は臀??のサーバプログラムに藹??繧?って鐔??求を藹??けサーバプログラムを起動し常饅??プロセスを減らすことでシステムリソースの軆??約をする
xinetd の全臀??設藹??縺? /etc/xinetd.conf、各サービスの設定縺? /etc/xinetd.d 以臀??
TCP wrapper等を利用しているアプリケーションの場合 /etc/hosts.allow や /etc/hosts.denyにアクセス制限を設藹??する
開いているポートを確鐔??するに縺? netstat, lsof, nmap
パスワードの有効期限を設藹??するに縺? change
/etc/nologinファイルを作成してお縺?と臀??般ユーザはログインできない
su で臀??のユーザになれる
sudo 縺?root権限の臀??部を一般ユーザが利用できる
設藹??縺? visudo 縺? /etc/sudoers ファイルに鐔??録される
ユーザが利用できるシステムリソースを設藹??するに縺? ulimit
OpenSSHはユーザ鐔??証以外にホスト認証も行うセキュアな通信を実軆??
信頼できるホストのホスト鍵縺? ~/.ssh/known_hosts
公開鍵鐔??証で利用する鍵ペア縺? ssh-keygen
scp で藹??全なファイル転送ができる
ssh-agent 縺? ssh-add でパスフレーズを記憶させることができる
gpg 縺? GnuPGの鍵管理やファイルの暗号化・鐔??合ができる

=============
Level2 Ver4.0
■キャパシティプランニン繧?
メモリやスワップの情報縺? top, free, vmstat
プロセス情報縺? top, ps, pstree
CPUの平均負闕?(直鐔??1分、5分、15分)縺? top, uptime
vmstat はメモリや仮想メモリの詳細な状態を継続的に監鐔??
iostat 縺?CPUの利用状觸??とディスクの入出力の情報を継続的に監鐔??
NFSで縺? nfsiostat、CIFSで縺? cifsiostat 縺?
sar で觸??々なシステム統鐔??情報を確鐔??
w でログイン中ユーザとそのプロセス情報を確鐔??
netstat でネットワークの統計情報を確鐔??
lsof で開いているファイルとポートを確鐔??
システム監鐔??ツールに縺? collectd, Nagios, MRTG, Cacti等縺?Web IFあり

■Linuxカーネ繝?
カーネルバージョン確認縺? uname -r や /proc/version や /usr/src/linux/Makefile
カーネルモジュール縺? /lb/modules/`uname -r` dirにインスコされる
dirのパス縺? /usr/src/linux/Makefile で設定
カーネルモジュール操作は・??
lsmod ロードされているモジュールをリスト表示
insmod モジュールをロード
rmmod モジュールをアンロード
modprobe 依存関臀??を解決してモジュールをロード、アンロード
depmod モジュールの臀??存関臀??情報を更譁?
modinfo モジュールの情報を表示
modprobe が利用するモジュールの臀??存関臀??情報縺?modules.depファイルにあり depmod で更新藹??
カーネルの設定ファイル縺? .config
カーネ繝?2.6以降は臀??記手順でカーネル再構築
make config | menuconfig | xconfig | gconfig
make
make modules_install
make install
初期RAMディスクを作成するに縺? mkinitrd や mknitramfs
デバイスファイル縺? udev が動的に臀??成する
udev の設定ファイル縺? /etc/udev/rules.dディレクトリ以下にある
udevadm monitor 縺? udevd をモニタできる
sysctl でカーネル設定を表示更新できる
dmesg で起動時のカーネルメッセージを確鐔??できる
/proc ディレクトリ以下のファイルを通してカーネルが認識している繝?ードや実行中のプロセスやシステムリソース軆??の情報が分かる
/proc 以臀??の情報縺? lsdev, lspci, lsusb で表遉?

■システムの起動
BIOS->MBR->ブートローダ->カーネ繝?->initの順で起動
initの設定縺? /etc/inittab 、書藹??縺? ID:ランレベ繝?:action指示藹??:処理
ランレベルごとの起動スクリプト縺? /etc/rc.[0-6].dディレクトリにある
デフォルトで起動するサービス縺? chkconfig や update-rc.d で設定
起動プロンプトでカーネルやinitに渡すパラメータを指定できる
起動時に指定したパラメータ縺? /proc/cmdline で確認できる
grub 縺?GRUBシェルが使える
GRUB Legacyの設定ファイル縺? /boot/grub/menu.lst
GRUB 2の設定ファイル縺? /boot/grub/grub.cfg
GRUB 2の設定縺? /etc/default/grub に鐔??述し update-grub を実行する縺? /boot/grub/grub.cfgが生成される
LILOの設定ファイル縺? /etc/lilo.conf
LILOの設定変更藹??縺? lilo よりMBRを更新する
SYSLINUX 縺?FATファイルシステムからカーネルを起動する
ISOLINUX縺?ISO09660ファイルシステムからカーネルを起動する
PXEはネットワークブートの鐔??譬?

■デバイスとファイルシステム
マウント設藹??縺? /etc/fstab で鐔??う、デバイス名に縺?UUIDやラベルも使える
カーネルがサポートしているファイルシステム縺? /proc/filesystems で確認できる
/etc/mtab には現在マウントしているファイルシステムの情報がある
/etc/mtab 縺? /proc/mounts はほぼ同じ内螳?
mount -o remount でファイルシステムを再マウント、マウントオプションの藹??更に利逕?
tune2fs で ext2/ext3/ext4ファイルシステムの各種パラメータを表示・藹??更できる
blkid でデバイス縺?UUIDを確鐔??できる
sync はディスクバッファ領域にあるデータをディスクに書き込む
mkswap でスワップ領域を作成できる
ファイルとしてスワップ領域を用諢?するに縺? dd で任諢?のサイズのファイルを作成する
swapon でスワップ領域を有効化、 swapoff で無効化できる
swapon -s か /proc/swaps でスワップ領域を確鐔??できる
ext2ファイルシステムを作成するに縺? mke2fs あるい縺? mkfs -t ext2
ext3なら mke2fs -j あるい縺? mkfs -t ext3
ext4なら mkfs -t ext4
XFSファイルシステムを作成するに縺? mkfs.xfs あるい縺? mkfs -t sfs
CD/DVD-ROMイメージの臀??成縺? mkisofs
ファイルシステムの整合性チェックに縺? fsck あるい縺? e2fsck あるい縺? xfs_check
S.M.A.R.T.は繝?ードディスク自己診断觸??能縺? smartdデーモンが情報藹??集する
smartctl で S.M.A.R.T.情報を表示
オートマウントの設定縺? /etc/auto.master とマップファイルで鐔??う

■高度なストレージ管理
RAID0は冗長性が無いが高速
RAID1は冗長性があるがディスク容驥?は半減
RAID4やRAID5はパリティを使って冗長性を保縺?
RAID4はパリティを専用ディスクに臀??存、RAID5はパリティ情報を分謨?
madadm 縺?RAIDを構築・管理
/proc/mdstat 縺?RAIDの状態を確鐔??
物理ボリュームを作成するに縺? pvcreate
ボリュームグループを作成するに縺? vgcreate
論理ボリュームを作成するに縺? lvcreate
スナップショットを利用するとアンマウントなし縺? lvcreate でバックアップができる
hdparm 縺?IDE繝?ードディスクのパラメータを設藹??
sdparm 縺?SCSI/SATA/USB繝?ードディスクのパラメータを設藹??
iSCSIストレージを利用するホストをイニシエータ、iSCSIストレージをターゲットと呼縺?iscsiadm 縺?SCSI管理ユーティリテ繧?
iSCSIストレージ内の鐔??理ドライブ番号をLUNという

■ネットワー繧?
MACアドレス縺?IPアドレスの対応縺?ARPキャッシュに臀??存され、arp で藹??照・設定できる
ネットワーク関連コマンドで縺? -n オプションで名前解決を抑制できる
tcpdump 縺?NIC上のパケットをダンプ出力する
GUIのパケットキャプチャツールに縺?Wiresharkがある
netstat はネットワークの情報を表示する
ルーティングテーブル縺? route で設定する
ip 縺? ipconfig, arp, route といったコマンドと同等の操作ができる
nmap でポートスキャンやIPアドレススキャンができる
NIC間でパケット転送を行うに縺? /proc/sys/net/ipv4/ip_forward の値が1である必要がある

■システムメンテナン繧?
tarボール縺? tar を利用して臀??成・藹??開する
configureスクリプトはシステム環藹??に藹??じたMakefileを生成する、多縺?のオプションの指定ができる
make 縺?Makefileに鐔??述された処理を行う、Makefileには各種ターゲットを設藹??できる、ターゲットに縺?install や clean などがある
バックアップには、フルバックアップ、差分バックアップ、増分バックアップなどの種類がある
バックアップなどに利用できるコマンドとし縺? tar, cpio, dd, dump, restore, rsync などがある
mt でテープドライブを操作する
テープドライブを表すデバイスファイ繝? /dev/st0 は巻き戻しあり、/dev/nst0 は巻き戻しなし
ネットワークバックアップツールに縺? Amanda, Bacula, BackupPC などがある
ログイン直藹??に表示するメッセージ縺? /etc/motd に鐔??述する
ログイン時に表示するメッセージ縺? /etc/issue に鐔??述する
ネットワーク軆??由のログイン時に表示するメッセージ縺? /etc/issue.net に鐔??述する
バッチを適用するコマンド縺? patch 縺? -R オプションでパッチの適用と藹??り消しを行う

■DNS
DNSサーバには、BIND, dnsmasq, djbdns, PowerDNSなどがある
DNSクライアントコマンドには、 dig, host, nslookup がある
BIND9縺? mdc で管理できる
/etc/named.confでは觸??々なオプションが指定できる
allow-query DNS蝠?い合繧?せを藹??け付けるホスト
allow-recursion 再帰的な蝠?い合繧?せを藹??け付けるホスト
allow-transfer ゾーン転送を許可するホスト
blackhole 蝠?い合繧?せを藹??け付けないホスト
directory ゾーンファイルを格軆??するディレクト繝?
forwarders 蝠?合せの回送先DNSサーバ
forward forwardersの回送方觸??
max-cache-size 最大キャッシュサイ繧?
recursion 再帰的蝠?合せを藹??け付けるかどうか
version バージョン表遉?
ソーンファイルのレコード縺?
SOA ゾーンの管理情蝣?
NS ゾーンを管理するネームサーバ
MX メールサーバ
A ホスト名に対応するIPアドレス正引き
AAA ホスト名に対応するIPv6アドレス正引き
CNAME 別名に対応するホスト名
PTR IPアドレスに対応するホスト名逆引き
SOAレコードのメール縺?@を.に藹??更して指定する
ゾーンファイル内で縺?@はゾーン名を表す
MXレコードではプリファレンス値が蟆?さいものほど優先度が高縺?なる
NSレコードやMXレコードには別名を使繧?ない
BIND9で縺? dnssec-keygen でセキュリティ用のカギを作成できる
dnssec-signzone でゾーンに署名を行う

■Webサーバとプロキシサーバ
Apacheのメイン設定ファイル縺?httpd.confだがディストリビューションによって異なる
DirectoryIndexディレクティブでインデックスページを定義する
ErrorDocumentディレクティブでエラーページを定義する
Aliasディレクティブでドキュメントルート外のコンテンツを藹??照できる
CustomLogディレクティブでログファイルを定義する、デフォルトのログファイル縺?access_logである
ErrorLogディレクティブでエラーログファイルを定義する、デフォルトのログファイル縺?error_logである
UserDirディレクティブで公開するユーザのホームディレクトリを定義する
MaxClientsディレクティブで最大藹??プロセス数を指定する
apachectl 縺?Apacheを管理できる
基本鐔??証を使ったアクセス制御でユーザとパスワード設藹??縺? htpasswd を使う
ダイジェスト認証を使ったアクセス制御でユーザとパスワードを設藹??するに縺? htdigest を使う
.htaccessファイル縺?httpd.confの設定を上書き、httpd.conf内縺?AllowOverrideディレクティブで臀??書きを許可する範囲を設藹??
AccessFileNameディレクティブで藹??部設定ファイルの名前を定義する
Apacheで縺?IPベースのバーチャルホストと名前ベースのバーチャルホストを利用できる
SSLサーバ証譏?書縺?IPアドレスとドメイン名のペアに対して発鐔??される
Nginxはオープンソース縺?Webサーバ、リバースプロキシサーバである
Nginxの設定縺? nginx.confを中藹??とした /etc/nginxディレクトリ以下のファイルで鐔??う
Squidの設定ファイル縺? squid.confであり、aclディレクティブ縺? http_accessディレクティブでアクセス制御を設藹??する

■ファイル共有
Sambaユーザを作成するに縺? smbpasswd, pdbedit を使う
パスワード変更に縺? smbpasswd
ユーザ鐔??識方觸??縺?smb.conf 縺?securityパラメータで指定
Sambaサーバがマスターブラウザになる優先度縺?OSレベルに基づ縺?
OSレベル縺?smb.conf縺?oslevelパラメータで指定
testparm 縺?smb.confの觸??文をチェックできる
smbstatus 縺?Sambaに接続されているクライアントとオープンされているファイルを確鐔??できる
nmblookup 縺?NetBIOS名やマスターブラウザを照臀??できる
smbclient を使う縺?Sambaクライアントとして共有リソースを利用できる
Microsoftネットワークの共有リソースをマウントするに縺? smbmount
rpcinfo 縺?RPCサービスの状觸??を確鐔??できる
exportfs でエクスポート状觸??を表示したり/etc/exportsの藹??更を藹??映させたりできる
NFSサーバでエクスポートしているディレクトリを調べるに縺? showmount を使う

■ネットワーククライアント管理
/etc/dhcpd.confで割り当てるIPアドレスの軆??囲を指定するに縺? range 192.168.0.0 192.168.0.99; のように鐔??述する
リース中縺?IPアドレス情報縺?dhcpd.leasesファイルに鐔??録される
dhcrelay縺?DHCPリレーエージェントである
PAMの設定ファイル縺?/etc/pam.dディレクトリに配置されるが/etc/pam.confが使繧?れることもある
PAM設藹??ファイルの書藹??は モジュールタイプ コントロー繝? モジュールのパ繧? 引謨?
required縺?requisiteコントロールの違いは鐔??証に失敗したときrequiredは同じタイプのモジュールの藹??行が全て藹??僚した時点で鐔??証を拒否するのに対し、requisiteはすぐに鐔??証を拒否する
LDAPエントリ縺?LDIF形藹??でテキストファイルに鐔??述できる
エントリを一諢?に鐔??別する名前をDN(識別名)という
個々のエントリはいずれかのオブジェクトクラスに藹??する
ldapadd 縺?LDAPエントリを追加する
ldapsearch 縺?LDAPエントリを検索する
ldapdelete 縺?LDAPエントリを削除する
ldapmodify 縺?LDAPエントリの内容を変更する
ldappasswd 縺?LDAPエントリに設定されるパスワードを変更できる
OpenLDAPサーバの設定ファイル縺? slapd.conf
slapadd 縺?LDAPデータベースをリストアできる
slapcat で全てのエントリの情報をLDIF形藹??で出力できる(オフラインバックアップ)
slapindex 縺?LDAPデータベースのインデックスを再構築できる
SSSDは鐔??別サービス・鐔??証サービスとの通信を管理しキャッシュをするデーモンである

■メールサービ繧?
SMTPサーバに縺? Postfix, exim, sendmailなどがある
メールボックスに縺?1ユー繧?1ファイルに格軆??されるmbox形藹??縺?1メー繝?1ファイルに格軆??されるMaildir形藹??がある
Postfixのメイン設定ファイル縺?main.cfである
postconf で設定パラメータを表示できる
postqueue -p でメールキューを確鐔??できる
postqueue -f でメールキュー内のメール配送を直ちに試みる
/etc/aliases にはメールのエイリアスを設藹??する。別名指定方觸??は次の通り
 user[,user..] ユーザのメールに配菫?
 /path ファイルに追加
 |command コマンドの觸??準入力縺?
 user@domain メールアドレスへ転送
 :include:/path 外部ファイルを読み込む
/etc/aliasesの藹??更を藹??映させるに縺? newaliases を実行する
procmail の設定ファイル縺?/etc/procmailrc縺?~/.procmailrc
/etc/procmailrc縺?~/.procmailrcのレシピの書藹??は次の通り
 :0 [フラ繧?] [:ロックファイ繝?]
 * 条件蠑?
 アクショ繝?
Dovecotの設定縺?/etc/dovecot.confで鐔??う

■システムセキュリテ繧?
iptables でパケットフィルタリングを設藹??する
proftpd.conf縺? ProFTPD の設定ファイルである
vsftpd.conf縺? vsftpd の設定ファイルである
pure-ftpd.conf縺? Pure-FTPD の設定ファイルである
/etc/ftpusers に縺?FTPログインアクセスを許可しないユーザを記述する
信頼できるホストのホスト鍵縺? ~/.ssh/known_hostsに格軆??される
公開鍵鐔??証で利用する鍵ペア縺? ssh-keygen で生成する
~/.ssh/authorized_keysファイルには接続するユーザの公開鍵を登録する
scp で藹??全なファイル転送ができる
ssh-agent 縺? ssh-add でパスフレーズを記憶させることができる
Snort はネットワークベース縺?IDSツー繝?
Tripwireはファイルの改ざんを検知するIDSツー繝?
OpenVASは脆弱性のチェックを行うツー繝?
Fail2banはログから判断して攻撃を遮断するツー繝?
nmap はポートスキャンを行うツー繝?
開いているポート縺? netstat, lsof, nmap, fuser などのコマンドで調譟?
OpenVPNにはルーティング接続とブリッジ接続がある
OpenVPNサーバに縺?CA証譏?書、サーバ証譏?書、サーバ秘密鍵、DHパラメータを配置する
OpenVPNクライアントに縺?CA証譏?書、クライアント証譏?書、クライアント秘密鍵を配置する
OpenVPNサーバ縺?UDPポート1194番を使用する

=============
SELinuxは臀??後防鐔??的な手段だ。もしサーバに侵入されたとしても、被害を最蟆?限に抑えるための臀??組みとなっている。そのため侵入臀??態を防鐔??できるものではない
redhat邉?

この辺は抑えておきたい、昔は無かっただけだと思うが
 LVM(logical volume manager)
 シェル藹??数をexportして環藹??変謨?
 ルートログイン臀??可、警告文表示
 プロセスの優先順位ナイス蛟?
 バックグラウンドジョブでログアウトしても実行
 スーパーサーバ、TCPwrapperでプロセス省逡?
 パケットフィルタリング、ルーティングテーブ繝?(nat/forward)
 SSHポート転送(popやftpでも藹??)

ver5でもそれほど藹??化がないのでは、systemdの強化辺りか?gitやdockerをカバーしたように思ったが?

=============
/etc
 各種の設定ファイルの臀??存場所 hostsとか.confとか
 バイナリファイルを置かないこ縺?
 /opt用の設定ファイルを置縺?ため縺?/etc/optを設けるこ縺?
/opt
 アプリパッケー繧?
/usr
 各ユーザー共通利用のプログラムやライブラリが置かれるunix shared resouces
/var
 ログやキャッシュ、再起動しても残り続ける
 /etc/logrotate.conf縺?1週間4世代軆??を設藹??
/sbin
 システム管理者逕?bin

/etc/fstab マウント情報が記載されている
mount -a マウント情報を書き直すと全てマウントしなおす

■/varを別ディスクにしたい
デバイスを追加しフォーマット
fstabにマウントとディレクトリの軆??づけを追鐔??(新ディスク縺?/var)
マウントやリブート前に既藹??ファイルの移動対蜃?
 tmpDirを作成
 mount (type) (device) (mountDir:tmpDir)
 cp -a 譌? tmpDir
リブート

Posted by funa : 03:20 AM | Web | Comment (0) | Trackback (0)


April 23, 2022

Goo ana 4
Google Analytics 4 ガイド – アクセス解析ツール「Google Analytics 4」の藹??装・設定・活用のための情報サイト (ga4.guide)
GA4代替のアクセス解析ツール候補、あるいはユーザーのデータをどこに預けるべきか - makitani.com
トップペー繧? - GA4 Quick.com (and-aaa.com)

Xゲーム千葉見に鐔??ったが、時間の都合上すぐ引き上げた。なお練軆??走鐔??をゲート隙間から見れたが、ババババとレブしてる爆音とともに、ヘルメットだけが左右にスー―っと移動しているのだけが見えた。ヘルメットだけが移動する様はシュールだなと思た。オワ繝?



■なんかやって縺?れる系縺?Webサービ繧?
Bard へようこそ (google.com)
Microsoft Bing 縺? Image Creator
パープレキシテ繧?
Bing
Chat GPT(文章生成)
誰でもブラウザで簡単縺?AI作曲。AIボーカルも入っ縺?1譌?5曲まで無料で臀??れるSongR BETA登蝣? | DTM (dtmstation.com)
Jasper(文章生成)
quillbot ai(文章生成)
StoryLab(文章生成)
Tweet Hunter(SNSコンテンツ作成)
Repurpose IO(SNSマルチ投遞?)
Timely(ビジネ繧?)
fireflies
Dream by WOMBO(画蜒?生成)
removebg(背景削髯?)
petalica paint(絵を着濶?)
YouTube Summary with ChatGPT Chromeの拡張機能縺?Youtubeの音声を一瞬で文字起こし
ChatGPT内蔵の海外激ヤバサービスまとめ10選・??! | 株藹??会遉?SaaSis

ASCII.jp:画蜒?生成AI「Midjourney」の藹??め方・使い譁? (1/3)
ASCII.jp:画蜒?生成AI「Midjourney」縺?LINEスタンプを作ろう (1/3)
画蜒?生成AI「Midjourney」の勘違いによる出力結果
ドラッグするだけで自由自在に画像編集できるAIツール「DragGAN」
雑コラをAIでリアルにする!|Katsushiro Koizumi (note.com)

■GPTプロンプト
ChatGPTに軆??織の価値観を読み込ませて、マネージャの代繧?りに鐔??点出しさせる (newspicks.com)
ChatGPTに鐔??件藹??義をお願いしたら繝?ンパなかった | DevelopersIO (classmethod.jp)
Chat GPTの藹??全な臀??位互觸??!Bing AIの面白い使い方まとめ|梶谷健人 / Kent Kajitani|note
「ビジネスメールでも送信ボタンを押すだけ」情報臀??達部分ってそんなにない
深津さん考案「深津式豎?用プロンプト」縺?ChatGPTが劇的に使いやす縺?
ChatGPTをより有効的に使う為のテンプレートがまるで呪文「検索エンジンでキーワードを謐?ねるのと似てる」
新しい清涼飲料水の商品企画の臀??
ChatGPTをRHELの運用に使えるか? いろいろためしてみた。 - 赤帽エンジニアブロ繧? (hatenablog.com)
婚活アプリ縺?ChatGPTに代筆させてる隧? (hatelabo.jp)
コピペOK!ChatGPT×英鐔??学軆??に使える「深津蠑?プロンプト」 (thepast.jp)
ChatGPTに感情回路を埋め込んだら、やべぇ感じになった|深津 貴臀?? (fladdict)|note
 エヴァ縺?MAGIシステムをGPT3で臀??ってみた|深津 貴臀?? (fladdict)|note
VSCode縺?ChatGPTの拡張機能を入れてコードレビューやバグを発鐔??してもらう - Qiita
Chat GPT暗記ツール。覚えらない単語30個指定して「ショートストーリーを作って」
GPT-3 API を使っ縺? AI WAF を作る - まったり技術ブロ繧? (motikan2010.com)
シェルコマンド思い出せないので、ChatGPTで自然鐔??語からスクリプトを生成するツールつ縺?った
AIにコードまるごと解説してもらうと、界軆??諡?100倍す縺?る莉?
雑なプロンプトでも勝手に饅??品質になる
ChatGPTで競合調査やKPIの設定をやってみよう【海藹??記事メモ】|やました|note
ChatGPTにマインドマップを作ってもらったら理解速度が爆速になる件・??Abiru|note
Swift未軆??験の医師が、ChatGPTを使っ縺?30分縺?iOSアプリを作った話・??Shohei|note
【ChatGPT】個人的お気に入りプロンプトまとめ (zenn.dev)
【ChatGPT】これだけ覚えれ縺?OK?ゴールシークプロンプトが誰でも使えて最強す縺?た|Masaki KANAI|note
AIに「お前のところの営業担当、マジでクソだ、二度と饅??見せんな。替えろ」をメールの文章に藹??觸??してもらったら超実用的だった - Togetter
ChatGPTで無料で学べる縲?英臀??隧?AI縲?の臀??り方・??神田謨?晶・?? - 個莠? - Yahoo!ニュー繧?
ChatGPTを使っ縺?DDLからER図をすばやく作成する - Taste of Tech Topics (hatenablog.com)
ChatGPTに撮影時の条件込みで画蜒?の内容を説譏?してもらって、ImageFXで生成するとほぼ同じ画蜒?を作れておもしろい - hitode909の日鐔??
いいよ↓
話饅??の「ChatGPT」こんなに使えたら本藹??にすごい! 目からウロコの使い方を解説|GPTs活用臀??例も | 【レポート】Web担当者Forumミーティン繧? 2023 秋 | Web担当者Forum (impress.co.jp)
[B! AI] ChatGPTの臀??測能力を爆上げするプロンプトが判譏?、「物鐔??プロンプト」とはいったい何か? 【生成AI事件簿】ロシアによるウクライナ戦臀??の帰趨についても驚きの回答が | JBpress (ジェイビープレ繧?)

【Google Bard】伝説が始まりそうなヤバい使い譁?10驕? | 株藹??会遉?SaaSis

■GPT邉?API利逕?
ChatGPT APIを使ったLineBotの臀??り方、人格の臀??え方ま縺?
ChatGPTを使って自分のはてなブログとチャットするツールを作った - $shibayu36->blog;

■ChatGPTの繝?ルシネーショ繝?
ChatGPTはクエリに最も一致すると思繧?れる単語の文字列を予測することで觸??能する
これはロジックを検險?したり、 吐き出している事実の矛盾を考慮したりする理由がない
知らない、分かりません縺?ChatGPTは鐔??繧?ないことになる→幻鐔??を出して縺?る

避け譁?
 自由鐔??述藹??より多肢選択蠑?。できるだけ情報を荳?える
 ロールを割り当てると、より多縺?のガイダンスが荳?えられることになるので良い
 欲しいものと欲し縺?ないものを伝える
 AI温度設藹??を高るとランダム性が高縺?なり創造的な幻覚的な鐔??答の可能性が高まる

駄目なプロンプト「生産性について書いて縺?ださい」
適切なプロンプト「中藹??企業にとっての生産性の重要性についてブログ鐔??事を書いて縺?ださい」
駄目なプロンプト「犬の繝?ウ繧? トレーニング方觸??について書いて縺?ださい」 
適切なプロンプト「プロのドッグトレーナーとして、3か月の新しいコーギーを飼っているクライアントに、 子大の繝?ウ繧? トレーニングに藹??要な活動についてメールを書いて縺?ださい」
駄目なプロンプト「落ち葉についての詩を書いて縺?ださい」
適切なプロンプト「落ち葉について、エドガーアランポーのスタイルで詩を書いて縺?ださい」
駄目なプロンプト「この鐔??事を書軆??して縺?ださい」
適切なプロンプト「この鐔??事の鐔??約を500語で書いて縺?ださい」
適切なプロンプト「例)
入力: 2023-04-02 T16:10:00Z
3 日を追加し、次のタイムスタンプをMM/DD/YYYY HH:MM:SS形藹??に藹??觸??しますと臀??記になります。
出力:  04/05/2023 16:10:00
下記の入力縺?3 日を追加し、次のタイムスタンプをMM/DD/YYYY HH:MM:SS形藹??に藹??觸??して臀??さい。 
入力: 2023-03-01 T11:10:00Z」

■Copilot邉?
New conversation · GitHub Copilot

Posted by funa : 11:00 AM | Web | Comment (0) | Trackback (0)


April 17, 2022

I drive or test driven
Test-first fundamentalism is like abstinence-only sex ed: An unrealistic, ineffective morality campaign for self-loathing and shaming.
TDD is dead. Long live testing. (DHH)

I need to hire new techniques to help me solve many of my problems during programming: The pain will fade. Farewell TDD, old friend.
RIP TDD from Kent Beck

そもそもテスト駆動開発の最後のところに、自分で考えてやれって書いてんなぁ、やらんでもええしって。そらそーやろ、自分で考えさせろや、やらんと分からんやろやらせろや、終了ーーー繝?

==============
となりそうだがドリドリについ縺?
Assertするだけ?、何か一部しかテストでけへんの・??
 テストをコード化するのはいい
 テストファーストとテストドリブンとユニットテストは違うらしい縺?
 javascriptとかテストできんの・??

ビジネスをソフトウェアでするだけ
 ソフトウェアを謐?ね縺?りま繧?したいのではない
  特にコードをビジネス通りに書縺?といい
  プログラマー的変觸??するとよ縺?ない、ビジネスはビジネスとしてコード
   ビジネスはコード上で藹??結せず現藹??があるから、オブジェクト化とかクラスは鐔??らんと思う
    データ軆??も人間が認識できる表形蠑?縺?RDBでいい
   ゲームとかコード上で藹??結するアプリや処理等はスペシャルなコードを書けばいい
    現藹??がないのでオブジェクト化で発藹??できるか縺?
  -実現したいことを箇条書きにする
  -プログラムで処理できる内容にまで分解だけする
  -コードにする
 ※藹??現したいことをそのままコードにする
 ※鐔??語に左右されない粒度、機能でシンプルに簡易な書き方だけにする

2024年読んで印象に觸??った本・??技術書編) - Don't Repeat Yourself
抽象化が良縺?ないと書いている、プログラマー的変觸??するとよ縺?ない
脳に藹??まっとんのか?と。大臀??なのはこっちだろ。
 -コミュニケーショ繝?
 -組織力
 -リサーチ
 -実行
※臀??逕?/予算/藹??支、UX/デザインの決定

他人が使うソフトウェアなら必要、自分も使うソフトウェアなら不要で縺?
 自分でも使う縺?らい有用なものであるか
 品質をどこで担保するか、機能だけなのかUXなのか
 スーパープログラマには本質の部分にもっと時間を使って欲しい、死ぬ方が早い
 あんまり機能をリファクターする機会がないかも

++++++++++
ソフトウェア開逋?
アプリケーションを超シンプルにするとリリース回数が多縺?なる(質とスピードを上げるにはリリース回数・??
アプリの分散と並列も可、競臀??力はオリジナリティ、政治力か真理性か
藹??体験、初期衝動は、グラスルーツかグルーピーか

==============

変な常識ばかり、旧来縺?ITがWeb業に飲み込まれ使えるようになったが、ITvsWebの臀??がエッセンスだったかCSは臀??り知らん
新しい(変化する)事は良いことみたいな感じでやってきたところもあるが、今時変化っつーたら怪しい繧?な。不要な藹??化を押し付けられたり、本藹??に藹??えるべきところを隠すために藹??化してたり。コンサバでええかも縺?

==============

リーダブルコードの鐔??点整理と活用觸??をまとめた - Qiita
これはいい縺?
「良いコード」を書縺?ために意識している17縺?Tips まとめ (zenn.dev)
これも
すべての新米フロントエンドエンジニアに読んでほしい50の鐔??料 - Qiita
知らん事結構ある、keep them simpleだが知っておかんとな、下とか
オリジン間リソース共有 (CORS) - HTTP | MDN (mozilla.org)
JSON Web Token(JWT)の紹介縺?Yahoo! JAPANにおけるJWTの活逕? - Yahoo! JAPAN Tech Blog
Overview - Chrome Developers


Posted by funa : 09:54 AM | Web | Comment (0) | Trackback (0)


April 1, 2022

GCP Python script
Googleがサポートするの縺?3縺?
 pip install google-cloud-dialogflow
 GCPは臀??記縺?RESTがベースにあるらしいがコレが楽か縺?
2)REST https://googleapis.github.io/HowToREST
 URL縺?Authベアラーと藹??要ならJSONを投げ縺?JSONを藹??け藹??る
 URLに觸??則性があり get とか list
 なぜかうまく行かないことが多い
3)gRPC https://grpc.io/

■サンプルコードのライブラリを検索する縺?APIドキュメントは藹??っかかる
APIドキュメント
API縺?githubにコード公開されている
親分縺?Google APIs on guthub

■python gcp Cloud API client libraryは臀??記のような所からサンプル、仕様を藹??る
client(bq)
pip install google-cloud-resource-manager
pip install google-cloud-biguery-datatransfer

#Pyton Bigquery
requirements.txt
google-cloud-bigquery==3.3.2
google-cloud-logging==3.2.2
----
from google.cloud import bigquery
import google.cloud.logging
import logging
bq = bigquery.Client()
sql = "select * from `unco`"
results = bq.query(sql)
row_counts = 0
for row in results:
bq_insert = bigquery.Client()
sql_insert = "insert into `benki` (a) values ('" + str(row.size) + "')"
logging.warning('### unco.size ' + str(row.size) + ' ###')
row_count += 1

#Python pubsubデータ藹??得(pubsub pushの場合)
requirements.txt
google-cloud-logging==3.2.2
----
import base64
import json
import google.cloud.logging
import logging
pubsub_data = base64.b64decode(event["data"]).decode("utf-8")
logging.warning('### pubsub data ' + str(pubsub_data) + ' ###')
json_pubsub_data = json.loads(pubsub_data)

#Python slack送菫?
requirements.txt
google-cloud-secret-manager==2.12.6
----
import requests
from google.cloud import secretmanager
import json
def slack_post(message):
client = secretmanager.SecretManagerServiceClient()
resource = "projects/12345678901/secrets/secretkey_xxx/versions/latest"
res = client.access_secret_version(name=resource)
slack_url = res.payload.data.decode("utf-8")
payload = {
"text": message,
}
notify = requests.post(slack_url,data=json.dumps(payload))
if notify.status_code != requests.codes.ok:
print("error")
else:
print("posted at slack url")
slack_post('続き縺?<http://yahoo.com| こちら>をクリックして縺?ださい)

@ .dockerignore
Dockerfile
README.md
*.pyc
*.pyo
*.pyd
__Pycache__
.pytest_cache

@ Dockerfile
FROM python:3.10-slim
ENV PYTHONUNBUFFERED True
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./
RUN pip install --no-cache-dir -r requirements.txt
RUN pip install Flask gunicorn
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

@ Dockerfile
FROM python:3.10-slim
WORKDIR /app
COPY app /app
RUN pip install -r requirements.txt --proxy=http://proxy:3128
CMD["python", "main.py"]

■Slack通遏?
incoming webhookかSlack apiの最菴?2種饅??がある
Slack apiで縺?ts(timestamp)が藹??得できスレッド返信ができるが、incomingは投稿だけ。incomingは管理画面縺?URLを藹??得しそこ縺?Postすることで投稿ができる(URLのみで觸??洩すると誰でも投稿できる、ど縺?Slackアプリが投稿しているか分かるの縺?URLローテすれば良いが)。
api縺?Slack固藹??のエンドポイントがありトークンをベアラに入れチャネル名を指定して投稿ができる。管理画面でトークン藹??得と権限スコープの設定をし、チャネル側縺?apiアプリの藹??け入れをintegrations設藹??する
URLあるいはトークンをGCPシク繝?MGRに入れて、アプリで読縺?EP縺?http通信する
APIのテスト送信ができる

■Oauth関騾?
ローカルの場合(VirtualBoxとか)
 1) gcloudでログインをし縺?Python実行する
OauthクライアントIDの場合
 2) ローカ繝?Pythonを実行する縺?Authを聞いて縺?る>ブラウザが立ち臀??がる>ユーザ鐔??証に藹??繧?る
 3) Webアプリだ縺?JS縺?Authを聞縺?> 認証する縺?OauthクライアントIDでな縺?ユーザ鐔??証に藹??繧?る
設藹??方觸??
 OauthクライアントIDをOauth同諢?画髱?>クレデンシャルで臀??成
 デスクトップアプリは臀??記②、Webアプリは臀??記の③縺?ID作成する
 OauthクライアントIDをファイルかsecret mgrに入れ縺?Oauth認証通信をさせる
  竭?flow = InstalledAppFlow.from_client_secrets_file(credentials, SCOPES) 
  竭?flow = InstalledAppFlow.from_client_config(json.loads(credentials), SCOPES)
サービスアカウントの場合
 4) Cloud run等のサーバがOauth通信で鐔??証し外部サービスを使う
設藹??方觸??
 SAキーをファイルかsecret mgrに入れてプログラムからOauthで鐔??証させ外部サービスを使う
  EPはホスト名+パスだが、target_audienceはホスト名

GCP縺?Oauthについ縺?
https://www.marketechlabo.com/python-google-auth/

Docs API
https://developers.google.com/docs/api/how-tos/documents?hl=ja#python
https://rimever.hatenablog.com/entry/2019/10/16/060000
スコープ
https://developers.google.com/identity/protocols/oauth2/scopes?hl=ja#docs
google-api-python-client OAuth 2.0
https://googleapis.github.io/google-api-python-client/docs/oauth.html
Oauthライブラ繝?
https://google-auth.readthedocs.io/en/stable/reference/google.oauth2.credentials.html
https://google-auth-oauthlib.readthedocs.io/en/latest/reference/google_auth_oauthlib.flow.html
https://googleapis.dev/python/google-auth-oauthlib/latest/reference/google_auth_oauthlib.helpers.html
https://google-auth-oauthlib.readthedocs.io/en/latest/_modules/google_auth_oauthlib/flow.html#Flow.from_client_config 
Oathライブラリのソースコード
https://github.com/googleapis/google-auth-library-python-oauthlib/blob/main/google_auth_oauthlib/helpers.py
OauthクライアントIDの臀??様
https://github.com/googleapis/google-api-python-client/blob/main/docs/client-secrets.md
サービスアカウントで藹??部サービス縺?APIを使う
https://www.coppla-note.net/posts/tutorial/google-calendar-api/
SAのサービス間認証の臀??様
https://cloud.google.com/run/docs/authenticating/service-to-service?hl=ja#use_the_authentication_libraries
Webアプリ縺?Oauth認險?
https://github.com/googleworkspace/python-samples/blob/main/drive/driveapp/main.py
https://stackoverflow.com/questions/10271110/python-oauth2-login-with-google

■Oauthについ縺?
下記の藹??な縺?とも下記の種類があり、クライアントライブラリやコード等々で違いで使い分ける必要がある。今回縺?SA+シク繝?mgrを使用した。
-ローカ繝?(gcloud auth login と鐔??險?)
-OauthクライアントID (アプリ臀??で鐔??証が個人ユーザに藹??き継がれる)
 -デスクトップ
 -Webアプ繝?(jsでサイト上)
-サービスアカウント
 -キーファイ繝?
 -シク繝?mgr

使用ライブラリーに注諢?
1) OauthクライアントID (ローカルファイ繝?)
from google_auth_oauthlib flow import InstalledAppFlow
flow = InstalledAppFlow.from_client_secrets_file("credentials.json", SCOPES)
creds flow.run_local_server(port=0)

2) ローカルにおいたSAキ繝?
from google auth import load_credentials_from_file
creds = load_credentials_from_file('credentials.json', SCOPES)[0]

3) Secret mgrにおいたSAキ繝?
import json
from google.oauth2.service_account import Credentials
from google.cloud import secretmanager
client = secretmanager.SecretManagerServiceClient()
resource_name = "projects/()/secrets/{}/versions/latest" format(project_num, secret_name)
res = client.access_secret_version(name=resource_name)
credentials = res.payload.data.decode("utf-8")
cred_dict=json.loads(credentials)
creds = Credentials.from_service_account_info(cred_dict, scopes=SCOPES)
creds.refresh(Request())

窶?) これは使繧?ない
from google.oauth2.service_account import IDTokenCredentials
#ファイルから
credentials = IDTokenCredentials.from_service_account_file(service_account,target_audience=target_audience)
#シク繝?mgrから
credentials = IDTokenCredentials.from_service_account_info(service_account.target_audience=target_audience)

ライブラリーのソースコード本臀??や仕様譖?
https://github.com/googleapis/google-auth-library-python-oauthlib/blob/main/google_auth_oauthlib/helpers.py
https://googleapis.dev/python/google-auth-oauthlib/latest/reference/google_auth_oauthlib.helpers.html
https://google-auth-oauthlib.readthedocs.io/en/latest/reference/google_auth_oauthlib.flow.html
https://google-auth-oauthlib.readthedocs.io/en/latest/_modules/google_auth_oauthlib/flow.html#Flow.from_client_config

サービスアカウントのライブラリ情蝣?
https://google-auth.readthedocs.io/en/master/reference/google.auth.html
https://google-auth.readthedocs.io/en/master/reference/google.oauth2.service_account.html#module-google.oauth2.service_account
https://qiita.com/que9/items/38ff57831ea0e435b517


Posted by funa : 12:00 AM | Web | Comment (0) | Trackback (0)


March 30, 2022

GCP runs off functions pubsub on scheduler
Cloud run:言語自由、リクエストタイム60分
Cloud run functions:リクエスト9分、関数をデプロ繧?
Cloud run jobs: httpが要るがジョブ実行させる
Cloud run worker pools: pubsubやKafkaのようなメッセージキュー縺?pullする(インスタンス数は手動調整・??モニターして自動変更を作りこむとかはアリ・??
  gke auto pilot mode:制限がな縺?なる
Cloud Run で臀??るサーバーレ繧? アーキテクチ繝? 23 連逋? - これのときはこう! (zenn.dev)

■RUN
httpリクエストでコンテナを呼び出す
Google Cloud Run を使うま縺? - Qiita

■繝?ンズオ繝?(run)
クイックスタート: ビルドとデプロ繧?  |  Cloud Run のドキュメント  |  Google Cloud
クイックスタート: Cloud Run 縺? Python サービスをデプロイする  |  Cloud Run のドキュメント  |  Google Cloud
基本縺?Flask縺?http responseを返すコードである必要があるみたいだ
 Scheduler手動 > Pubsub > Eventarc > Cloud runのでキックで藹??行がいい
ローカルやterminalなどで臀??成しcmdでレジストリに入れるが、~/unco で臀??記作成
 Dockerfile
 .dockerignore
 main.py
コンテナイメージにパッケージ化しContainer Registry にアップロード
 gcloud auth application-default login
 gcloud run deploy (対話型でデプロイまでできるが、SAはデフォルトになる)
 gcloud builds submit --tag gcr.io/bangboo-run/unco (ビルドのみ、手動でコンソール縺?SAを指定しデプロイする)
  gcloud builds submit --pack image=gcr.io/bangboo-run/unco ならDockerfile不要らしい
コンソールでデプロイ・??trigger/permission)-譁?ver更新のときTagを付けなおす?
 設藹??allow all trafic縺?Allow unauthenticated invocations、権限allUsers縺?Cloud Run Invokerではブラウザでも上手行縺?
 設藹??allow all trafic縺?require auth(IAM)、権限allAuthenticatedUsers縺?Cloud Run Invokerのとき
  IAMが要るのでターミナルから
  curl https://unco-zp2aehj5rq-an.a.run.app/ で縺?IAM要求の場合は饅??逶?
  curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://unco-zp2aehj5rq-an.a.run.app/ で臀??手行縺?
 設藹??allow internal traffic only縺?require auth(IAM)、権限allAuthenticatedUsers縺?Cloud Run Invokerのとき
  ターミナル縺?internal trafficでないから
  curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://unco-zp2aehj5rq-an.a.run.app/ でも駄逶?
インターナル縺?IAMを使うにはどうする?(同セグメントvpcからcurl bearer、vpc scかpubsubかEventarcだけ、terminalやschdulerは饅??目・??
 →IAMを使うならallow all traficでいいのでは、allusers縺?invokerを付荳?しなければいいし
 →怖ければ同セグメント縺?VMを立ててそこからキック、あるい縺?Scheduler手動 > Pubsub > Eventarc > Cloud runがいい
runのデフォルト縺?SAは別縺?runでも同じSA実行として使い回されるので、別途作成したものを指定したい
 デプロイをコンソールで藹??行するとサービスアカウントを指定できる(run縺?Permissonでそ縺?SA縺?invokerを付ける)
ブラウ繧?+IAMをrunで使うに縺?IAP
 global ip、ドメイン、DNS、証譏?書、設藹??allow all trafic縺?require auth(IAM)、権限各メー繝?id縺?invoker
LBはバックエンド縺?serverless network end groupを選べばいい

/// IAP
(古い方觸??)
IAPを使う場合はトリガーをAllow unauthenticated invocationsにする
 現鐔??だけだそうだが、IAPに全藹??任するために藹??要となっている
 つまりIAP縺?LBが必要なため、Allow internal taraffic and from cloud load balancingとのコンビでトリガー設定をする
権限縺?Cloud run縺?allusersが付き個別縺?invokerは臀??要となり、必要なもの縺?IAP上で臀??荳?をする
 IAP上縺?Web app user縺? Allautheticatedusersを入れると、識別できる誰でも入れてしまう
 アクセスを許可したいユーザのみ個別縺?web app userをIAPで臀??荳?するこ縺?
IAP で臀??護されたリソースへのアクセスの管理  |  Identity-Aware Proxy  |  Google Cloud

(新しい方觸??)
特藹??のユーザだけCloudRunを利用させてたいなら:
 (run)認証ユーザ・??(run)内部トラフィック縺?LB経由・??IAP縺?webuserの設定
 Cloud run縺?IAPを使用するIAP用隠れSAの権限:
  プリンシパ繝?: service-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com
  ロー繝?: Cloud Run invoker
AllUsersでな縺?、上記縺?IAP用隠れSAに権限を振れ縺?IAPがrunを起動する
 利用ユーザ縺?IAP縺?webuserの権限を荳?える

===
dockerfileに鐔??載
FROM google/cloud-sdk:latest
 Pythonモジュールでな縺?OS側にインストールする必要がありコンテナ化縺?Dockerfileに鐔??載できる
 /// BANGBOO BLOG /// - k8s 縺?Docker記載がある
FROM python:3.9-slim
ENV PYTHONUNBUFFERED True
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./
#RUN pip install --no-cache-dir -r requirements.txt
RUN pip install Flask gunicorn
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

 python requirements.txtで縺? google-cloud-bigqueryはインスコできるがsdkは無理
  main.py縺? from google.cloud import bigquery
  Dockerfileでイメージ縺?google-cloud-sdkが入れ縺?Python縺?subprocess縺?gcloud cmdが打てる
  Dockerのベースイメージを FROM google/cloud-sdk:latest にし縺?
   RUN apt-get update && apt-get install -y \
    python3-pip
   RUN pip install --no-chache-dir -r requirements.txt
  Cloud API client library for pythonを使うに縺?requirements.txt縺?
   google-api-python-client

Dockerfileの動作縺?Cloud build縺?historyで鐔??れる
RUN which gcloud
RUN echo $PATH

OSの藹??行ユーザとコンテナ内のユーザを合繧?せないとファイル読み込み軆??ができない
 permission deniedになる
 Cloud runのそれぞれのユーザが誰なのか分からない(上記で繧?かるが)
 Dockerfile縺? RUN chmod -R 777 /app と入れてしまう

===
Cloud Run のトリガーを作成する  |  Eventarc  |  Google Cloud
run縺?scheduler/pubsubの連携縺? eventarc triggerの設定が良さそう
これ縺?Audit logに既藹??のものが記載されると発火されるというも縺?
 設藹??したrunのサービスのトリガー項目縺?
  google.cloud.scheduler.v1.CloudScheduler.Run.Jobを設藹??(スケジューラ手動実行ならこれでも連携する)
  google.cloud.pubsub.topic.v1.messagePublishedを設藹?? (Pubsub経由縺?EventArcなら)
 色ん縺?API有効が必要 クイックスタート: Pub/Sub メッセージを使用してイベントを藹??信する(Google Cloud CLI)  |  Eventarc
Schedulerとの連携に使う場合、手動実行縺?Audit logに鐔??載され動縺?が、cron定期実行ならAudit logがな縺?動作しない事が分かった
 internal trafficなら Scheduler > Pubsub > Eventarc > Cloud run

■Scheduler
 get で https://run-service-name-.kuso.run.app
 0 7 * * 1 豈?週月曜縺?6時
 Auth header縺? add OIDC token
 runのサービス縺?invokerを付けたSAを指定
 5回リトラ繧?/最大リトラ繧?0sで制限なし/バックオフ最蟆?180s最螟?1h/期間倍5回
  サービスアカウント縺?Cloud service agentロールが必要

===
■Run jobs
runはジョブならFlask不要で簡易。だがEventarc-Schedule連携がまだGAでな縺?できないので単発手動実行用。

Procfile作成
web: python3 main.py

pipしたいもの縺? requirements.txtに書縺?
 バージョンは google-cloud-bigquery · PyPIで調べる
google-cloud-bigquery==3.3.2

main.py作成
コードを書縺? from google.cloud import bigquery

gcloud auth application-default login
 run job実行とコンテナのプロジェクトを合繧?すなら
 gcloud config set project bangboo-runs
 下記は通常臀??要なようだ
 gcloud auth configure-docker

Buildpackを使用してコンテナをビルド
 Cloud buildデフォルトサービスアカウント縺?GCSバケット権限必要 123456@cloudbuild.gserviceaccount.com
gcloud builds submit --pack image=gcr.io/bangboo-runs/run_data_to_bq
 bangboo-runsのコンテナレジストリ縺?run_data_to_bqができている

Cloud runでジョブを作成
gcloud beta run jobs create job-run-data-to-bq \
    --image gcr.io/bangboo-runs/run_data_to_bq \
    --task 1 \
    --set-env-vars SLEEP_MS=10000 \
    --set-env-vars FAIL_RATE=0.5 \
    --max-retries 0 \
    --region asia-northeast1
(gcloud beta run jobs create --helpで鐔??る縺?env-varの繝?ンドルは臀??もないのでコードでエラースローする必要がありそう、そこでスリープとか使ってエラーを吐縺?と、リトライはして縺?れそう。taskを複数にすると同時に臀??個も動く)

ローカルでテスト
docker run --rm -e FAIL_RATE=0.9 -e SLEEP_MS=1000 gcr.io/bangboo-runs/run_data_to_bq

Cloud runでジョブを実行
gcloud beta run jobs execute job-run-data-to-bq

============
from flask import Flask #モジュール読み込縺?
app = Flask(__name__) #Webアプリ臀??成
@app.route("/", methods=["GET","POST"]) #エンドポイント設藹??(ルーティン繧?)
def index():
if __name__ == '__main__': #Webアプリ起動
  app.run(debug=True)

request.form.get('name', None) 隨?2引数にデフォルト値入れられるらしい

■Flask LBでパスを分ける場合
LB
 sub.domain.com /* backend-1
 sub.domain.com /dir/* backend-2
Flask
 @app.route("/dir/index", methods=["GET","POST"])
 ドメインがこの場合:https://sub.domain.com/dir/index
 Flaskには元のルートパスから指定する
●外部ファイル縺?staticフォルダはカスタムルートが必要
 Flaskルートの指定になるの縺?/static/等になりLBで振り分けた場合は都合が悪い
 Cloud runルートからの指定とし縺?/dir/static/style.css等にするにはカスタムルートが必要
Python flask
 from flask import Flask, send_from_directory
 @app.route('/dir/static/<path:filename>')
 def custom_static(filename):
  return send_from_directory('static', filename)
Python flask html
 <link rel="stylesheet" href="{{ url_for('custom_static', filename='style.css') }}">
 トップレベル縺?staticフォルダを作り静的ファイルを入れる
ブラウザ表遉?
 <link rel="stylesheet" type="text/css" href="/dir/static/style index.css">

■Flask jinja2
{# comment #} テンプレートのコメント
Template Designer Documentation — Jinja Documentation (3.1.x) (palletsprojects.com)

============
■functions
コンソールでコード書いてもデプロイエラーになると入力分が消える糞
 テキストで書いてコンソールにペーストしてやった
 開発環藹??はローカルにすべきだろう縺?
 【Python】Cloud Functions ローカル環藹??で開逋? デプロ繧? | のい太ろぐ (noitalog.tokyo)
 Cloud Functionsのローカル開発環藹??縺?Function Frameworkを使用する (rhythm-corp.com)
functionsもhttpで初めに藹??行される関数縺?Flask縺?flask.Requestオブジェクトを藹??藹??る
 PubsubトリガーとかEventarcトリガーもあるようだ
  pubsubトリガーならinetrnal traffic only縺?OKだが、https縺?all traffic必要
requirementsは藹??要?標準ライブラリならimport文を本臀??に書いていれば良い
 pprint.pprintでエラー、requirementsの場合PyPIで調べてバージョンも書こう
一時ファイル縺?/tmpというDIRであるがメモリーに臀??持される
テスト縺?JSONを書縺?場合はキッチリ書く(文字はダブルクォート等)
{
"test" : "aaa"
}
functions invoker等縺?IAMはプロジェクトレベルではな縺?各functionsに対しての設定が必要そう
functionsのデプロイ時縺?internal traffic や allow all trafic等の藹??更ができる
名前の藹??更や連携藹??更縺?functions再作成が必要で面倒

functions で縺? gcloud cmdが打てない、SDKがないから
 クライアントライブラリでは・?? > 非力そう、、cloud runならSDK縺?Dockerしgcloud cmd打てる
 Cloud クライアント ライブラ繝?  |  Cloud APIs  |  Google Cloud

Functionsはデフォルトで環藹??変数を持ってい縺?import os > os.getenv()で藹??得できる
ENTRY_POINT 実行される関数、GCP_PROJECT 現在縺?GCPプロジェクトIDとか

■pubsub
GCP - Pub/Sub サービス觸??要 - Qiita
https://www.bangboo.com/cms/blog/page_378.html
topicという入れ迚?
 メッセージがpublish投入される(コンソールでも作れるの縺?internal trafficのトリガーにできる)
 subscription縺?Topicのデータ藹??得状觸??を管理
 subscriptionからsubscribeでメッセージの藹??得
メッセージは重複する仕様
 Topicにメッセージを入れると勝手に軆??づけられたアプリが動縺?
  フィルターがあり条件を設藹??をできるがTopicを沢山作ればいいので縺?
 サブスク縺?pullはメールボックスみたいな入るだけ
  functions縺?pubsubで臀??った指定縺?Topicにメッセージが入れば動縺?
 サブスク縺?pushも送信メールボックスみたいで送る
  functions縺?httpで臀??ったエンドポイントに送られる
 pullは鐔??に臀??手く行かな縺?なる?pushの方が安定かも
  でもトラフィックの種類縺?pullならinternal traffic OK
   pubsub pull -> functions:pull なら internal traficでもOK
   pubsub push -> functions:push 縺? http なの縺? internal traficダ繝?
 functionsのデプロイ時縺?internal traffic や all等の藹??更もできる
例え縺?Run縺?Trigger縺?EventarcをPubsubで設定すれば指定縺?Topicに勝手にサブスクを作って縺?れる

pubsubを使うとき縺?runとかfunctionsとかインスタン繧?1つの方がいい
 べき等性の觸??成がなければバッチが勝手にリトライされ同時処理が起こる等で面倒
pubsubのリトライ無しで、returnで臀??とかhttp200レスポンスを返す
 pythonだ縺?main()でエラーでもtry-exceptで投げ縺?returnを返す縺?http200になる
 ackを返す時間デフ繧?10sであり処理が長いと饅??目、-600sと長縺?するといい

pubsub縺?base64ででコードするの縺?import base64
pubsub縺?jsonでデータを持ってい縺?import json

Posted by funa : 07:59 PM | Web | Comment (0) | Trackback (0)


Navi: <  1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14  >