2025/07/18

EC2でWindows Serverの設定あれこれ

## 使用するOSバージョンとAMIの選定
[AWS が Amazon EC2 での Microsoft Windows Server 2025 イメージの提供開始を発表](https://aws.amazon.com/jp/about-aws/whats-new/2024/11/microsoft-windows-server-2025-images-amazon-ec2/)

### 日本語版の事前構成済みWindows ServerのAMIを検索
```
$ aws ec2 describe-images \
  --owners amazon \
  --filters "Name=name,Values=*Windows_Server-2025-Japanese-Full-Base*" \
  --region ap-northeast-1 \
  --query "Images[*].{ID:ImageId,Name:Name}" \
  --output table
--------------------------------------------------------------------------------
|                                DescribeImages                                |
+------------------------+-----------------------------------------------------+
|           ID           |                        Name                         |
+------------------------+-----------------------------------------------------+
|  ami-041265d23fd7eaf09 |  Windows_Server-2025-Japanese-Full-Base-2025.04.09  |
|  ami-04e928802ea4517df |  Windows_Server-2025-Japanese-Full-Base-2025.07.09  |
|  ami-096a6fcfb661eadd3 |  Windows_Server-2025-Japanese-Full-Base-2025.06.11  |
|  ami-09f374e94cc2615d3 |  Windows_Server-2025-Japanese-Full-Base-2025.05.15  |
+------------------------+-----------------------------------------------------+
```

「ami-04e928802ea4517df」を使用する。

## OS設定
### インストール言語の確認
```
PS C:\Users\Administrator> Get-WinUserLanguageList


LanguageTag     : ja
Autonym         : 日本語
EnglishName     : Japanese
LocalizedName   : 日本語
ScriptName      : 日本語
InputMethodTips : {0411:{03B5835F-F03C-411B-9CE2-AA23E1171E36}{A76C93D9-5523-4E90-AAFA-4DB112F9AC76}}
Spellchecking   : True
Handwriting     : True
```

### 優先言語の確認
```
PS C:\Users\Administrator> Get-SystemPreferredUILanguage
ja
```

### ロケール設定の確認
```
PS C:\Users\Administrator> Get-WinSystemLocale

LCID             Name             DisplayName
----             ----             -----------
1041             ja-JP            日本語 (日本)
```

### タイムゾーンの確認
```
PS C:\Users\Administrator> Get-TimeZone

Id                         : UTC
DisplayName                : (UTC) 協定世界時
StandardName               : 協定世界時
DaylightName               : 協定世界時
BaseUtcOffset              : 00:00:00
SupportsDaylightSavingTime : False
PS C:\Users\Administrator>
PS C:\Users\Administrator> Set-TimeZone -Id "Tokyo Standard Time"
PS C:\Users\Administrator>
PS C:\Users\Administrator> Get-TimeZone

Id                         : Tokyo Standard Time
DisplayName                : (UTC+09:00) 大阪、札幌、東京
StandardName               : 東京 (標準時)
DaylightName               : 東京 (夏時間)
BaseUtcOffset              : 09:00:00
SupportsDaylightSavingTime : False
```

### ホームロケーションの確認
```
PS C:\Users\Administrator> Get-WinHomeLocation

GeoId HomeLocation
----- ------------
  122 日本
```

### Windows Updateの実施(CLIモジュールは別途インストール済)
```
PS C:\Users\Administrator\Documents> Install-WindowsUpdate -MicrosoftUpdate
PS C:\Users\Administrator\Documents>
```

## RDS for MySQL 接続用クライアントの導入
### ダウンロード
以下からMySQL Community Server 8.4.5 LTSをダウンロードしてClientプログラムのみインストール
https://dev.mysql.com/downloads/mysql/8.4.html

Pathにbinフォルダを追加

### 確認
```
C:\Users\Administrator>mysql --version
mysql  Ver 8.4.5 for Win64 on x86_64 (MySQL Community Server - GPL)

C:\Users\Administrator>
```

### RDSへの接続確認
```
C:\Users\Administrator>mysql -h <エンドポイント名> -u admin -p
Enter password: ********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.4.5 Source distribution

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

### データベース設定
```
mysql> CREATE DATABASE hogedb CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
Query OK, 1 row affected (0.00 sec)

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| hogedb           |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> CREATE USER 'hogeuser'@'%' IDENTIFIED BY 'xxxxxxxx';
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT ALL PRIVILEGES ON hogedb.* TO 'hogeuser'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GRANTS FOR 'hogeuser'@'%';
+--------------------------------------------------------+
| Grants for hogeuser@%                                  |
+--------------------------------------------------------+
| GRANT USAGE ON *.* TO `hogedb`@`%`                   |
| GRANT ALL PRIVILEGES ON `hogedb`.* TO `hogeuser`@`%` |
+--------------------------------------------------------+
2 rows in set (0.00 sec)

mysql>
```

## CloudWatchAgentの導入
### MSI パッケージのダウンロード
```
Invoke-WebRequest -Uri "https://amazoncloudwatch-agent.s3.amazonaws.com/windows/amd64/latest/amazon-cloudwatch-agent.msi" -OutFile "amazon-cloudwatch-agent.msi"
```

### インストールの実行
```
msiexec /i amazon-cloudwatch-agent.msi
```
インストール先「C:\Program Files\Amazon\AmazonCloudWatchAgent」

### 設定ウィザードの起動(初期構成ファイル作成)
```
cd "C:\Program Files\Amazon\AmazonCloudWatchAgent"
.\amazon-cloudwatch-agent-config-wizard.exe
```

### IAM ロールの確認(EC2 にアタッチ)
- CloudWatchAgentServerPolicy
- AmazonSSMManagedInstanceCore(SSM 経由で管理する場合)

### Agent 起動と設定反映
```
& "$Env:ProgramFiles\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1" `
  -a fetch-config -m ec2 -s `
  -c file:"$Env:ProgramFiles\Amazon\AmazonCloudWatchAgent\config.json"
```
```
****** processing amazon-cloudwatch-agent ******
I! Trying to detect region from ec2
D! [EC2] Found active network interface
I! imds retry client will retry 1 timesSuccessfully fetched the config and saved in C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs\file_config.json.tmp
Start configuration validation...
2025/07/17 11:37:58 Reading json config file path: C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs\file_config.json.tmp ...
2025/07/17 11:37:58 I! Valid Json input schema.
I! Trying to detect region from ec2
D! [EC2] Found active network interface
I! imds retry client will retry 1 times2025/07/17 11:37:58 D! ec2tagger processor required because append_dimensions is set
2025/07/17 11:37:58 D! ec2tagger processor required because append_dimensions is set
2025/07/17 11:37:58 Configuration validation first phase succeeded
Configuration validation second phase succeeded
Configuration validation succeeded
AmazonCloudWatchAgent has been stopped
AmazonCloudWatchAgent has been started
```

### 動作確認(ステータス表示)
```
& "$Env:ProgramFiles\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1" -a status -m ec2
```
```(実行結果)
{
  "status": "running",
  "starttime": "2025-07-17T11:37:59",
  "configstatus": "configured",
  "version": "1.300057.0b1161"
}
```

## JDK 1.8.0_231
### ダウンロードとインストール
以下のアーカイブから「jdk-8u231-windows-x64.exe」をダウンロード
https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html

### 環境変数設定(システム)
JAVA_HOME = C:\Java\jdk1.8.0_231
Path に %JAVA_HOME%\bin を追加

### 動作確認
```
C:\Users\Administrator>java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)

