SQL Server 2019 Express 利用制限

開発環境用として、RDSでSQL Server 2019 Expressを利用することになりました。

 

ポイントしては、DBごとのデータ容量が10GBとなるところです。

1つのインスタンスに5つのDBがあり、それぞれ8GBで、合計40GBでも問題無し。

合計で10GBと思っていましたが、勘違いでした。

 

他の利用制限はそんなに困らなそうです。

 

以下、公式サイト

docs.microsoft.com

 

以下、まとまっているサイト

www.fenet.jp

簡単にお店のホームページを作る方法

昨年(2021年)知り合いがお店を始めるので、ホームページを作成したいとの相談をされました。

HTMLやプログラムの知識は無しで、安くて、簡単に作成できて、更新しやすい方法を探しました。

 

ということで、WordPressで作成することを提案。

ある程度(2~3日間ぐらい)の学習は必要になります。

WordPressならWEB上から簡単に記事、商品、問い合わせ画面を作ることができます。

私もWordPressを初期から構築するのは初めてだったので、レンタルサーバー選定、WordPressのテンプレート選定までをまとめました。

WordPressを知っている前提で話します。

 

1、レンタルサーバ

WordPressを入れる箱です。

エックスサーバー or ConoHa WING の2択です。

レンタルサーバーはいろいろあり、もっと安いサーバーもありますし、もっと性能が良いサーバーもあります。

安心、値段、性能、サポートなど総合的に判断すると、どちらかになる(と思います)

どちらも1年間契約にすれば、月1000円ぐらいです。

キャンペーン時期や契約年数(3年とか)よってはもっと安くなります。

 

どちらも以下の一番安いプランで十分です。

・エックスサーバー:スタンダードプラン

www.xserver.ne.jp

 

・ConoHa WING:ベーシックwww.conoha.jp

 

エックスサーバーは昔から有名で安心です。(国内シェアNo.1)

ConoHaはレンタルサーバーとしては比較的新しいですが、超大手のGMOが管理しているので、安心です。

私は迷いましたが、「ConoHa」にしました。

 

2、ドメイン取得サービス

ヤフーだと「yahoo.co.jp」がドメインです。

10年ぐらい前のホームページ作成時は1と2を別々の会社にして、少し面倒でした。

エックスサーバー or ConoHa WING であれば、レンタルサーバーの料金にドメインも含まれているので、そういう意味でもお勧めです。

レンタルサーバーの契約をすれば、ドメイン料金は永久無料です。

しかもConoHa WINGだと2つのドメインが無料です。

 

3、WordPressのテーマ

WordPressのテンプレート的なものです。

テンプレートの機能が豊富であればいろいろなことができますが、値段が高いです。

1万~3万ぐらいの価格帯が多かったです。

HTML、CSS、プログラムができるなら、無料のテンプレートで十分だと思います。

そもそもプログラムできるなら、WordPress使う必要ないですが。。

 

どのテーマにするのか?迷ったのですが、「New Standard」にしました。

newstd.net

 

14日間無料で試すことができたので、使ってみると、汎用的で機能が充実していてとても使いやすかった。

使い方のマニュアルもあるので、初心者でも安心して始めることができます。

ユーザーマニュアル | New Standard

 

ただ若干値段は高めで3万円弱となりますが、十分に価値はあると思います。

申込時に以下のクーポンコードを利用すると1000円引きとなります。

R7t9KPvT

 

以下に New Standard を利用して作成したホームページの事例があります。

いろいろな業種のホームページが作成できると思います。

newstd.net

 

あと、お菓子屋専用のテーマですが、「SWEETY」も良いかな~と思いました。

値段は安めの12000円弱です。

WordPressテーマ「SWEETY」(tcd029) | ワードプレステーマTCD

 

お菓子屋専用のテーマなので、かなり細かく設定できます。

無料期間がないのと、機能は少ないのですが、設定が多すぎる感じがしたので、私は辞めました。

お菓子屋&時間がある方なら「SWEETY」がお勧めです。(だと思います)

 

以上になります。

RDSのSQL Serverでデータベース削除するコマンド

RDSのSQL Server 2019でデータベース削除するコマンド

対応

SSMSで以下のコマンドを実行

EXECUTE msdb.dbo.rds_drop_database  N'your-database-name'


参考

Microsoft SQL Server データベースの削除 - Amazon Relational Database Service

 

 

SSMSで以下のコマンドを実行するとエラーになります

