気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

Kotlin 実装確認ポイント

実装

思想

  • 改修の場合、既存仕様や全体統一感に囚われ過ぎない。シンプル化、保守性向上を意識する
    • 不要項目を含んだオブジェクトパラメータの是正
    • 変数名が設定値と異なる名称であれば是正(影響範囲が広くなりすぎないかは判断)

クラス構成

  • 継承よりも移譲を優先。クラス構成の複雑化や密結合を防ぐ

基本コーディングルール

  • パラメータの必須 or nullableを最適な指定とする
    • DB登録必須ならリクエスト時点から必須パラメータで指定するなど
    • リクエストから、レスポンスまで一貫した設定値にする。流れですべて矛盾がないか確認
  • 固定値は、enumで定義する
  • 設定値と変数名は一致させる
  • 暗黙型変換をしない

Entity

  • 型、nullableはDBの型、nullableに合わせる
  • 数値型は、int(9〜10桁)、long(32桁)を意識して使う

メソッド

  • 引数は名前付き引数にして、同じ型で違う項目に値を設定してしまう可能性を排除する

エラーハンドリング

  • 処理継続の判断
    • 後続処理に影響のない処理の例外握りつぶし、ログ出力

セキュリティ

  • 認証情報のパラメータ受け渡し時はマスクする

テスト

  • 修正における影響を意識してテストを実施する
    • 修正後、なんとなく動くという確認ではなく明確に影響を考えて、抜けもれなく確認。結合テスト時の修正を減らす

Oracle アカウントのスキーマへの指定テーブル、権限を確認する

スキーマを確認する

-- スキーマ指定テーブルの確認
SELECT * FROM DBA_SYNONYMS WHERE OWNER = 'AAA_SERVICE';

-- スキーマ指定テーブルの確認(テーブル名の指定)
--SELECT * FROM DBA_SYNONYMS WHERE OWNER = 'AAA_SERVICE' AND TABLE_NAME LIKE '%AVAI%';
OWNER SYNONYM_NAME TABLE_OWNER TABLE_NAME DB_LINK
AAA_SERVICE PAY_HISTORY USER1 PAY_HISTORY
AAA_SERVICE PAY_LOG USER1 PAY_LOG
AAA_SERVICE BB_PAY_HISTORY USER1 BB_PAY_HISTORY

テーブル付与権限を確認する

SELECT * FROM USER_TAB_PRIVS WHERE GRANTEE = 'AAA_SERVICE' ORDER BY TABLE_NAME;
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY
AAA_SERVICE DB_NAME PAY_HISTORY USER1 UPDATE NO NO
AAA_SERVICE DB_NAME PAY_HISTORY USER1 INSERT NO NO
AAA_SERVICE DB_NAME PAY_HISTORY USER1 SELECT NO NO
AAA_SERVICE DB_NAME PAY_HISTORY_SEQ USER1 SELECT NO NO
AAA_SERVICE DB_NAME PAY_LOG USER1 INSERT NO NO
AAA_SERVICE DB_NAME PAY_LOG_SEQ USER1 SELECT NO NO

インフラ用語 WAFとCDN

WAF

  • WAFとは、「Web Application Firewall
  • Webサイトを保護する対策のひとつ

機能

「シグネチャ」と呼ばれる、不正な通信や攻撃パターンを識別するためのルールを設定することでWebアプリケーションにおける通信の中身をチェックし、不正な通信や通過させたくない通信を遮断

CDN

Aレコード

URL(ドメイン)のIPアドレスを指定するレコード。ドメインとサーバーを紐付ける

CNAME

  • Canonical NAME」の略
  • 特定のドメインを別のドメインに紐付けることが可能
  • リダイレクトはURLが変わるが、CNAMEでの別URL移動は、リクエストを行ったURLのまま、別のURLのWebサイトを表示させられる

構成

  • DNSとオリジンサーバー、キャッシュサーバーの3つで成り立っている
  • オリジンサーバー:元データ保有サーバー
  • キャッシュサーバー:オリジンのキャッシュを保持して、配信するサーバー

設定

  • CNAMEに特定のドメインを指定し、オリジンサーバーのURLをCDNの管理画面から設定

参考URL

Basic認証の認証情報をリクエストに設定する方法

Basic認証の認証情報をリクエストに設定する方法を簡単に記載しておきます。

Basic認証のフォーマット

リクエストパラメータにAuthorizationを設定する

Authorization="Basic ${Base64でエンコードした認証文字列}"

# Base64でエンコードされた認証文字列
${userName}:${password}

# 例
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l

参照

developer.mozilla.org

AWSのサブネット、セキュリティグループ、ネットワークACL

AWSで扱う概念について理解を深めるために記載してみる。

サブネット

  • VPC内のアドレスレンジのこと
  • ネットワーク内の小さな、サブのネット
  • VPCに設定したCIDRブロック範囲に収まる小さなCIDRブロックを割り当てることができる
  • 個々のサブネットは、仮想ルーターを保持、これはサブネット内のデフォルトゲートウェイとなっている
  • 仮想ルーターは、ルートテーブルとネットワークACLの設定を保持している