C:\Users\Administrator>
```

## Apache 2.4
### ダウンロードとインストール
以下から「Apache 2.4.64-250710 Win64」をダウンロード
https://www.apachelounge.com/download/

C:Apache24へ展開

### httpd.confを修正
SSLとTomcat連携以外の設定項目は、現行に合わせて指定する。

### 自己署名SSL証明の作成
```
# 自己署名SSL証明の作成
cd C:Apache24\bin
openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -keyout server.key -out server.crt

# 以下へ保存
C:\Apache24\conf\ssl\server.key
C:\Apache24\conf\ssl\server.crt
```

### 証明書の検証
```
c:\Apache24\bin>openssl.exe x509 -in ..\conf\ssl\server.crt -text -noout
Certificate:

```

### HTTPS対応 VirtualHost の設定(httpd-ssl.conf)
```
Listen 443
<VirtualHost *:443>
DocumentRoot "${SRVROOT}/htdocs"
# Elastic IPを指定
ServerName xx.xx.xx.xx
ErrorLog "${SRVROOT}/logs/ssl_error.log"
CustomLog "${SRVROOT}/logs/ssl_access.log" combined
SSLEngine on
SSLCertificateFile "${SRVROOT}/conf/ssl/server.crt"
SSLCertificateKeyFile "${SRVROOT}/conf/ssl/server.key"

<Directory "${SRVROOT}/htdocs">
  Options Indexes FollowSymLinks
  AllowOverride None
  Require all granted
</Directory>
<Location /testweb/>
    ProxyPass ajp://localhost:8009/testweb/
</Location>
</VirtualHost>
```

Include httpd-ssl.conf を httpd.conf に追加して有効化。

### 設定ファイルの構文チェック
```
c:\Apache24\bin>httpd -t
Syntax OK
```

### Apacheのサービス登録
管理者権限でコマンドプロンプトを起動
```
C:\Users\Administrator>cd C:\Apache24\bin
C:\Apache24\bin>httpd -t
Syntax OK

# サービス登録
C:\Apache24\bin>httpd.exe -k install -n "Apache24"
Installing the 'Apache24' service
The 'Apache24' service is successfully installed.
Testing httpd.conf....
Errors reported here must be corrected before the service can be started.

# 遅延開始に変更(Tomcatの後に起動したいため)
C:\Apache24\bin>sc config Apache24 start= delayed-auto
[SC] ChangeServiceConfig SUCCESS

# 起動・停止コマンド
net start Apache24
net stop Apache24
```

## Tomcat 6.0
### ダウンロードとインストール
以下から「apache-tomcat-6.0.53-windows-x64.zip」をダウンロード
https://archive.apache.org/dist/tomcat/tomcat-6/v6.0.53/bin/

C:Tomcat6.0へ展開

### conf/server.xmlを修正
- HTTP用のConnectorを現行に合わせて修正(使われてないと思う・・;)
```
<Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="180000" 
               maxParameterCount="30000"
               maxPostSize="4194304"
               redirectPort="8443" />
```

- AJP用のConnectorを現行に合わせて修正
```
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" 
               connectionTimeout="180000" 
               maxParameterCount="60000"
               maxPostSize="209715200" />
```

### conf/Catalina/localhost/testweb.xmlを修正(アプリ側かな・・;)
```
<Context path="/testweb" reloadable="false" docBase="C:\testweb\WebContent"  >
        <Resource name="jdbc/testdb"
                  auth="Container"
                  type="javax.sql.DataSource"
                  factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
                  driverClassName="com.mysql.cj.jdbc.Driver"
                  url="jdbc:mysql://<エンドポイント名>:3306/hogedb?useSSL=false&serverTimezone=Asia/Tokyo"
                  username="hogeuser"
                  password=""
                  maxActive="100"
                  maxIdle="10"
                  removeAbandoned="true"
                  removeAbandonedTimeout="180"
                  logAbandoned="true" />
</Context>
```

### 手起動
```
C:\tomcat6\bin\startup.bat
```

### Tomcatのサービス登録

管理者権限でコマンドプロンプトを起動
```
c:\>cd c:\Tomcat6.0\apache-tomcat-6.0.53\bin

c:\Tomcat6.0\apache-tomcat-6.0.53\bin>
c:\Tomcat6.0\apache-tomcat-6.0.53\bin>service.bat install
Installing the service 'Tomcat6' ...
Using CATALINA_HOME:    "c:\Tomcat6.0\apache-tomcat-6.0.53"
Using CATALINA_BASE:    "c:\Tomcat6.0\apache-tomcat-6.0.53"
Using JAVA_HOME:        "C:\Program Files\Java\jdk1.8.0_231"
Using JRE_HOME:         "C:\Program Files\Java\jdk1.8.0_231\jre"
Using JVM:              "C:\Program Files\Java\jdk1.8.0_231\jre\bin\server\jvm.dll"
The service 'Tomcat6' has been installed.

c:\Tomcat6.0\apache-tomcat-6.0.53\bin>
c:\Tomcat6.0\apache-tomcat-6.0.53\bin>sc config Tomcat6 start= auto
[SC] ChangeServiceConfig SUCCESS

c:\Tomcat6.0\apache-tomcat-6.0.53\bin>
```


## Apache と Tomcat の連携
### Apache ↔ Tomcat(mod_proxy_ajp)リクエスト連携の流れ
```
sequenceDiagram
  Client->>Apache: https://xx.xx.xx.xx/testweb/
  Apache->>Apache: Location /testweb/ に一致
  Apache->>Tomcat: AJPでリクエスト転送 (8009ポート)
  Tomcat->>Apache: AJPレスポンス返却
  Apache->>Client: レスポンス送信(HTML等)
```

### 連携方式(Apache側の設定方法として2通り)
- mod_jk方式
 mod_jk.soモジュールを使い、JkMountディレクティブやworkers.propertiesで指定する方式

- ✔リバースプロキシ方式
 mod_proxt_ajp.soモジュールを使い、ProxyPass/Locationで指定する方式

指定内容
```
# モジュールの有効化
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

# 以下を指定
<Location /testweb/>
    ProxyPass ajp://localhost:8009/testweb/
