1つのALBで複数のサイトを作る

テスト用のサイトを3つ作ることになり、あまりお金をかけたくないということで、ELB(ALB)1つにサーバを2台で冗長化することになりました。

1つのALBに3つのサイト(URL)を設定する手順になります。

マルチサイト?ですね。

 

【環境】

・OS:Amazon Linux2

・Webサーバ:Nginx

・アプリ:Springbootを使って作成

JavaAmazon Corretto 11

※あまり本編とは関係ないですが、記載しました

 

構成図

・ALB1台

・サーバ2台

・ターゲットグループ3つ(サイトごと)

ドメインはR53で作成

SSLACMで作成

AWS構成図

AWS構成図

手順概要

  1. サーバ:アプリをサイトごとに配置
  2. サーバ:application.properties 修正(ポート、ログ出力場所の変更など)
  3. サーバ:Nginxのconfをサイト(サブドメイン毎)に分ける
  4. AWS:Target groupを作る(3つ)
  5. AWS:ALBを作る(1つ)
  6. AWS:R53でサブドメインを作る(3つ)
  7. AWSACMSSL証明書を作成 (3つ)
  8. AWS:ALBにSSL証明書を設定
  9. AWS:ALBにターゲットグループを設定

 

手順

1.アプリをサイトごとに配置

EC2内にサイトごとにフォルダを作成し、そこにjarやapplication.propertiesを配置

 

2.application.properties 修正

ポートを分けます。

例えばサイト1が「8081」、サイト2が「8082」、サイト3が「8003」。

 

3.Nginxのconfをサイト(サブドメイン毎)に分ける

3-1. nginx.confのserver ディレクティブ(赤枠)を削除

# vim /etc/nginx/nginx.conf

/etc/nginx/nginx.conf

3-2. サイトごとにconfファイルを作成する(今回は3サイトなので3ファイル作成)

# cd /etc/nginx

# cp -p nginx.conf.default conf.d/site1.conf

# vim /etc/nginx/conf.d/site1.conf

サイトごとのconfファイル

3-3. nginx.conf のフォーマットチェック

#nginx -t -c /etc/nginx/nginx.conf

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

↑syntax is ok、 successfulになっていることを確認

/etc/nginx/conf.d 配下のファイルも同様に確認

 

4.Target groupを作る(3つ)

AWSマネジメントコンソールから、ターゲットグループを選択し、3つ作成する。
※特に気を付けることは無いので手順は省略

3つのターゲットグループにEC2を2つずつ紐づけておく。

 

5.ALBを作る(1つ)

ALBを1作る。(細かい設定は最後に行い、ここでは作るだけ)

※手順は省略

 

6.R53でサブドメインを作る(3つ)

以下、ポイントです。

サブドメインは3つ作るが、手順5で作成したALBを選択(全て同じ)

レコード名だけ異なり、他は全て同じ設定になります。

R53でサブドメイン作成

7.ACMSSL証明書を作成(3つ)

ACMにてSSL証明書を作成します。

以下、手順のリンクです。

rikues2012.hatenablog.com

 

8.ALBにSSL証明書を設定

ポイントだけ手順を記載します。
1つのALBに複数のSSL証明書を付けれるの?と思っていましたが、できました。

 

8-1. AWSコンソールから対象のALBを選択し、リスナーの追加で「443」のポートを追加

 ・セキュリティポリシーは最新のものを選択

 ・デフォルトの証明書は手順7で作成したものの中から1つを選択

 

リスナー追加

 

8-2. リスナータブから「証明書の表示/編集」をクリック

リスナータブ

8-3. 「+」をクリック

8-4. ACMで作成した証明書の一覧がでるので、手順7で作成した証明書を2つ選択し、「追加」をクリック

※手順8-1で1つ証明書を追加したので、ここでは2つのみ追加

ACM追加

9.ALBにターゲットグループを設定

9-1. 以下の操作を実施する

ルールの表示/編集

9-2. 「+」をクリック

9-3. ホストヘッダー(赤枠)にサイトの手順6で作成したサブドメインを設定