DROP DATABASE データベース名

エラー内容

The database データベース名 is currently joined to an availability group. Before you can drop the database, you need to remove it from the availability group.

(可用性グループからデータベースを削除する必要があります)

 

備考

データベース名に「-」がある場合は以下のように [] で囲うこと

例)EXECUTE msdb.dbo.rds_drop_database  [your-database-name]

JAVAでLINEのプッシュメッセージを送る

JavaでLINEのプッシュメッセージを送る簡単なサンプルを作りました。

推奨としてはLINE公式サイトにある「Java SDK for Messaging API BOT」のLineMessagingClientを利用になります。

上記を設定するのは面倒くさいので、推奨していない方法でLINE Messaging APIを利用してメッセージを送ります。(非推奨ではない、と思っています)

 

今回は細かい説明は省略します。

 

前提

・LINE Developerでテスト用のチャネルを作成済

・そのチャネルで友だち追加済

・LINEメッセージ送信に必要な情報を入手済

 ⇒ チャネルアクセストークンとユーザーID

Javaの開発環境でLombok、jacksonは設定済

・LINE Messaging APIは以下を利用する

 https://api.line.me/v2/bot/message/push

 

ソース

①LINEメッセージを送信するクラス

public class LineMsgSample {

// LINEプッシュメッセージAPIURL
private static final String LINE_MSG_API_URL = "https://api.line.me/v2/bot/message/push";
// LINEプッシュメッセージ送信タイプ
private static final String LINE_MSG_TYPE_TEXT = "text";

/**
 * LINEメッセージを送信する。
 *
 * @throws AppRuntimeException
 */
public void sendLineMsg() {

	// 送信先のユーザーID
	String userId = "U00XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
	// チャネルアクセストークン
	String accessToken = "rWXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
	// 送信するメッセージ
	String lineMsg = "メッセージを送信しました。";

	try {
		// HttpClientを生成
		HttpClient client = HttpClient.newBuilder()
			.connectTimeout(Duration.ofSeconds(10L)) // 接続タイムアウト(10秒)
			.build();

		// LINEメッセージをJSONに変換
		String sendJson = setJsonString(userId, lineMsg);

		// ビルダーを使用してHttpRequestを生成
		HttpRequest request = HttpRequest.newBuilder()
			.timeout(Duration.ofSeconds(10L))	 // 応答タイムアウト(10秒)
			.uri(URI.create(LINE_MSG_API_URL))	 // 送信先を設定
			.POST(BodyPublishers.ofString(sendJson)) // POST送信でJSON文字列をBodyに設定
			.setHeader("Content-Type", "application/json; charset=UTF-8")
			.setHeader("Authorization", "Bearer " + accessToken)
			.build();

		// LINEメッセージリクエストを送信
		HttpResponse response =client.send(request, BodyHandlers.ofString());

		// LINEAPIのステータスコード取得
		int statusCode = response.statusCode();

		// ステータスコードの判定は省略(200以外はエラー)

	} catch (Exception e) {
		// 例外処理を入れる
	}
}

/**
 * LINE送信メッセージをJSONに変換する
 *
 * @param userId ユーザーID
 * @param lineMsg 送信するメッセージ
 * @return LINE送信メッセージ(JSON形式)
 * @throws JsonProcessingException
 */
private String setJsonString(String userId, String msg) throws JsonProcessingException
{
	// Beanにデータを設定
	LineMsgObjBean lineMsgobj = new LineMsgObjBean(LINE_MSG_TYPE_TEXT, msg);
	List lineMsgObjList = new ArrayList<>();
	lineMsgObjList.add(lineMsgobj);
	LinePushMsgMainBean linePushMsgMain = new LinePushMsgMainBean(userId, lineMsgObjList);

	// JSONに変換
	String sendJson = new ObjectMapper().writeValueAsString(linePushMsgMain);

	return sendJson;
}

}

 

②LINEプッシュメッセージのメインBean(JSON変換用)

import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonPropertyOrder({"to", "messages"})
public class LinePushMsgMainBean {
	/** 送信先のID */
	@JsonProperty("to")
	private String userId;

	/** LINEメッセージオブジェクト */
	@JsonProperty("messages")
	private List lineMsgObjList;
}

 

③LINEメッセージオブジェクトBean(JSON変換用)

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonPropertyOrder({"type", "text"})
public class LineMsgObjBean {
	/** メッセージタイプ */
	private String type;