</Location>
```


## Windows環境でのログローテーション
### Apacheログ
1. rotatelogs.exe(Apache付属)
```
CustomLog "|bin/rotatelogs.exe logs/access_%Y%m%d.log 86400 540" combined
ErrorLog "|bin/rotatelogs.exe logs/error_%Y%m%d.log 86400 540"
```

2. PowerShellバッチで削除処理
```
# 例)7日以上前のログを削除
Get-ChildItem "C:\Apache24\logs\access_log*.log" | Where-Object {
  $_.LastWriteTime -lt (Get-Date).AddDays(-7)
} | Remove-Item
```
タスクスケジューラで毎日実行

### Tomcatログ
- %CATALINA_HOME%\conf\logging.properties にて自動ローテーション設定。

2025/07/13

AWSとAzureの対応表(早見表)

---

## 地理構成・リージョン設計

| AWS | Azure | 説明 |
|-----|-------|------|
| - | ジオ | Azure独自の地理的分類単位 |
| リージョン | リージョン | データセンター群の配置単位 |
| - | リージョンペア | DR用途の2リージョンの組み合わせ|
| アベイラビリティゾーン | 可用性ゾーン | 同一リージョン内の独立したデータセンター群 |

---

## 組織・アカウント構造

| AWS | Azure | 説明 |
|-----|-------|------|
| Organizations(管理アカウント) | テナント | AWSは構成・ポリシー管理の起点、AzureはID・認証の論理最上位 |
| アカウント | サブスクリプション | 課金・リソース管理単位 |
| OU | 管理グループ | 階層的な構成管理単位 |
| SCP | Azure Policy | 組織的なポリシー制御 |
| ConfigSet | イニシアチブ | ポリシーのグループ化 |

---

## 課金体系・料金モデル

| AWS | Azure | 説明 |
|-----|-------|------|
| オンデマンド | Pay-As-You-Go | 従量課金制。AWSは秒単位、Azureは分単位 |
| リザーブドインスタンス(RI) | 予約インスタンス | 長期契約割引(1年/3年) |
| Savings Plans | Azure Savings Plan | 柔軟な割引プラン |
| スポットインスタンス | Spot Virtual Machines | 低価格リソース。中断可能 |
| Cost Explorer | Azure Cost Management | 使用量と課金状況の可視化 |
| Budgets | Azure Budgets | 予算設定と通知管理 |
| Pricing Calculator | 料金計算ツール | 製品構成に応じた月額コスト試算 |
| TCO Calculator | TCO計算ツール | オンプレとの総所有コスト比較 |
| ネットワーク転送料金 | ネットワーク転送料金 | アウトバウンド通信は有料 |

---

## 認証・ID管理

| AWS | Azure | 説明 |
|-----|-------|------|
| IAM | Azure AD(Entra ID) | 組織内IDとアクセス制御 |
| Identity Center | Entra ID / SSO | SSOと属性ベース権限管理 |
| Amazon Cognito | Azure AD B2C | アプリ向けユーザー認証 |
| Identity Pools | 外部IDフェデレーション | Google, Facebook などとの連携 |
| MFA(IAM / Cognito) | Azure AD MFA | 多要素認証 |
| JWTトークン | OpenID Connect | 認証後トークン発行と検証 |
| IAM Role | Azure Managed Identity | リソースアクセス用の一時的な権限付与(アプリ・サービス向け) |
| - | Entra Role | ID管理権限(ユーザー・グループ・アプリの操作) |
| IAM Policy | Azure Role(RBAC) | リソースに対する操作権限の定義 |

---

## 操作・テンプレート・構成管理ツール

| AWS | Azure | 説明 |
|-----|-------|------|
| マネジメントコンソール | Azure Portal | GUIによるリソース操作 |
| AWS CLI | Azure CLI / PowerShell | コマンドラインによるリソース操作 |
| AWS API | ARM(Resource Manager)API | APIによるプログラマブルな管理 |
| CloudFormation | ARM / Bicep テンプレート | Infrastructure as Code(IaC)による構成定義 |
| AWS Service Catalog | Azure Managed Applications | カスタムテンプレートの提供と制御 |
| AWS Systems Manager | Azure Automation / Runbook | 構成管理・パッチ・スクリプト自動化 |
| Copilot CLI | Azure CLI(az containerapp) | コンテナアプリのCLI管理ツール |

---

## コンピューティング

| AWS | Azure | 説明 |
|-----|-------|------|
| EC2 | Virtual Machines | IaaS仮想マシン |
| AutoScaling | VMスケールセット / App Service | スケーリング構成 |
| AWS Batch | Azure Batch | バッチ処理 |
| プレイスメントグループ | 近接配置グループ | 物理的に近い配置 |
| 拡張NIC | 高速ネットワーク | 高性能NIC |
| - | 可用性セット | 障害/更新ドメインによるVM分散(Azure独自) |

---

## ストレージサービス

| AWS | Azure | 説明 |
|-----|-------|------|
| S3 | Blob Storage | オブジェクトストレージ |
| S3バケット | コンテナー | ストレージ単位 |
| EBS | Disk Storage | ブロックストレージ |
| EBS IOPS | Premium Disk | 高IO性能 |
| EFS | Azure Files | ネットワークファイル共有 |
| インスタンスストア | 一時ストレージ | 揮発性ストレージ |
| Snowball | Data Box / Import/Export | 専用デバイスによる物理データ移行。AzureはData Boxが近い |

---

## データベース・メッセージング

| AWS | Azure | 説明 |
|-----|-------|------|
| Amazon RDS | Azure SQL Database | フルマネージドなリレーショナルDB |
| Amazon Aurora | SQL Database | 高性能なRDBエンジン |
| DynamoDB | Cosmos DB | NoSQLキーバリュー型 |
| ElastiCache | Azure Cache for Redis | インメモリキャッシュ(Redis) |
| SQS | Service Bus / Queue Storage | メッセージング(キューベース) |
| SNS | Event Grid | 通知イベントの配信制御 |
| Kinesis | Event Hubs | ストリームデータの処理と転送 |
| Amazon Timestream | Azure Data Explorer / TSI | IoTやログ向けの時系列データ処理サービス |

---

## コンテナ・Kubernetes

| AWS | Azure | 説明 |
|-----|-------|------|
| ECS | Azure Container Apps | マネージドコンテナ実行基盤 |
| EKS | AKS | マネージドKubernetesサービス |
| Fargate | Container Apps / AKS(サーバーレスモード) | サーバーレスなコンテナ実行 |
| ECR | Azure Container Registry | コンテナイメージの管理・配信 |
| App Mesh | Azure Service Mesh(Istio) | マイクロサービス間通信の制御(L7トラフィック) |

---

## データベース移行・スキーマ変換

| AWS | Azure | 説明 |
|-----|-------|------|
| DMS | Database Migration Service | DB移行・同期 |
| SCT | DMA(Migration Assistant) | スキーマ変換と互換性評価 |
| DMS + SCT | DMA + Migrate + Data Factory | 複雑シナリオ対応構成 |

---

## ネットワーク

| AWS | Azure | 説明 |
|-----|-------|------|
| VPC | Virtual Network(VNet) | 仮想ネットワーク |
| VPCピアリング | VNetピアリング | 異なるネットワーク間接続 |
| Site-to-Site VPN | S2S VPN | 拠点間VPN接続 |
| Client VPN | P2S VPN | クライアントVPN |
| - | VNet間VPN | Azure独自のVNet同士VPN構成 |
| Direct Connect | ExpressRoute | 専用線接続 |
| Transit Gateway | Virtual WAN | ハブ型ネットワーク集約 |
| VPCエンドポイント(Gateway型) | サービスエンドポイント | 特定PaaSへのルートベース接続(S3 / DynamoDB) |
| VPCエンドポイント(Interface型) | プライベートエンドポイント | ENIによるPrivate Link接続(NLB等) |
| エンドポイントサービス | Private Link Service | 他VPCへPrivate Linkでサービス提供(提供側) |
| PrivateLink | Private Link | Interface型エンドポイントの基盤技術 |
| Route 53(DNS管理) | Azure DNS | ドメインとDNSレコードの管理 |
| Route 53(ルーティング) | Traffic Manager | DNSベースのトラフィック制御とフェイルオーバー |
| Internet Gateway(IGW) | パブリックIP割当 + NSG | AWSはIGW構成が必要。Azureは直接パブリックIPにより外部接続 |

---

## ネットワークサービス・配信

| AWS | Azure | 説明 |
|-----|-------|------|
| NLB / GLB | Load Balancer | L4ロードバランサー |
| ALB | Application Gateway | L7ロードバランサー |
| CloudFront | Azure CDN | 静的/動的コンテンツのCDN配信 |
| CloudFront + WAF | Front Door | CDN + L7ルーティング + WAF統合 |

---

## セキュリティ

| AWS | Azure | 説明 |
|-----|-------|------|
| セキュリティグループ | NSG | インスタンス単位の通信制御(ステートフル) |
| NACL | - | サブネット単位の通信制御(ステートレス) |
| KMS / Secrets Manager | Key Vault | 暗号鍵とシークレットの保管管理 |
| WAF | Azure WAF(AppGW等) | Webアプリの保護 |
| - | Bastion | パブリックIP不要のセキュアなVM接続(踏み台) |

---

## 監視・運用

| AWS | Azure | 説明 |
|-----|-------|------|
| CloudWatch | Monitor | ログやメトリクスの収集と可視化 |
| AWS Backup | Azure Backup / Site Recovery | バックアップと復旧管理 |
| SNS | アクショングループ | 通知とアラート発行 |
| Health Dashboard | Service Health | Azureサービスの障害・メンテナンスの状況確認 |
| - | Resource Health | 個々のリソース(VM等)の稼働状態や復旧履歴の確認 |
| Trusted Advisor | Advisor | コスト・セキュリティの改善提案 |

---

## 分析・クエリサービス

| AWS | Azure | 説明 |
|-----|-------|------|
| Athena | Log Analytics / Azure Data Explorer | サーバーレスでクエリ可能なログ・構造化データ分析 |
| Redshift | Synapse Analytics | DWH向け分析DB。大規模データ分析に最適 |
| QuickSight | Power BI / Fabric | BIレポート・可視化ツール群 |
| Glue | Azure Data Factory / Dataflows | ETL・データ統合サービス。クエリ前処理にも活用 |

---

## イベント処理・サーバーレス

| AWS | Azure | 説明 |
|-----|-------|------|
| Lambda | Functions | イベント駆動の関数実行基盤(サーバーレス) |
| EventBridge | Event Grid | イベントルーティング基盤 |
| Step Functions | Logic Apps | 条件分岐や状態管理を含むワークフロー構成 |
| App Runner | Container Apps | サーバーレスなコンテナ実行基盤 |
| - | Durable Functions | 状態保持可能な関数構成(Azure独自) |
| DynamoDB Streams | Cosmos DB Change Feed | データ変更イベントの検知 |

---

## API管理

| AWS | Azure | 説明 |
|-----|-------|------|
| API Gateway | API Management | API公開・認証・スロットリング管理 |
| Lambda Authorizer | Azure API Policy | 認可・認証ルールのカスタム適用 |

---

## DevOps / CI/CD

| AWS | Azure | 説明 |
|-----|-------|------|
| CodePipeline | Azure Pipelines | CI/CDパイプライン構築 |
| CodeBuild / CodeDeploy | Azure Pipelines / Release | ビルド・デプロイ工程の自動化 |
| CodeCommit | Azure Repos | Gitベースのコードリポジトリ |
| CodeArtifact | Azure Artifacts | パッケージ・依存管理のリポジトリ |
| CloudShell | Azure Cloud Shell | Webベースのシェル環境 |

---

## AI・LLM連携

| AWS | Azure | 説明 |
|-----|-------|------|
| SageMaker / Bedrock | Azure Machine Learning / Azure OpenAI | モデル構築・LLM活用 |
| Rekognition / Comprehend | Cognitive Services | 画像・言語・音声AI API |
| Lex | Azure Bot Service | 会話型AI(チャットボット) |
| Transcribe / Polly | Azure Speech | 音声認識・音声合成 |
| Translate | Azure Translator | 多言語翻訳 |
| Textract | Document Intelligence | 文書構造の抽出 |
| Kendra | Azure AI Search | セマンティック検索・RAG構成 |
| Personalize | - | レコメンドAI |
| Amazon Q | Copilot / Azure AI Studio | 業務支援型AIアシスタント |

---

## IoT・デバイス連携

| AWS | Azure | 説明 |
|-----|-------|------|
| IoT Core | IoT Hub | デバイスの接続・双方向メッセージ通信 |
| IoT Device Defender | Defender for IoT | デバイスセキュリティの監視・保護 |
| IoT Analytics | IoT Central / Time Series Insights | IoTデータの可視化・時系列分析 |
| IoT Greengrass | Azure IoT Edge | エッジデバイス上でのローカル処理・AI推論 |
| FreeRTOS | Azure RTOS / ThreadX | 組み込み系リアルタイムOS(デバイスSDK連携) |

---

## VDI・仮想デスクトップ

| AWS | Azure | 説明 |
|-----|-------|------|
| Amazon WorkSpaces | Azure Virtual Desktop | 仮想デスクトップ環境 |
| WorkSpaces Web | Windows 365 / RemoteApp | ブラウザVDIアクセス |
| WorkSpaces AutoStop | Start VM on Connect | 接続時自動起動(コスト最適化) |
| WAM(App Manager) | MSIX / Intune / App Attach | アプリ仮想化・配信 |
| 単一セッション | マルチセッション(Win 10/11) | VM共有による同時利用 |
| BYOL | Hybrid Benefit | ライセンス持ち込み対応 |

---

## タグ・リソース管理

| AWS | Azure | 説明 |
|-----|-------|------|
| Tag Editor | Azure Tags | GUIタグ操作 |
| Resource Groups | Resource Groups | リソースの論理的なグループ化。AWSはタグベースで定義 |
| Organizations Tag Policies | Azure Policy(タグルール) | 命名規則・必須タグ制約 |
| Cost配分タグ | 課金タグ | タグによるコスト分類管理 |

---

## 監査・準拠・構成評価
| AWS | Azure | 説明 |
|-----|-------|------|
| CloudTrail | Activity Logs | 操作履歴の記録とイベントトラッキング |
| Config / Config Rules | Resource Graph / Policy | 構成変更の記録と準拠状態の評価 |
| Artifact | Compliance Manager | 証明書・監査ドキュメントの取得管理 |
| Audit Manager | Purview / Defender for Cloud | 監査証跡と評価テンプレートによる準拠確認 |
| Security Hub | Defender for Cloud | セキュリティ構成の統合評価と改善提案 |
| Well-Architected Tool | Advisor + Blueprint | ベストプラクティスに基づく構成評価 |
| - | Trust Center / Docs | Azureのコンプライアンス情報ポータル |

---

## ハイブリッド・オンプレ連携

| AWS | Azure | 説明 |
|-----|-------|------|
| Outposts | Stack / Arc | オンプレクラウド拡張 |
| Storage Gateway | File Sync | ローカルストレージのクラウド同期 |
| AD Connector | Azure AD Connect / AD DS | オンプレADとの連携(認証基盤) |

2025/07/09

AWSのSCTとDMSを試す

今回、SCTとDMSを使用して、オンプレミスにあるOracleをAWSのRDSへ移行してみる。
- [AWS Schema Conversion Toolとは](https://docs.aws.amazon.com/ja_jp/SchemaConversionTool/latest/userguide/CHAP_Welcome.html)
- [AWS Database Migration Serviceとは](https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/Welcome.html)


## 典型的な構成イメージ
```
[オンプレ Oracle DB]
        │
   (VPN / Direct Connect)
        │