※手順9-3 ~ 9-5 をサイト分(3回)繰り返すので、1回の手順では1つのみ設定

f:id:rikues2012:20211015193827p:plain

9-4. 手順4で作成したターゲットグループを赤枠に設定

9-5. 「保存」をクリック

※手順9-3 ~ 9-5 をサイト分(3回)繰り返す。

 

設定としては以上となります。

上記の手順で実装はできたのですが、こうした方が良いのでは?などアドバイス頂けると嬉しいです。

 

AWS IAMについてざっくり理解する

AWSの基本的なところなのですが、IAMについてなんとなくしか分かっていません。

AWS用語が満載なので、用語説明から最終的にはIAMグループとIAMロールの違いまで纏めました。

 

見出し

  1. 用語説明(文字だけ)
  2. 用語説明(図を使って少し詳しく)
  3. IAMグループとIAMロールの違い

用語説明(文字だけ)

ルートユーザー(ルートアカウント)

AWSアカウント作成時に自動的に生成されるユーザー。
1つのみ作成され、全ての操作ができる。
権限が強すぎるため、使うことは推奨されていない。

 

IAMユーザー(IAMアカウント)

AWSアカウントに対して複数作成可能なユーザー。
このユーザを使用して、AWSコンソールにログインします。
AWS利用者1名に1つのIAMユーザーを作成し、運用していくのが一般的。

 

IAMポリシー

「どのAWSサービスの」、「どのリソースに対して」、「どんな操作を」、「許可するか(許可しないか)」、を設定するもの。

 

IAMグループ(ユーザーグループ)

IAMポリシーを入れる箱みたいもの。
いろんなIAMポリシーを詰めて、IAMユーザーに紐づける。

 

IAMロール

IAMポリシーを入れる箱みたいもの。
いろんなIAMポリシーを詰めて、AWSサービス(EC2、CodePipelineなど)に紐づける。

 

用語説明(図を使って少し詳しく分かりやすく)

IAMポリシーについて

よく使うのが、AWS管理ポリシーとカスタマー管理ポリシーになります。
AWS管理ポリシーはAWSが事前に作ってくれたポリシー。
カスタマー管理ポリシーは自分で作るポリシー。
あと、インラインポリシーもありますが、これは私的にはあまり使わないので省略。

 

以下はRDS DBインスタンスの停止と起動のポリシーです。

RDS DBインスタンスの停止と起動のポリシー

RDS DBインスタンスの停止と起動のポリシー

Effect:許可するか(許可しないか)の設定。Allowは許可、Denyは拒否。
Action:どんな操作を対象とするかの設定。上記だとRDSインスタンスの起動と停止。
Resource:どのリソースにの設定。「123456789012」はAWSアカウント。
     「"Resource": "*"」として全てのリソースOKにする場合が多い。

 

IAMグループの使い方

IAMグループ自体は空っぽの入れ物で、IAMポリシーを付ける。
IAMユーザーにIAMグループを付ける。
IAMユーザーに複数のIAMグループを付けたり、IAMユーザーに直接IAMポリシーを付けることも可能です。
IAMグループを間に入れてた方が管理はしやすいです。

IAMユーザーとIAMグループとポリシー

 

IAMロールの使い方

IAMポリシー自体は空っぽの入れ物で、IAMポリシーを付ける。
AWSサービス(EC2、Lambdaなど)にIAMロールを付ける。
例えばWebサーバとして利用するEC2インスタンスからS3にアクセスしたいとき、以下のような設定をしたりします。

AWSサービスとIAMロールとIAMポリシー

 

IAMグループとIAMロールの違い

すごくざっくり言うと(私のイメージでは)、

・IAMグループ:IAMユーザが使う。
・IAMロール:AWSサービスで使う。

IAMグループとIAMロールの違い

自分なりのイメージなので、これで良いのか?というところもあり、少し不安がありますが、纏めました。

ここからさらにポリシーやロールなど細かく記載しようと思ったのですが、今回はここまでに。

 

【参考にしたサイト】

サイト内にYouTubeの動画もあるので、これを見ればかなり分かります。

dev.classmethod.jp

 