セキュリティグループ

  • VPC内のEC2などのインスタンス単位に割当てられる通信制御設定
  • インスタンスは少なくとも1つのセキュリティグループを割り当てる必要がある
  • セキュリティグループの設定
    • 通信制御:インバウンド(入ってくる通信の許可IP指定)、アウトバウンド(出ていく通信の許可IP設定)
    • TCP/UDPとポート番号(インスタンス自体の固有番号の位置づけ)、送受信先のCIDR or セキュリティグループ

ネットワークACL

  • VPC内のサブネットに割当てられる通信制御設定
  • ACLの設定
    • 通信制御:インバウンド(入ってくる通信の許可IP指定)、アウトバウンド(出ていく通信の許可IP設定)
    • TCP/UDPとポート番号(インスタンス自体の固有番号の位置づけ)、送受信先のCIDR。(セキュリティグループは指定できない)

インターネットゲートウェイとNATゲートウェイの違いと使い方

インターネットゲートウェイとNATゲートウェイは、AWSでセキュリティを担保したいAPIサーバーなどを立てる際に使うオブジェクトです。それぞれの大雑把な違いと使い方について参考URLの内容を引用しつつ、説明します。

インターネットゲートウェイとNATゲートウェイの違い

インターネットゲートウェイ NATゲートウェイ
用途 インターネットへの相互アクセスの窓口 外部アクセス禁止としたいサーバーの踏み台
配置場所 VPC(サブネットには紐付かない?) public サブネット
NATの種類 static NAT(1対1変換) Dynamic NAT(多対1変換)

f:id:tamata78:20220209175452p:plain

インターネットゲートウェイ

インターネットゲートウェイは、static NAT(1対1変換)を行います。
具体的に言うと、VPC内に配置されたEC2インスタンスに割り当てられたprivate IPを public IPへ1対1変換することを指します。

またその変換を伴う通信は、EC2からでもインターネット外からでも可能となります。
通信がなくてもインターネットゲーなくてもにNATエントリが存在し、このエントリに登録されたIPを元に変換が行われます。

インターネットゲートウェイを使う際の設定

  • インターネットゲートウェイVPCに配置
  • public サブネット上にEC2を配置
  • public サブネットにルーティングテーブルを紐付ける(「デフォルトルート 0.0.0.0/0 」のターゲットをインターネットゲートウェイとする)

この場合のEC2は、外部から自由にアクセスされてしまうため、セキュリティを担保したい場合は、この構成は不適切。 外部からのアクセスを點せたくない場合、NATゲートウェイを用います。

NATゲートウェイ

NATゲートウェイは、dynamic NAT(多対1変換)を行います。
具体的に言うと、VPC内のprivateサブネットが紐付けられた複数のEC2インスタンスに割り当てられたprivate IPを NATゲートウェイにおいてpublic IPへ多対1変換することを指します。

またその変換を伴う通信は、EC2からのみで可能となります。
インターネット経由のアクセスにおいては、public IPからどの private IPに変換すべきか判別できないため、アクセス不可とすることができ、これによってprivateサブネットに紐付けられたEC2インスタンスのセキュリティを担保することが可能となります。

f:id:tamata78:20220209183600p:plain

EC2からインターネットへのアクセス

EC2からインターネットへのアクセスにおけるレスポンスは、どうやって各EC2インスタンスに戻すのでしょうか。 EC2インスタンスがNATゲートウェイを通る際に「NATエントリ」を生成します。このエントリには、EC2インスタンスTCP/UDPポート番号が登録されており、このポート番号を用いて、レスポンスを指定のEC2インスタンスに返却することができます。

NATゲートウェイを使う際の設定

  • インターネットゲートウェイVPCに配置
  • NATゲートウェイをpublic サブネットに紐付けて配置
  • public サブネットにルーティングテーブルを紐付ける(「デフォルトルート 0.0.0.0/0 」のターゲットをインターネットゲートウェイとする)
  • EC2インスタンスをprivateサブネットに紐付けて配置
  • privateサブネットにルーティングテーブルを紐付ける(「デフォルトルート 0.0.0.0/0 」のターゲットをNATゲートウェイとする)

参考URL

ネットワーク用語_ACL、CIDR

ネットワーク関連で知らなかった用語をまとめておく

ACLAccess Control List)

システムやファイル、ネットワーク上のリソースなどへのアクセス可否の設定をリストとして列挙したもの。

ネットワークの場合

  • 宛先と送信元のIPアドレスおよびポート番号を条件とした上で、その条件に合致した通信の可否をACLとして設定する。
  • このACLを使ってネットワークアクセスを制御することにより、特定のサーバーのIPアドレス宛のパケットのみを許可する
  • あるいは特定の送信元IPアドレスからのパケットはすべて破棄するなどといった設定が可能になる。

CIDR (サイダー)

  • 「Classless Inter-Domain Routing」の略。
  • CIDRは、クラスを使わないIPアドレス割当、経路集約を行う技術。

クラス

  • IPアドレスをネットワーク部とホスト部といった決められたブロック単位に区切る方法
  • 簡単だが、アドレス空間が無駄になりやすい
  • クラスA、クラスB・・・の何れかになり、いずれにしても必要なアドレスにピッタリなクラスがないため、アドレスが無駄になる
    • f:id:tamata78:20220113155644p:plain
    • クラスA 16,777,214台、クラスB 65,534台、クラスC 256台
  • ネットワーク部とホスト部の区別は、サブネットマスクで確認する

CIDR