	/** 送信するメッセージ */
	@JsonProperty("text")
	private String lineMsg;
}


結果

LINEのトーク上の送信されたプッシュメッセージ

 

以上になります。

今回はテキストのみ対応のメッセージとなります。

初めて送信できたときは少し嬉しくなりました♪

「SSL/TLS のセキュリティで保護されているチャネルを作成できませんでした」の対応方法

構築中のサーバーでLINEのAPIを呼び出すと「要求は中止されました: SSL/TLS のセキュリティで保護されているチャネルを作成できませんでした」のエラーとなりました。

ローカル環境(自分の端末)だとStatusCodeは「200」(正常)となります。

 

環境により、以下のようなエラー内容にもなります。

「リモート パーティがトランスポート ストリームを終了したため、認証に失敗しました。」

「接続が切断されました: 送信時に、予期しないエラーが発生しました。。 リモート パーティがトランスポート ストリームを終了したため、認証に失敗しました。」

接続エラー時に「予期しないエラーが発生しました。。」のエラーに遭遇しますが、「。。」が気になります。

 

LINEがTLS1.2以降対応ということがわかりました。
ニュース: 2021年 の記事 | LINE Developers

 

エラーが発生した環境:Windows Server 2019(EC2)

諸事情でその他バージョンなどは記載できません。

 

対応方法

TLS1.0/1.1 を無効化する

レジストリを変更し、サーバー再起動すればOKです。

 

以下のレジストリキーを新規に追加(あれば追加不要)

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server

 

上記のキー配下それぞれに以下の値を追加

値: Enabled
値の種類: REG_DWORD
設定値: 0

値: DisabledByDefault
値の種類: REG_DWORD
設定値: 1

 

手動で追加するのが大変なら、ファイル拡張を「reg」にして、ファイルを実行(ダブルクリック)する。

例)tls12.reg

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001

レジストリを変更したので、サーバーの再起動も必要になります。

 

LINEのAPIを叩くだけなので、正確にはレジストリキーは「Client」だけ追加すれば大丈夫だと思います。

「DisabledByDefault」無くても正常に動作することは確認済です。

ただセキュリティ的に上記の全てを追加した方が良いです。

 

以下になっていれば、正しく設定されています。

 

AWS環境で構成としてはALBにSSL証明書をつけているのですが、サーバーもTLS1.2に対応しないとダメなのですね。

 

上記の設定で正しく動作しない場合

NET Framework4.6以前の場合は以下の対応も必要
※もしくは上記の設定だけで正しく動作しない場合も実施すること

 

以下のレジストリキーを新規に追加(あれば追加不要)

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319

 

上記のキー配下それぞれに以下の値を追加

値:SchUseStrongCrypto
種類:REG_DWORD
データ:1

 

手動で追加するのが大変なら、ファイル拡張を「reg」にして、ファイルを実行(ダブルクリック)する。

例)tls12-2.reg

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

 

以下、参考にさせて頂いたサイトです。

www.guri2o1667.work

 

docs.microsoft.com

AWS CloudFormationを知識0から作る(その1)

私がAWS CloudFormationを使いたいけど、どうすればいいのか?分からなかったので、全く知識ない状態からある程度の設定ができるまでをなるべく分かりやすく書いていきます。
AWS CloudFormationを使いたい!!」という人向けの記事なので、「AWS CloudFormation」って何?とか、何が便利なの?という説明は無いです。

 

ゴールをしては、AMIからEC2をある程度の設定を含め、作成すること。
以下のCloudFormationのテンプレートを書けるまでの知識を記載していきます。

VPC、サブネット、セキュリティグループ、ロールは既に作成済のものを指定
② EC2のAMI、インスタンスタイプ、EC2名はパラメータから指定

AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  EC2Name:
    Type: String
  ImageId:
    Type: AWS::EC2::Image::Id
  InstanceType:
    Description: WebServer EC2 instance type
    ConstraintDescription: Must be a valid EC2 instance type
    Type: String
    AllowedValues:
      - t3.medium
      - c5.large

Resources:
  CreateEC2Instance:
    Type: AWS::EC2::Instance
    DeletionPolicy: Retain
    Properties: 
      ImageId: !Ref ImageId
      InstanceType: !Ref InstanceType
      SubnetId: subnet-0bxxxxxxxxxxxxxxx
      SecurityGroupIds:
        - sg-0exxxxxxxxxxxxxxx
      KeyName: test-key
      IamInstanceProfile: !Ref MyInstanceProfile
      Tags:
        - Key: Name
          Value: !Ref EC2Name

  MyInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
      - "TEST-EC2Role"