iDATEN(韋駄天)| やってみようシリーズ:IAMアカウントを作ってみよう-IAMポリシー解説編-

AWS Certificate Manager(ACM)でSSL証明書を発行する

AWS Certificate Manager(以下、ACM)でSSL証明書を発行する手順になります。

今まで使ってきませんでしたが、無料&発行も簡単なのでお勧めです。

DNS検証」で作成したSSL証明書であれば自動更新されるので、運用も楽です。

※自動更新の条件として、ALBなどでSSL証明書を使用している必要あり

 

前提

・R53にてドメインは作成済

 

手順

Certificate Managerから「証明書のリクエスト」をクリックする。

f:id:rikues2012:20210917144417p:plain

 

「パブリック証明書のリクエスト」を選択し、「証明書のリクエスト」をクリックする。

f:id:rikues2012:20210917144628p:plain

 

ドメイン名を入力し、「次へ」をクリックする。

f:id:rikues2012:20210917144845p:plain

 

DNSの検証」を選択し、「次へ」をクリックする。

f:id:rikues2012:20210917144939p:plain

 

「確認」をクリックする。(※タグの設定は任意なので、今回は設定しない)

f:id:rikues2012:20210917145504p:plain

 

「確定とリクエスト」をクリックする。

f:id:rikues2012:20210917145625p:plain

 

ドメイン名の左にある「▶」を選択する。

f:id:rikues2012:20210917145750p:plain

 

「Route 53でのレコードの作成」をクリックする。

f:id:rikues2012:20210917150014p:plain

 

「作成」をクリックする。

f:id:rikues2012:20210917150153p:plain

 

「続行」をクリックする。

f:id:rikues2012:20210917150400p:plain

 

状況が「検証保留中」になるので、「発行済み」になるまで、2~3分ぐらい待つ。

f:id:rikues2012:20210917150528p:plain

 

状況が「発行済み」になったことを確認する。

f:id:rikues2012:20210917150644p:plain

 

手順としてはこれで完了です。

 

補足

昨年(2020年)にACMで作成した証明書をEC2にも設定できるようになりました。

私はALBにしか設定したことありませんが。。

aws.amazon.com

AWS認定ソリューションアーキテクトプロフェッショナル(SAP)の合格と試験対策

AWS認定ソリューションアーキテクトプロフェッショナル(以下、SAP)に2021年8月に合格しました。

参考になるかは微妙ですが、試験対策など書きます。

試験勉強期間は1ヶ月半ぐらいです。

難しかったですが、1回で合格することができました。

 

試験を受けた理由

AWSの知識を深めるため

・上司から強く受験を勧められて、軽いノリで「はい」と言ってしまった

・2ヶ月ぐらいは業務が緩やかになりそうだったので、集中して勉強できそう

 

試験時のスペック

AWSは細く長く5年ぐらい利用

 ただしアプリ開発、Azureもやっているため、がっつりではない。

・業務で利用するサービスはALB、EC2、RDS、S3、CodeCommit、CodeDeploy、ElastiCache 、EFS、FSx。

 Cloud Front、Lambda、DynamoDB、ECSなども使いたい。。

・SAA保持(ただし3年前に合格し、少し期限切れ)

・情報処理安全確保支援士

 

試験対策教材

以下の2つです。
この2つをちゃんとやれば、合格できると思います。

1.AWS認定ソリューションアーキテクト-プロフェッショナル 試験特性から導き出した演習問題と詳細解説 

www.amazon.co.jp

 

2.AWS WEB問題集で学習しよう

aws.koiwaclub.com

 

勉強方法

■ 概要

1.本を読む&本の問題をとく

2.WEB問題集を3回やる

基本的には在宅ワークなので、以下の感じで勉強しました。

平日:朝の業務前90分、業務後90~120分

休日:2~3時間ぐらい(子供が小さいので、まとまった時間がとれず、ちょこちょこ)

 

■ 詳細

1. 私はAWSの一部のサービスしか使っていないため、まず1の本の2章(各種サービスの概要)をみる。

各サービスでできることを理解しました。

⇒2日間

 

2. WEB問題集 #1~#57(最後まで)の1回目