[AWS VPC内 EC2(SCTインストール)]
        │
        ├── JDBC接続 → オンプレ Oracle
        └── JDBC接続 → RDS for MySQL(ターゲットDB)

[AWS DMS Replication Instance(同じVPC内)]
        ├── 接続 → オンプレ Oracle(VPN経由)
        └── 接続 → RDS for MySQL
```

## 必要な穴あけ
- SCT用EC2のセキュリティグループ
  - アウトバウンド:ソースDB(オンプレ Oracle)とターゲットDB(RDS for MySQL)への JDBC ポート(通常 1521 や 3306)を許可
  - インバウンド:必要に応じて SSH(22)などを制限付きで許可
- DMSレプリケーションインスタンスのセキュリティグループ
  - アウトバウンド:ソースDB(オンプレ Oracle)とターゲットDB(RDS for MySQL)へのTCPポート(1521 や 3306)を許可
  - インバウンド:基本的に不要(DMSはアウトバウンド接続)
- ターゲットDB(RDS for MySQL)のセキュリティグループ
  - インバウンド:SCT用EC2 と DMSインスタンスのセキュリティグループからの接続を許可。ポートは DBエンジンに応じて(例:MySQLなら 3306)
- オンプレ側のファイアウォール設定
  - SCTとDMSからの接続元IP(またはVPN経由のCIDR)を許可
  - Oracleリスナーのポート(1521)を開放

## 今回の構成イメージ
ここではオンプレミスとしてデータセンターの代わりに自宅からAWSへ接続します。
また、SCTは自宅LAN側のPC内に配置します。
```
[自宅 LAN内 Oracle DB]
        │