②のパラメータから指定というのは、AWSのマネコンから指定できるということです。
以下のように状況によっていろいろ指定することでテンプレートを汎用的に利用することができます。

f:id:rikues2012:20220418100502p:plain

パラメータ設定

前提

AWS CloudFormationはJSON形式とYAML形式のどちらかを利用します。
YAML形式のみの記載方法を説明。

 

YAML形式の書き方

いろいろ仕様がありますが、まずは以下の2つだけ覚えれば何とかなります。

1、コロンの後に半角スペースを1つ入れる
  (正確には2つでも3つでも問題ないです)

    Type: String
    DeletionPolicy: Retain

2、ネストする2つの半角スペースを入れる
  (正確には1つ以上あれば問題ないです)

Resources:
  CreateEC2Instance:
    Type: AWS::EC2::Instance
    DeletionPolicy: Retain

以下、参考ページです。

情報量がそんなに多くないので、理解しやすかったです。

www.task-notes.com

 

 

ここまでの知識で以下のリンクからVPCを作ることができます。
CloudFormationのテンプレート6行でVPCができるので、「なんか自分でもCloudFormation使えそうだな~」という実感がわくのでかなりお勧めです。
少しインプットしたら、少しアウトプットして、その繰り返しで挫折せずにいろいろ出来ていくと思います。

dev.classmethod.jp

 

1回目の説明は以上になります。
私はここまでできた時点で、あるプロジェクトで「AWS CloudFormation」を利用して構築&運用することを心の中で決めました。

 

サーバーを冗長化してEFSにファイル作成をすると、稀にファイルが見つからない

WEBサーバーでEC2を複数構成(仮にサーバーAとB)にして、EC2(A)でEFSにファイルを作成すると、EC2(B)からそのファイルを参照できないということが稀に発生していました。

ファイルを新規で作成した直後に起こることが多いとの報告がありました。

AWS認定試験問題のような記載になってしまった。

マネジメントコンソールからEFSで設定できる項目はほぼ無いので、「EFSの設定に問題は無い!!」と思っていましたが、マウント時の設定に問題がありました。。

 

マウント時及びfstabファイルに「noac」オプションを追加すれば、OKです。

 

原因

公式サイトにEFSでは書き込みの遅延が発生すると記載がありました。

「カスタム NFS クライアント設定があり、Amazon EC2 インスタンスファイルシステムで別の Amazon EC2 インスタンスから実行された書き込み操作を参照するのに最大 3 秒かかります。」

Amazon EFS のトラブルシューティング: 一般的な問題 - Amazon Elastic File System

 

いろいろテストも終わった後にEFSを急遽導入することになって、調査不足でした。

やむなし。。

 

対応

マウント方法を以下に変更

mount -t nfs4 -o nfsvers=4.1,noac,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport <efs名>.efs.<リージョン名>.amazonaws.com:/ <マウントポイント>

<efs名>:fs-<固有のID>

<リージョン名>:ap-northeast-1 ※東京リージョンの場合

 

AWSのマウントオプションの推奨値も公式ページを参考に設定

マウントに関するその他の考慮事項 - Amazon Elastic File System

 

/etc/fstab を以下に変更(今回追加した分だけ)

<efs名>.efs.<リージョン名>.amazonaws.com:/ /dldata nfs4 nfsvers=4.1,noac,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev,noresvport 0 0

この辺の細かい設定はあまりしたことなかったですが、マウントとfstabは同じオプション設定でOKということを知りました。

 

気になっていること

今回の対応で問題は解決されました。

が、いろいろ調べていくと「noac」オプションを付けることで問題もありそうです。

キャッシュしなくなったので、なんとなく性能は悪くなるような気はしていました。

 

問題1:パフォーマンスに影響あり

AWSのフォーラムにありました(参照するにはログイン必要かも?)

https://forums.aws.amazon.com/thread.jspa?threadID=245354

 

問題2:「lookupcache=none」オプションの方が良さそう

NFSのマウントオプションについて - Dell Community

 

問題は解決したけど、新たな問題が出そうな気もしています。

落ち着いたら再調査するか。。

 

2022/06/09 追記

「noac」、「lookupcache=none」どちらも非推奨との指摘あり

AWS公式ページに記載があります。

docs.aws.amazon.com