解答をして間違ったところの解説を読む。解説のリンク先のページ(AWSの公式)まで見ると、1章50分ぐらいかかったので、10章ぐらいからリンク先まで見ないことにしました。

正解率は55%ぐらい(たまたま正解だったのも含む)

⇒ 14日間(1日4~5章ぐらい)

 

3.WEB問題集 #1~#57(最後まで)の2回目

解答をして間違ったところの解説を読む。解説だけでは理解できないところはリンク先を見たり、ネットで調べる。

2回目が一番時間がかかりました。

正解率は70%ぐらい(1回目からそれほど上がっていなくて、少し絶望する)

20日間(1日3~4章ぐらい)

 

4.AWS認定の本の3章以降をやる

WEB問題集と同じ問題もあったため、けっこう分かる問題がありました。

あと、問題の解説がすごく分かりやすい。

図もあり、丁寧に解説されていたので、これをもっと早い段階で見れば良かったと後悔。。

⇒ 3日間

 

5.AWS認定の本の模擬試験をやる

実際の試験と同じ3時間かけてやりました。

75問あるので、1問2~3分しか時間がかけられず、思った以上に時間がないことを実感。

試験前にやっておいて良かった。

ちなみに正解率は65%ぐらいでした。

軽く絶望しました。。

⇒ 半日

 

6.WEB問題集 #30~#57(最後まで)の3回目

なんで#30からにしたかと言えば、ネットで「#30~」の問題が良く出る。とけっこう言われていたから。

あとは業務が忙しく日々が近づいてきたから。。

解答をして間違ったところの解説を読む。

正解率は80%ぐらい(正解率が意外と。。90%ぐらいは欲しい。。)

⇒ 5日間

 

7. 6でやったWEB問題集 #30~#57の間違えた問題だけ

6のときに間違った問題と解説をスクショして、会社で全部印刷。

WEB問題集は1章ごとに7問あり、章内での問題順はランダムなので、WEB上では間違った問題だけやることはできないので。

7問全部正解だったら、飛ばせますが。。

⇒ 2日間

 

試験日前日と当日

試験時間が180分とかなり長めなので、疲れていない午前中の試験にしました。

前日もサラッとだけ勉強し、試験当日には疲れが残らないようにしました。

180分の試験は本当に疲れました。

全然知らない「Neptune」に関する問題が2問あったり。。

分からない問題が多く、泣きそうになりましたが、諦めずに最後まで頑張りました。

合格発表のときは祈りながら薄目でみて「合格」の文字がみえたときは、

少し感動しました。

AWSの公式で得点の範囲が100~1000で750なのでたぶん全問間違えて100点になるのかな。

なので75%ではなく、650/900の72%ぐらいで合格できるのかなと思いました。

少しでも参考にして頂ければ嬉しいです。

 

今後は。。

SAPには合格しましたが、理解が浅い(できていない)ところもありました。

そこを実際にサービスを触りつつ、理解を深める。

と思いつつ、試験合格から1ヶ月のんびり過ごしてしまいました。。

う、う、う。。

次はAWS認定 デベロッパー アソシエイト(DVAを受けます。

 

一応、合格結果です。

f:id:rikues2012:20210917194041p:plain

SAP

 

Dockerでnginxとspring bootを連携

今までDockerを触ったことがなかったので、

NginxとSpriing bootをDockerで作り、連携させることにしました。

基本的にはサーバー上でNginxとSpriing bootを連携させる手順とほぼいっしょであることが分かりました。

 

【前提】

Eclipseなどでspring bootのjarファイルを作成していること。

 

手順

1.以下のようにフォルダ構成を作成する。

【Dockerfileのフォルダ構成】

f:id:rikues2012:20210910181008p:plain

フォルダ構成

・テスト用のサーバで上記のように各フォルダを作成する。

・Nginxのデフォルトのconfファイル(/etc/nginx/nginx.conf)をコピーし、nginx.conf.tmpを作成(後で編集する)

・ローカルで作成したjarファイルを「/home/ec2-user/springboottest/jar」配下にコピー

 

2. Nginx用のDockerfile作成(/home/ec2-user/nginxtest/Dockerfile)

FROM nginx:1.17

# nginxのインストール
RUN apt-get update

# vimのインストール
RUN apt-get install -y vim

RUN rm /etc/nginx/nginx.conf
COPY etc/nginx/nginx.conf.tmp /etc/nginx/nginx.conf

vimはインストールしなくても問題ないが、コンテナ内に入った時にファイルを確認するためにインストール

 

3. ngnix用のconfファイル作成(nginx.conf.tmp)

 デフォルトのconfファイルをコピーし、赤字の行を修正

   server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        #root         /usr/share/nginx/html; ←ここをコメント

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
                proxy_pass http://app:8080/; ←ここ
        }