[自宅 LAN内 PC(SCTインストール)]
        │
        ├── JDBC接続 → 自宅 LAN内 Oracle
        │
   (インターネット)
        │
        └── JDBC接続 → RDS for MySQL(ターゲットDB)

[AWS VPC内 AWS DMS Replication Instance]
        ├── 接続 → 自宅 LAN内 Oracle(インターネット経由)
        └── 接続 → RDS for MySQL
```

## ソースDB(Oracle)を作成
自宅LAN内のPCに仮想マシンを作成し、ソースDBに使用するOracleデータベース環境を構築する。

### Virtualboxで仮想マシン(Windows)を作成
- システム
  - CPU: 1→2
  - メモリ: 2048MB→4096MB
- ストレージを設定
  - OS用: 20GB
  - Oracle用: HDD(15GB)を追加
- ネットワークを設定
  - ブリッジアダプター(ルーターから直接ポート転送するため)

### 仮想マシンのWindowsにOracle XEをインストール
- tnsname.oraを設定
  - ブリッジアダプターのインターフェース(192.168.xx.xx)で起動するように設定
  - 以下を追記 
```
XEPDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.xx.xx)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XEPDB1)
    )
  )
```
- listener.ora
sqlnet.oraの指定が以下のためlistener.oraは未使用(EZCONNECTは簡易接続ネーミング)
```
NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
```

### ユーザ作成、権限付与
**Oracleでは、スキーマ名は基本的にはユーザー名と同じになる。例えば、ユーザー名 testuser を作成した場合、スキーマ名は TESTUSER (大文字) となる。**
```
sqlplus / as sysdba
show con_name
show pdbs
alter session set container=XEPDB1
create user testuser identified by testuser;
grant connect, resource, dba to testuser;
```

### 移行テーブル作成と移行データ投入
```
CREATE TABLE test_datatypes (
    id                  NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    name                VARCHAR2(100),
    description         CLOB,
    price               NUMBER(10,2),
    created_at          DATE,
    updated_at          TIMESTAMP WITH TIME ZONE,
    is_active           CHAR(1),
    category_code       NCHAR(10),
    remarks             NVARCHAR2(200),
    binary_data         BLOB,
    raw_data            RAW(100),
    doc_xml             XMLTYPE,
    unique_id           ROWID,
    float_value         BINARY_FLOAT,
    double_value        BINARY_DOUBLE,
    interval_day_time   INTERVAL DAY TO SECOND,
    interval_year_month INTERVAL YEAR TO MONTH
);
```
```
INSERT INTO test_datatypes (name, description, price, created_at, updated_at, is_active, category_code, remarks, binary_data, raw_data, doc_xml, float_value, double_value, interval_day_time, interval_year_month)
VALUES ('標準データ','一般的な商品の説明',1000.00,TO_DATE('2023-01-01','YYYY-MM-DD'),TO_TIMESTAMP_TZ('2023-01-01 08:00:00 +09:00','YYYY-MM-DD HH24:MI:SS TZH:TZM'),'Y',N'CAT001',N'通常の備考',UTL_RAW.CAST_TO_RAW('sample1'),HEXTORAW('A1B2C3'),XMLTYPE('1'),1.23,12345.6789,INTERVAL '1' DAY + INTERVAL '12:00:00' HOUR TO SECOND,INTERVAL '1-2' YEAR TO MONTH);

INSERT INTO test_datatypes (name, description, price, created_at, updated_at, is_active, category_code, remarks, binary_data, raw_data, doc_xml, float_value, double_value, interval_day_time, interval_year_month)
VALUES ('NULL多め',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);

INSERT INTO test_datatypes (name, description, price, created_at, updated_at, is_active, category_code, remarks, binary_data, raw_data, doc_xml, float_value, double_value, interval_day_time, interval_year_month)
VALUES ('エッジケース',RPAD('x',32000,'x'),0,SYSDATE,SYSTIMESTAMP,'N',N'CAT999',N'NULLと空文字の違い確認',UTL_RAW.CAST_TO_RAW(''),HEXTORAW(''),XMLTYPE(''),0.0,-1.0,INTERVAL '0' DAY,INTERVAL '0-0' YEAR TO MONTH);
```

### LAN上のPCからDB接続確認
- 仮想マシンのWindowsファイアーウォールで任意のIPアドレスからのTCP1521の受信を許可
- 以下URLで接続
  jdbc:oracle:thin:@//192.168.xx.xx:1521/xepdb1

### DMSで変更データキャプチャ(CDC)を利用する場合に必要な設定
- 1. サプリメンタルログの有効化
- 2. アーカイブログモードの有効化

#### 1. サプリメンタルログの有効化
サプリメンタル・ロギング(Supplemental Logging)は、OracleデータベースでCDCを行う際に必要な設定。
どの種類のサプリメンタル・ログを有効にするかは選択可能。
```
# データベースレベルでの補足ログ設定
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
# 主すべての列の補足ログを有効化
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
# テーブル単位で補足ログの有効化
ALTER TABLE TESTUSER.TEST_DATATYPES ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
```

#### 2. アーカイブログモードの有効化
アーカイブログが未設定の場合、以下のようなエラーが出る。
```
# アーカイブログが無効な場合
E:  To use CDC, the Oracle database must be configured to archived Redo logs [1022313]
# アーカイブログが取得できない場合(パスエラーや権限不足など)
E:  Cannot retrieve Oracle archived Redo log destination ids [1020401]
```
```
sqlplus / as sysdba

# 確認
ARCHIVE LOG LIST;

# データベースをマウント状態に切り替え(オープン状態では変更不可)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;

# ARCHIVE LOGモードを有効にする
ALTER DATABASE ARCHIVELOG;

# データベースをオープンに戻す
ALTER DATABASE OPEN;

# ログモードを確認
ARCHIVE LOG LIST;

