サーバーを冗長化して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

 

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

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

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

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

マルチサイト?ですね。

EC2を冗長化する必要あるの?と思ったのですが、冗長化することでの問題点をテスト環境で確認したいということでそんなことになりました。

 

【環境】

・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/

 

以上になります。

 

参考

以下を見て、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/


以上で完了です。