「app:8080」の「app」は任意の名称を設定。

ここが大事なポイントの1つ。

 

4. ローカルで作成したjarファイルを以下にコピー

・/home/ec2-user/springboottest/jar

f:id:rikues2012:20210910183027p:plain

 

5. spring boot用のDockerファイルを作成(/home/ec2-user/springboottest/Dockerfile)

FROM amazoncorretto:11.0.3

ADD jar/test.jar /root/test.jar
CMD java -jar /root/test.jar

6. Dockerイメージを作成

 ようやくここからDockerイメージの作成が始まります。。

 6-1. Nginx用のイメージを作成

 # cd /home/ec2-user/ngnixtest

 # docker build -t nginx17 .

 f:id:rikues2012:20210910183345p:plain

「Successfully」が出力されることを確認

 

 6-2. Nginx用イメージが作成されたことを確認

 # docker images 

f:id:rikues2012:20210910183506p:plain


 6-3. spring boot用のイメージを作成

 # cd /home/ec2-user/springboottest

 # docker build -t spring2019 .

 ※2019年に作ったので、分かりやすく2019にしました

 f:id:rikues2012:20210910183634p:plain

 「Successfully」が出力されること確認

 

 6-4. spring boot用のイメージが作成されたことを確認

 # docker images

f:id:rikues2012:20210910183822p:plain

 

7. Dockerのコンテナ作成 & 起動

spring boot用のコンテナとnginx用のコンテナを連携させるため、spring boot用のコンテナを先に立ち上げる。

※順番が逆でも大丈夫でした。。

 

 7-1. spring boot用のコンテナ作成&起動

 # docker run -d --name spring-container -p 8080:8080 spring2019

 

 7-2. spring boot用のコンテナ作成&起動の確認

 # docker ps -a

f:id:rikues2012:20210910184243p:plain

 

 7-3. nginx用のコンテナ作成&起動

 # docker run -d --link spring-container:app --name nginx-container -p 80:80 nginx17

 「app」はngnix用のconfファイル作成に書いた「proxy_pass http://app:8080/;」と同じ文字列にする。

 

 7-4. nginx用のコンテナ作成&起動の確認

 # docker ps -a

f:id:rikues2012:20210910191746p:plain

 

 7-5. 動作していることをWebブラウザから確認

 http://サーバのグローバルIP/

 

以上になります。

 

進化系記事

rikues2012.hatenablog.com

2024.03.21 追記

dockerコマンドの--linkオプションは非推奨のため、docker-composeコマンドなど他のコマンドを利用した方が良さそうです。

docs.docker.com

 

 

参考

以下を見て、Dockerを理解しました。

ちょっとオタク系の感じがしてどうかな?と思ったのですが、内容は簡潔で分かりやすかったので、けっこうお勧めです。

以下のシリーズの①、③も合わせて購入しました。

booth.pm

nginxとspring boot連携(たぶん最小手順)

【環境】
OS:Amazon Linux2(Linux7 or CentoOS7 と同じ)

【前提】
自動起動(systemctl enable)の設定は省いている
・ローカル環境でEclipseなどでjarファイルを作成し、サーバに配備(/tmp/test.jar)


【手順】
1、nginxをインストール
  amazon-linux-extras install nginx1.12

  起動
  systemctl start nginx

  自動起動
  systemctl enable nginx.service

2、javaインストール
  yum install java-11-amazon-corretto