# ここではアーカイブログの保存先を「E:/oracle_db/archivelogs」とする。
# Oracleサービスの実行ユーザーを確認し、アーカイブログ保存先へ書き込み権限を与えること。

# アーカイブログの保存先を定義
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=E:/oracle_db/archivelogs' SCOPE=SPFILE;

# 変更後の再起動
SHUTDOWN IMMEDIATE;
STARTUP;
```

## 移行先のターゲットデータベースを作成
AWSにRDS for MySQLをセットアップする。
今回はパブリックサブネットに直置き。
DBはRDS作成時に初期DB(testuser)を作成しておく。

```
# MySQL接続
mysql -h xxx.yyy.zzz.rds.amazonaws.com -u admin -ppassword

# DB確認
SHOW DATABASES;

# ユーザ作成
CREATE USER 'testuser'@'%' IDENTIFIED BY 'testuser';

# ユーザ権限付与
GRANT SELECT, SHOW VIEW, CREATE, ALTER, DROP, INDEX, REFERENCES, CREATE VIEW, TRIGGER, CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON *.* TO 'testuser'@'%';

GRANT ALL PRIVILEGES ON testuser.* TO 'testuser'@'%'; 
## LinuxのMySQLは大文字小文字が区別される。「testuser.*」と「TESTUSER.*」は別物

# 権限を適用
FLUSH PRIVILEGES;

# 権限確認
SHOW GRANTS FOR 'testuser'@'%'; 
```

## スキーマの移行
### SCTを設定
#### SCTのインストール
[AWS Schema Conversion Toolのインストール](https://docs.aws.amazon.com/ja_jp/SchemaConversionTool/latest/userguide/CHAP_Installing.Procedure.html)

#### JDBCドライバーのダウンロード
[AWS Schema Conversion Tool用の JDBC ドライバーのインストール](https://docs.aws.amazon.com/ja_jp/SchemaConversionTool/latest/userguide/CHAP_Installing.JDBCDrivers.html)
> ソースデータベースエンジンとターゲットデータベースエンジンの JDBC ドライバーをダウンロードします。
- [Oracle](https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html)
- [MySQL](https://downloads.mysql.com/archives/c-j/)

#### スキーマの変換
1. Convert schema
1. Apply to database

```
# SCTのログ出力先
C:\Users\<ユーザー名>\AppData\Roaming\AWS Schema Conversion Tool\log\
```

## データの移行
### DMSを設定
#### 必要なロール
- dms-vpc-role
- dms-cloudwatch-logs-role

#### レプリケーションインスタンスを作成
- 事前にサブネットグループを作成しておく

今回インターネット経由でソースデータベースへアクセスするため以下を指定。
- ✔ パブリックアクセス可能
#### ソースエンドポイントを作成
- 接続テスト1
```
Test Endpoint failed: Application-Status: 1020912, Application-Message: Log Miner is not supported in Oracle PDB environment Endpoint initialization failed.
```
> AWS DMS が Oracle の PDB(Pluggable Database)環境では LogMiner を使用できないことを示しています。つまり、現在の構成では LogMinerベースのCDC(変更データキャプチャ)方式が使えないということです。
> AWS DMS では、PDB 環境で Oracle をソースにする場合、LogMiner の代わりに Binary Reader を使用する必要があります。


1. DMS ソースエンドポイントの「追加接続属性」に以下を指定
```
useLogMinerReader=N;useBfile=Y;
```

2. PDBユーザーに必要な権限を付与
Binary Reader を使うには、CDB(コンテナDB)側で以下の権限が必要:(上で「*.*」に対してSELECT付与済み)
```
GRANT SELECT ON V_$LOG TO <ユーザー>;
GRANT SELECT ON V_$LOGFILE TO <ユーザー>;
GRANT SELECT ON V_$ARCHIVED_LOG TO <ユーザー>;
GRANT SELECT ON V_$DATABASE TO <ユーザー>;
GRANT SELECT ON V_$THREAD TO <ユーザー>;
GRANT SELECT ON V_$PARAMETER TO <ユーザー>;
GRANT SELECT ON V_$NLS_PARAMETERS TO <ユーザー>;
GRANT SELECT ON V_$TIMEZONE_NAMES TO <ユーザー>;
```

#### ターゲットエンドポイントを作成
作成済みのRDSインスタンスを選択
#### データベース移行タスクを作成
- 移行タイプ
  - フルロードのみ
  - フルロード+CDC
  - CDCのみ

- ターゲットテーブル準備モード
  - ✔ 何もしない
  - ターゲット上のテーブルを削除
  - 切り捨て

- LOB列設定
  - LOB列をを含めない
  - ✔ 完全LOBモード
  - 制限付きLOBモード

- タスクログ
  - ✔ CloudWatch ログの有効化

- テーブルマッピング
移行対象のテーブルを指定する。(今回はTESTUSERスキーマの全テーブル(%)を指定)
マッピングを指定しない場合、ソース側のスキーマ(TESTUSER)と同名のデータベース(TESTUSER)へロードしようとする。
LinuxのMySQLは大文字小文字が区別されるので、以下のマッピングを指定する。
- スキーマ名: TESTUSERをtestuserへマッピング
- テーブル名: TEST_DATATYPESをtest_datatypesへマッピング
```
{
  "rules": [
    {
      "rule-type": "selection",
      "rule-id": "3",
      "rule-name": "include-all",
      "object-locator": {
        "schema-name": "TESTUSER",
        "table-name": "%"
      },
      "rule-action": "include"
    },
    {
      "rule-type": "transformation",
      "rule-id": "1",
      "rule-name": "map-schema",
      "rule-action": "rename",
      "rule-target": "schema",
      "object-locator": {
        "schema-name": "TESTUSER"
      },
      "value": "testuser"
    },
    {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "rename-table",
      "rule-action": "rename",
      "rule-target": "table",
      "object-locator": {
        "schema-name": "TESTUSER",
        "table-name": "TEST_DATATYPES"
      },
      "value": "test_datatypes"
    }
  ]
}
```

2025/06/14

Kubernetes(クバネティス、K8s)

> [公式ドキュメント](https://kubernetes.io/ja/docs/home/)

# インストール
> [ツールのインストール](https://kubernetes.io/ja/docs/tasks/tools/)

- kubectl 
  > KubernetesクラスターにアクセスするためのCLI

- kind
  > ローカルのコンピューター上でKubernetesを実行することができるツール

# アーキテクチャ
> [Kubernetesクラスターを構成するコンポーネント](https://kubernetes.io/ja/docs/concepts/overview/components/)
- コントロールプレーンコンポーネント
  - kube-apiserver
    > Kubernetesコントロールプレーンのフロントエンド

  - etcd
    > キーバリューストアで、Kubernetesの全てのクラスター情報の保存場所

  - kube-scheduler
    > Podをノードに割り当てる役割

  - kube-controller-manager
    > 複数のコントローラープロセスを実行

  - cloud-controller-manager
    > クラウド特有の制御ロジックを組み込む

- ノードコンポーネント
  - kubelet
    > クラスター内の各ノードで実行されるエージェント

  - kube-proxy
    > クラスター内の各nodeで動作しているネットワークプロキシで、KubernetesのServiceコンセプトの一部を実装

  - コンテナランタイム
    > コンテナの実行を担当するソフトウェア。次の複数のコンテナランタイムをサポート。 Docker、containerd、CRI-O、 および全ての Kubernetes CRI (Container Runtime Interface) 実装

```
kubectl get pod --namespace kube-system
```

## クラスターのアーキテクチャ
> [Kubernetesクラスターのアーキテクチャ](https://kubernetes.io/ja/docs/concepts/architecture/)

---
# マニフェスト
## Kubernetesオブジェクト
> [Kubernetesオブジェクトを記述する](https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/#kubernetes%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E8%A8%98%E8%BF%B0%E3%81%99%E3%82%8B)

## 主なKubernetesオブジェクトの種類
- [**Pod**](https://kubernetes.io/ja/docs/concepts/workloads/pods/)
  > Podは、Kubernetes内で作成・管理できるコンピューティングの最小のデプロイ可能なユニットです。

- [**Replicaset**](https://kubernetes.io/ja/docs/concepts/workloads/controllers/replicaset/)
  > ReplicaSetはどんな時でも指定された数のPodのレプリカが稼働することを保証します。

- [**Deployment**](https://kubernetes.io/ja/docs/concepts/workloads/controllers/deployment/)
  > Deployment はPodとReplicaSetの宣言的なアップデート機能を提供します。
  - 更新戦略
    - StrategyType
      - Recreate
      - RollingUpdate
    - RollingUpdateStrategy
      - maxUnavailable
        更新処理において利用不可となる最大のPod数
      - maxSurge
        理想状態のPod数を超えて作成できる最大のPod数
      - **maxUnavailableは切り下げ、maxSurgeは切り上げ**

- [**Service**](https://kubernetes.io/ja/docs/concepts/services-networking/service/)
  > KubernetesにおけるServiceとは、 クラスター内で1つ以上のPodとして実行されているネットワークアプリケーションを公開する方法です。
  - Type
    - ClusterIP(デフォルト)
    - NodePort
    - LoadBalancer
    - ExternalName

- [**ConfigMap**](https://kubernetes.io/ja/docs/concepts/configuration/configmap/)
  > ConfigMapは、 機密性のないデータをキーと値のペアで保存するために使用されるAPIオブジェクトです。

- [**Secret**](https://kubernetes.io/ja/docs/concepts/configuration/secret/)
  > Secretとは、パスワードやトークン、キーなどの少量の機密データを含むオブジェクトのことです。

- [**Job**](https://kubernetes.io/ja/docs/concepts/workloads/controllers/job/)
  > Jobは一つ以上のPodを作成し、指定された数のPodが正常に終了するまで、Podの実行を再試行し続けます。

- [**CronJob**](https://kubernetes.io/ja/docs/concepts/workloads/controllers/cron-jobs/)
  > CronJob は繰り返しのスケジュールによってJobを作成します。

## ヘルスチェック
- Readiness probe
  > コンテナがトラフィックを受け入れられる状態であるかを認識します。

- Liveness probe
  > Liveness Probeを使用して、コンテナをいつ再起動するかを認識します。 

- Startup probe
  > コンテナアプリケーションの起動が完了したかを認識します。

> [Liveness Probe、Readiness ProbeおよびStartup Probeを使用する](https://kubernetes.io/ja/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)


## PodのQuality of Service(QoS)Classes
> [PodにQuality of Serviceを設定する](https://kubernetes.io/ja/docs/tasks/configure-pod-container/quality-service-pod/)
- Guaranteed
- Burstable
- BestEffort

## 複数NodeでのPodのスケジューリング制御
> [ノード上へのPodのスケジューリング](https://kubernetes.io/ja/docs/concepts/scheduling-eviction/assign-pod-node/)
- Node selector
- Affinity/Anti-affinity
  - Node affinity
  - Pod affinity
  - Pod anti-affinity

> [Podトポロジー分散制約](https://kubernetes.io/ja/docs/concepts/scheduling-eviction/topology-spread-constraints/)
- Pod Topology Spread Constraints

> [TaintとToleration](https://kubernetes.io/ja/docs/concepts/scheduling-eviction/taint-and-toleration/)
- Taint
- Toleration

> [Podの優先度とプリエンプション](https://kubernetes.io/ja/docs/concepts/scheduling-eviction/pod-priority-preemption/)
- pod Priority
- Preemption

> [Horizontal Pod Autoscalerウォークスルー](https://kubernetes.io/ja/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/)
- Horizontal Pod Autoscaler(HPA)
- Vertical Pod Autoscaler

> [アプリケーションにDisruption Budget指定する](https://kubernetes.io/ja/docs/tasks/run-application/configure-pdb/)
- minAvailable 
- maxUnavailable

---
# コマンド
> [kubectlチートシート](https://kubernetes.io/ja/docs/reference/kubectl/cheatsheet/)

## マニフェストをKubernetesクラスターに適用する(kubectl apply)
```
Usage:  kubectl apply --filename <ファイル名>
Example:
$ kubectl apply myapp.yaml --namespace default
```

## リソースを取得する(kubectl get)
```
Usage:  kubectl get <リソース名>
Example:
$ kubectl get nodes --namespace default
$ kubectl get nodes --output wide
$ kubectl get pod --namespace default
$ kubectl get pod --all-namespaces
$ kubectl get pod myapp --output wide --namespace default
$ kubectl get pod myapp --output yaml --namespace default
$ kubectl get pod --selector app=myapp
$ kubectl get pod,replicaset,deployment
# モニタリング
$ kubectl get pod --watch
```

### --output(-o)でjsonpathでフィールドを指定して取得する
```
Example:
$ kubectl get pod myapp --output jsonpath='{@}'
$ kubectl get pod myapp --output jsonpath='{.spec.containsers[].image}'
```
### --vでkubectlの出力結果のログレベルを変更する
```
Example:
$ kubectl get pod myapp --v=7
$ kubectl get pod --v=7 --namespace kube-system
```

## リソースの詳細を取得する(kubectl describe)
```
Usage:  kubectl describe <リソース名>
Example:
$ kubectl describe pod <Pod名> --namespace default
```

## コンテナのログを取得する(kubectl logs)
```
Usage:  kubectl logs <リソース名>
# Print the logs for a container in a pod or specified resource. If the pod has only one container,
the container name is optional.
Example:
$ kubectl logs myapp
$ kubectl logs myapp --container myserver
$ kubectl logs deploy/<Deployment名>
$ kubectl logs --selector app=myapp
```

## デバッグ用のサイドカーコンテナを立ち上げる(kubectl debug)
```
Usage:  kubectl debug --stdin --tty <デバッグ対象Pod名> --image=<デバッグ用コンテナのimage> --target=<デバッグ対象のコンテナ名>
Example:
$ kubectl debug --stdin --tty myapp --image=curlimages/curl:latest --target=myserver --namespace default --sh
```

## コンテナを即座に実行する(kubectl run)
```
Usage:  kubectl run <Pod名> --image=<イメージ名>
Example:
$ kubectl --namespace default run busybox --image=busybox:latest --rm --stdin --tty --restart=Never --command -- nslookup example.com
```

## コンテナにログインする(kubectl exec)
```
Usage:  kubectl exec --stdin --tty <Pod名> -- <コマンド>
Example:
$ kubectl exec --stdin --tty myapp -- /bin/sh
```

## ポートフォワーディング(kubectl port-forward)
```
Usage:  kubectl port-forward <リソース名> <転送先ポート番号>:<転送元ポート番号>
# Use resource type/name such as deployment/mydeployment to select a pod. Resource type defaults to 'pod' if omitted.
Example:
$ kubectl port-forward myapp 5555:8080 --namespace default
$ kubectl port-forward deployment/hello-server 5555:8080 --namespace default
```

## マニフェストを編集する(kubectl edit)
```
Usage:  kubectl edit <リソース名>
Example:
$ kubectl edit pod myapp --namespace default
```

## リソースを削除する(kubectl delete)
```
Usage:  kubectl delete <リソース名>
Example:
$ kubectl delete pod myapp --namespace default
$ kubectl delete replicaset httpserver --namespace default
```

## Deploymentを利用したリソースを再起動する(kubectl rollout)
```
Usage:  kubectl rollout restart <リソース名>
Example:
$ kubectl rollout restart deployment/abc
```

## トラブルシューティング
### 1. Pod内からアプリケーションの接続確認を行う
```
Example:
$ kubectl --namespace default debug --stdin --tty <Pod名> --image=curlimages/curl --container=debug-container -- sh
```

### 2. クラスタ内かつ別Podから接続確認を行う
```
Example:
$ kubectl --namespace default run curl --image curlimages/curl --rm --stdin --tty --restart=Never --command -- curl <PodのIP>:8080
```

### 3. クラスタ内かつ別PodからService経由で接続確認を行う
```
Example:
$ kubectl --namespace default run curl --image curlimages/curl --rm --stdin --tty --restart=Never --command -- curl <ServiceのIP>:8080
```

# カスタマイズ
- [オートコンプリート](https://kubernetes.io/ja/docs/tasks/tools/install-kubectl-linux/#%E3%82%B7%E3%82%A7%E3%83%AB%E3%81%AE%E8%87%AA%E5%8B%95%E8%A3%9C%E5%AE%8C%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B)
- エイリアス
- SHORTNAMES
```
$ kubectl api-resources
```
- [ログ出力(stern)](https://github.com/stern/stern)
- [コンテキストとNamespaceの切り替え(kubectx/kubens)](https://github.com/ahmetb/kubectx)

2025/05/22

smtp4dev

## smtp4dev 
[https://github.com/rnwood/smtp4dev](https://github.com/rnwood/smtp4dev)
> A dummy SMTP server for Windows, Linux, Mac OS-X (and maybe elsewhere where .NET Core is available).

## インストール
[https://github.com/rnwood/smtp4dev/wiki/Installation](https://github.com/rnwood/smtp4dev/wiki/Installation)

## 起動方法(Windowsの場合)
ZIPを解凍後、Rnwood.Smtp4dev.exeを実行する。
デフォルトの5000番ポートをregistryなどで使用している場合は、別のポートを指定する。
```
C:\test\smtp4dev>Rnwood.Smtp4dev.exe --urls=http://localhost:5050
```

起動例(25番ポートでなく1025番ポートでListenしているので注意)
```
DataDir: C:\Users\CAST-A152\AppData\Roaming\smtp4dev
Using Sqlite database at C:\Users\CAST-A152\AppData\Roaming\smtp4dev\database.db
TLS mode: None
SMTP Server is listening on port 1025.
Keeping last 100 messages and 100 sessions.
IMAP Server is listening on port 143
Hosting environment: Production
Content root path: C:\test\smtp4dev
Now listening on: http://localhost:5050
Application started. Press Ctrl+C to shut down.
```

## 送信
localhost:1025 宛にメールを送信する。

Docker上のWebAPサーバからメール送信する場合、localhost はコンテナ自身を参照してしまう。
その場合は、メールサーバーに「host.docker.internal」を指定する。

> [コンテナからホスト上のサービスに対して接続したい](https://docs.docker.jp/desktop/networking.html#desktop-networking-i-want-to-connect-from-a-container-to-a-service-on-the-host)


## 受信
管理画面でメールを確認
http://localhost:5050/

2025/05/14

JSONとYAML

## Example 1:
This is a JSON object:
```
{
  "Image": {
      "Width":  800,
      "Height": 600,
      "Title":  "View from 15th Floor",
      "Thumbnail": {
          "Url":    "http://www.example.com/image/481989943",
          "Height": 125,
          "Width":  100
      },
      "Animated" : false,
      "IDs": [116, 943, 234, 38793]
    }
}
```
## Example 2:
This is a JSON array containing two objects:
```
[
  {
     "precision": "zip",
     "Latitude":  37.7668,
     "Longitude": -122.3959,
     "Address":   "",
     "City":      "SAN FRANCISCO",
     "State":     "CA",
     "Zip":       "94107",
     "Country":   "US"
  },
  {
     "precision": "zip",
     "Latitude":  37.371991,
     "Longitude": -122.026020,
     "Address":   "",
     "City":      "SUNNYVALE",
     "State":     "CA",
     "Zip":       "94085",
     "Country":   "US"
  }
]
```
## Example 3:
YAML representation of example 1:
```
Image:
  Width: 800
  Height: 600
  Title: View from 15th Floor
  Thumbnail:
    Url: http://www.example.com/image/481989943
    Height: 125
    Width: 100
  Animated: false
  IDs:
    - 116
    - 943
    - 234
    - 38793