3、nginxとspring bootを連携
  // 以下に移動
  cd /etc/nginx
  // 赤字の個所のみ修正
  vim nginx.conf

   server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        #root         /usr/share/nginx/html;  ←ここ

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
                proxy_pass http://localhost:8080/; ←ここ
        }


ポイント:rootはコメントで大丈夫!!

  // nginxの再起動
  systemctl restart nginx

4、spring bootの起動
  java -jar /tmp/test.jar

5、確認
  http://サーバのIP/


以上で完了です。

 

進化系記事

Dockerでnginxとspring bootを連携した手順です。

rikues2012.hatenablog.com

Amazon RDS for SQL Serverでリンクサーバーを設定する

Amazon RDS for SQL Serverでリンクサーバーを設定する方法になります。

SQL Serverのバージョンは2019です。

RDSだと管理者権限が無いので設定できないと思ったのですが、設定できました。

 

以下、イメージ図です。

同じVPC内にあります。(AZ構成は省略)

f:id:rikues2012:20210910103021p:plain

イメージ構成図

前提

・RDSは作成済。

・SSMSで以下の操作からリンクサーバーを作成しようとするとエラーになる。

 「サーバーオブジェクト」→「リンクサーバー」で右クリック、「新しいリンクサーバー」をクリックすると、sysadminロールのメンバーでなければなりません。」と怒られます。

・なので、SSMSでTransact-SQLを使用して、リンクサーバーを作成する。

 

DB名:Test1(Testテーブル1つだけ作成)

f:id:rikues2012:20210910110324p:plain

 

DB名:Test2(Testテーブル1つだけ作成)

f:id:rikues2012:20210910105933p:plain

 

手順

Test1 から Test2へのリンクサーバーの設定を行う

 

1.  リンクサーバーを作成するクエリを2つ作る

 1-1. sp_addlinkedserverでリンクサーバーを設定

EXEC master.dbo.sp_addlinkedserver 
    @server = N'LINK_Test2', 
    @srvproduct='', 
    @provider='SQLNCLI', 
    @datasrc='xxxxx.xxxxx.ap-northeast-1.rds.amazonaws.com';

・server:作成するリンクサーバーの名前(何でもOK)
・srvproduct:リンクサーバーを作成するサーバー名(未指定で大丈夫)
・provider:リンクサーバーとして追加するOLE DBソース名(設定値:「SQLNCLI」)
         ※「SQLNCLI」を指定すると最新バージョンのClient OLE DBとなる
・datasrc:接続するRDSのエンドポイント

 

1-2. sp_addlinkedsrvloginでアクセスのための情報を設定

EXEC master.dbo.sp_addlinkedsrvlogin 
    @rmtsrvname=N'LINK_Test2',
    @useself='FALSE',
    @locallogin=NULL,
    @rmtuser='ユーザー名',
    @rmtpassword='パスワード';

・rmtsrvname:リンクサーバー名を指定(設定値:@serverと同じ名称)
・useself:基本はfalse(Windows認証したい場合は「true」)
・locallogin:ローカルサーバー上のログイン(設定値:NULL ※規定値もNULL)
・rmtuser:ユーザー名(@datasrcのDBに接続するユーザー名)
・rmtpassword:パスワード(@datasrcのDBに接続するパスワード)

 

2. クエリーを発行する。

f:id:rikues2012:20210910114246p:plain

SSMS リンクサーバー作成クエリ発行

リンクサーバーの設定により、別インスタンスにあるTest2内のテーブルが参照

することができました。

Test2 ⇒ Test1へのリンクサーバの設定も同様の手順で実施できます。

 

補足1

今回はRDS同士のリンクサーバーの設定でしたが、

EC2 on SQL Server と RDS for SQL Serverでもリンクサーバの設定は可能です。

※実施してはいませんが、公式サイトに記載がありました。

 

補足2

リンクサーバの削除はSSMSのGUIでできました。

削除するコマンド調べないで良かった。。

f:id:rikues2012:20210910120124p:plain

 

参考サイト

以下、公式サイトでの設定方法

 

以下、リンクサーバの設定方法