```
## Example 4:
YAML representation of example 2:
```
- precision: zip
  Latitude: 37.7668
  Longitude: -122.3959
  Address: ''
  City: SAN FRANCISCO
  State: CA
  Zip: '94107'
  Country: US
- precision: zip
  Latitude: 37.371991
  Longitude: -122.02602
  Address: ''
  City: SUNNYVALE
  State: CA
  Zip: '94085'
  Country: US
```
* [JSONの仕様(RFC8259)](https://tex2e.github.io/rfc-translater/html/rfc8259.html)
* [YAML(YAML Ain’t Markup Language)の仕様](https://yaml.org/spec/1.2.2/)

2025/05/07

数式を含む文書(LaTex)

## LaTeX
LaTeX(ラテフ、ラテック)とは、文書作成ツールであり、特に学術論文や数式を含む文書の作成に強いです。WordのようなGUIベースのワープロソフトとは異なり、テキストファイル形式で記述し、それをコンパイルして最終的な文書(PDFなど)を作成します。LaTeXのメリットは、数式を美しく出力できること、自動で番号付けや目次を生成できること、そしてその安定性・自由度が高いことです。

## セットアップ(Visual Studio Codeで使う場合)
1. LaTeXのインストール
  LaTeXを使うために必要なソフトウェアをインストールします:
  - TeX Live (Windows/Linux/macOS向けの総合パッケージ)
  - [MiKTeX](https://miktex.org/download) (Windows向けの軽量なLaTeX環境)
  - Overleaf (クラウド上でLaTeXを編集できる便利なオンラインツール)

2. Visual Studio Code拡張機能をインストール
  - LaTeX Workshop(LaTeXの編集を支援)
  - Markdown Preview(数式のプレビュー)
  - Markdown+Math(数式の自動レンダリング)

## 数式の記述
### インライン数式
これは $y = ax + b$ という方程式です。
### 独立した数式
$$
y = 
\begin{cases}
0\quad(w_1x_1 + w_2x_2 \leq \theta) \\
1\quad(w_1x_1 + w_2x_2 > \theta)
\end{cases}
$$
$$
L = \frac{1}{N} \sum_{i=1}^{N} \left( y_i - \hat{y}_i \right)^2
$$
[はやわかり LaTeX で数式組版](https://www.latex-project.org/help/documentation/short-math-guide_jpn.pdf)

人気の投稿