未経験からのフルスタックエンジニア

スキルをつけよう!未経験からフリーランスエンジニアへの成長記録

AWS 学習履歴(9)~サーバレス・SQS・SNS・SES・Lambda~

AWS学習履歴の趣旨

AWSでデプロイをしたことはあるものの、AWSの理解に足りない部分があるのが悔しいと思い、UdemyのAWS講座で勉強を開始しました。

以下の記事の続きです。

atora1992.hatenablog.com

学習内容を全て残すことは量が莫大になるので無理ですが、『重要かな?と思った部分を記録として残そう!』というのが趣旨です。

更新頻度は不定期ですが、地道に続けていこうかと思います。

応援よろしくお願いします。

サーバレス

サーバレスにすることでコンポーネント疎結合化する。

コンポーネント間の相互依存を減らした構成とすることで、一つのコンポーネント変更や障害の影響を削減できます。

AWSでの主要サービスは、ELBLambdaSQSSNSです。

サーバレスにすることで、耐障害性の強化や、負荷対応・スケーリングの容易化、システム構成の追加・変更の容易化につながります。

SQS

Amazon Simple Queue Serviceの略称です。

プロセス間通信などのスレッド間通信に使われるコンポーネントです。制御やデータを伝達するポーリング型のキューサービスです。

ポーリングとは、複数のプログラム間通信に対して、一定のタイミングの問い合わせがあった場合に、送受信処理を行う通信方式のことです。中継地点に通信内容をためておいて、受信側のタイミングがいいときに通信を行うことで、受信処理中でも送信処理が滞らなくなります。

SQSはこの中継地点に当たるサービスです。キューを溜め込んでポーリング処理を実施します。つまり、送信された内容をキューとして保持し、受信側が通信内容を問い合わせ、キューがあった場合にデータを伝達します。送受信の双方向通信です。

基本的には256KBまでの軽いデータしか利用できません。メッセージは60秒から14日間保持することができます。

SNS

Amazon Simple Notification Serviceの略称です。

プッシュ型(通信を仲介するだけでメッセージは非永続的、一方通行)通知サービスで、他のサービスとの非同期通信を可能にします。

送信側がトピックを作成して、受信側をポリシーで指定することで、SNSを介して制御された非同期通信を可能にします。

SES

Amazon Simple Email Serviceの略称です。

Eメールサービスです。(Eメールの配信に特化)

単なるメールサーバーとして利用するだけでなく、アプリから自動でメール送信やメール通知を利用してSNSやS3などとの連携処理に利用可能です。

サーバレス化によるサービス化

サーバレス化とは、サーバー(EC2インスタンス)ではなく、Lambdaなどのコンピュートサービスによるシステム構成をできる限り利用することです。

Lambdaを利用してシステムを疎結合化するのがアーキテクチャの基本です。

サーバレス化することで、疎結合化が進み、疎結合化によってマイクロサービス化されたアプリケーションの構築ができます。

マイクロサービスとは、より小さなプロセス単位(機能単位)のサービスをAPIで連携することです。

疎結合化が進むからこそ、マイクロサービス化(機能単位でサービスを分割できる)が進み、マイクロサービス化が進むことでさらに疎結合化が進みます。

Lambda

サーバーを設置せず、コードだけをデプロイ・実行できるデータ処理サービスです。

Lambdaファンクションというコードを用意して、アプリからLambdaを呼び出すだけで実行できる単純なものです。

イベントドリブンなアプリケーションが可能で、イベント発生後に数ミリ秒以内にLambdaコードが実行されます。

コードを一から作成することもできますが、ブループリントというサンプルコードがあるので、利用するユースケースからサンプルコードを選び、その修正をすることでコーディングの効率化も可能です。

ポートフォリオサイト改修完了

ポートフォリオサイト改修

atorayamada.github.io

ポートフォリオサイトが、以前のものは2日間ほどでざっと作っただけだったので、「自分を出す!」をコンセプトに作り直しました。

Vue.jsを学習して、外部リンク以外はSPA(Single Page Application)となっております!

ぜひ見てやってください!

【Haml】部分テンプレートのCSSを特定ページのみで変える方法~Rails・Haml・CSS~

学べること

以下の画像の中で、ヘッダーは部分テンプレートを使用しています。
1枚目の表示になるように部分テンプレートを作成した場合、2枚目の表示のために部分テンプレートを作り直したり、CSSファイルを作成するのは面倒だと思います。

Image from Gyazo Image from Gyazo

そこで、すでにclassやidが宣言されているタグのcssプロパティを、特定のページ(hamlファイル)のみで変更する方法があります。

styleタグ

HTMLのタグにstyleタグというものがあります。

これは、htmlファイルに直接スタイルシートの内容を書くためのタグです。
これを用いれば、特定のページのみでcssの微調整が可能です。

<style>
p.sample {font-weight:bold; color:orange;}
</style>
<p class="sample">
スタイルタグ
</p>

Hamlでの書き方

:css
   p.sample {
      font-weight: bold;
      color: orange;
   }
%p.sample  スタイルタグ

まとめ

上記の例ではわかりにくいかと思いますが、部分テンプレート(Railsなので"=render"で読み込むもの)に対しても同様の書き方で、cssの上書きが可能です。

「部分テンプレートの一部だけスタイルを変えたい!」という時に活用してみてください!

AWS 学習履歴(8)~キャッシュ・ElastiCache・CloudFront~

AWS学習履歴の趣旨

AWSでデプロイをしたことはあるものの、AWSの理解に足りない部分があるのが悔しいと思い、UdemyのAWS講座で勉強を開始しました。

以下の記事の続きです。

atora1992.hatenablog.com

学習内容を全て残すことは量が莫大になるので無理ですが、『重要かな?と思った部分を記録として残そう!』というのが趣旨です。

更新頻度は不定期ですが、地道に続けていこうかと思います。

応援よろしくお願いします。

キャッシュ

一度アクセスしたデータを保存し、次回アクセス時に高速アクセスできるようにする仕組みのこと。

繰り返し取り出すデータやコンテンツについてはキャッシュを利用する。

AWSの関連する主要サービスは、ElastiCache(DBの一種)、CloudFront(DBの一種)、S3。

ElastiCache

インメモリキャッシュ。つまり、メモリ(ディスク型DBよりも高速処理可能)とキャッシュを組み合わせたもの。

キャッシュ自体をメモリに保存してやりとりする仕組みで、データの即時反映が必要なケースなどに活用する。

例えば、ゲームイベント終了時のランキングや、画像データの高速表示など。

CloudFront

AWSが提供するCDN(Content Delivery Network)サービス。

CDNとはコンテンツ配信処理を高速化するためのサービスです。

CloudFrontは、大規模アクセスでも世界中にあるエッジ(端末近くのサーバー)のキャパシティを活用して、効率的かつ高速にコンテンツ配信が可能なサービスです。

次の記事へ

atora1992.hatenablog.com

AWS 学習履歴(7)~データベース・DynamoDB・Aurora・EFS~

AWS学習履歴の趣旨

AWSでデプロイをしたことはあるものの、AWSの理解に足りない部分があるのが悔しいと思い、UdemyのAWS講座で勉強を開始しました。

以下の記事の続きです。

atora1992.hatenablog.com

学習内容を全て残すことは量が莫大になるので無理ですが、『重要かな?と思った部分を記録として残そう!』というのが趣旨です。

更新頻度は不定期ですが、地道に続けていこうかと思います。

応援よろしくお願いします。

データベース

データベースには大きく分けて2つあります。

  1. リレーショナルデータベース(RDB
  2. NoSQL(ビッグデータ向けDB)

RDB

データ間の関係性が定義されているDBです。

列と行からなるいくつかのテーブルで定義されています。このテーブル間のリレーションが設定されているおかげで、テーブル同士の関係性がわかるようになっています。

データの操作にはSQLを使用しており、例えば、会計データや顧客データといった構造化データに利用します。

NoSQL

リレーショナルデータ構造を持たない、かつ、SQLを利用しないDBの総称です。ただし、現在はSQLSQLに似た適用モデルもあります。

データとしては、構造化されていないキーバリュー形式のデータ・動画・画像・ドキュメントなどの非構造化データや、XMLJSONなどの半構造化データを対象としています。

構造がRDBに比べて軽いので、ビッグデータなど大量のデータを扱うのに向いています。

データベースの種類ピックアップ

RDBと分散OLTP以外はNoSQLです。

種類 説明
RDB 業務システム向けのDBの基本
DWH(データウェアハウス) 構造化データを利用した経営分析向けのDB。データ抽出・集約に特化(レスポンス重視)なので、更新・トランザクションは遅い。読み込むデータ構造をあらかじめ設計する必要がある。AWS: Redshift
分散型DB/データレイク ビッグデータやIoTデータを蓄積して高速処理を可能にするDBとストレージの組み合わせ。データ抽出に特化したDB。AWS: S3
KVS(キーバリュー型) シンプルなデータ構造で高速処置を可能にしたDB。結果整合性を採用しており、キーに応じてデータを分散処理する。大規模なWebサイトのユーザーセッションなどのバックエンドデータやIoTセンサーデータなどに使用する。AWS: ElastiCacheDynamoDB
ワイドカラム型 キーに対してカラムを大規模に登録できる。可能な限り多くのデータを同じ行に保持し、シンプルなオペレーションを高速処理できる。FacebookTwitterなどのソーシャルデータの位置情報データストレージ・リアルタイム分析・データマイニング処理に使用する。AWS: DynamoDB
ドキュメントDB キーに対してドキュメント指向でXMLなどのデータを格納できる。大規模Webのログ保管やオンラインゲームデータなどの半構造化データに使用する。AWS: DocumentDB
インメモリデータグリッド KVSの仕組みをメモリを利用して高性能にしたDB。大量データを多数のサーバーのメモリ上で分散して管理し、ミリ秒単位の高速応答が可能。金融の取引処理などに使用する。AWS: Redis ElastiCacheMemcached ElastiCache
全検索型エンジン×分散DB データの全検索エンジンであるElasticsearchと分散データベースとを連携してデータ全検索処理が可能。サイト内のデータ検索などに使用する。AWS: Elasticsearch Service
グラフDB グラフ構造でデータ間のつながりを検索・可視化するDB。マインドマップのようにデータ関連をグラフ表示する。AWS: Neptune
分散OLTP(RDB) 分散型はNoSQLだったが、分散型でもRDBを構築するDB。RDBの構造とNoSQLの分散処理を兼ね備える。大規模な業務データ処理に使用する。AWS: Aurora

DynamoDB

キーバリュー(ワイドカラム型)のDBです。

キーに対するバリューのCRUD操作、簡単なクエリやオーダー、数万人以上の同時アクセスへの処理ができます。

結果整合性を採用し、パーティショニング(データを複数に分割し、並列処理を可能に)による大量データの高速処理ができるが、細かいデータ処理には向きません。

ビッグデータのデータベースや大規模サービスでのデータ高速処理に使用できます。

DynamoDB Streamを用いれば、DynamoDBテーブルに保存された項目の追加・変更・削除発生時の履歴をキャプチャできます。これを用いれば、データ更新をトリガーにしたアプリケーション機能やレプリケーションに活用できます。

Aurora(Amazonオリジナル)

NoSQL型の分散高速処理とRDBとしてのデータ操作性を両立させた分散型のRDBです。RDSのデータベースソフトウェアの一つとして選択できます。

MySQLの2.5~5倍の性能+1/10の価格で提供されています。

高い並列処理機能によって大量の読み書きをするのに適したDBです。また、MySQL/PostgreSQLと互換性があり、同じ操作方法を利用可能です。

EFS(Elastic File System)

複数のEC2インスタンスからアクセス可能な共有ストレージです。(EBSでは複数インスタンスを持つことはできませんでした)

S3も共有可能ですが、S3はデータの長期保管用です。EFSはアプリケーションサービスを使っている間に即座に読み込み・書き込みをできます。

何千もの同時アクセスが実現可能です。

次の記事へ

atora1992.hatenablog.com

『6日間で楽しく学ぶLinuxコマンドライン入門』を読んでみて

本の感想

全7回に分けて、『6日間で楽しく学ぶLinuxコマンドライン入門』を読んで学んだことをブログにまとめてきました。

この本を読んだ感想としては、簡潔に言うと「入門として素晴らしい!!」ということです。細かく分けると以下のようになります。

  • 日ごとに分かれている+その中でも4章に分かれている作りになっていて、「今日中にここまで読もう!」という意欲がわき、読むスピードが上がる
  • タイトル通り、Linuxコマンドの基礎を網羅的に学べた
  • 今まで、なんとなくコピー&ペーストで使っていたコマンドの意味がわかった

そもそもの本を読むきっかけは?

そもそも、この本を読み始めたきっかけは、案件の面談で「Linuxコマンドをどのくらい使えますか?」と聞かれた時に、自信を持って答えられなかったという経験があったからです。

そこで、自分はLinuxコマンドがわかっていないと感じ、その自分を変えるために読み始めました。

この本で学べる内容は?

ざっくり以下の通りです

何日目 概要
1日目 コマンドの実行方法やテキストの補完機能などターミナルエミュレータ上のbashの基本操作
2日目 ファイルとディレクトリの操作
3日目 テキストファイルの操作、viの操作
4日目 findコマンドによる検索やフィルタコマンドの使いこなしなど
5日目 ユーザ管理やアクセス制御
6日目 シェルの活用方法と環境設定

オススメは、3日目と5日目です。

3日目は、開発中のログを効率よく見る方法が学べますし、環境設定など直接ファイルをターミナル上で編集するのに便利な、viエディタの操作を学べるのでおすすめです。

5日目は、なんとなくやってるけど、よくわからないに陥りやすい(と自分は感じてます)権限周りを学べます。「chmodコマンドって何?」とか「スーパーユーザーって何?」などが学べるのでおすすめです。

最後に

今、「Linuxコマンドでlsやcdは使ってるけど、他に何があるの?」や「ターミナル上って文字ばっかりでよくわからない」など感じている方には、おすすめの一冊です。

例もたくさんありますし、解説も丁寧です。本自体読みやすく、1日1日分と考えれば1週間もあればサクッと読み終えれます。

この本を読めば、Linuxコマンドを使えますと自信を持って言えるようになっていると思います。

ぜひ、読んでみてください!!

おまけ

以下のリンクに、この本を読んだアウトプットとしてブログ記事7つあるので、よかったら読んでみてください!

atora1992.hatenablog.com

Linux学習履歴(7)~シェルスクリプト・シェルの環境設定~

以下の記事の続きです

atora1992.hatenablog.com

Linuxコマンドライン入門』が日ごとに6日間分別れているので、今回は6日目の中間地点から最後までの内容についてです。

コマンドの備忘録的になってしまうと思いますので、悪しからず。

6日目

シェルスクリプト

シェルスクリプトの前に

シェルは、ユーザーが入力したコマンドを解釈してカーネルに伝えるコマンドインタプリタであると同時に、プログラミング言語でもあります。

つまり、例えばfor文による繰り返し処理も可能です。

for 【変数】 in 【値のリスト】
do
 【コマンド】
done

【値のリスト】から値を一つずつ取り出し【変数】に入れ、各変数に対する処理を【コマンド】に書きます。以下の例では、"Red Black White"という値のリストのそれぞれを表示しています。

$ for color in Red Black White
> do
> echo $fruit
> done
Red
Black
White

for文を用いれば、拡張子を変更することもできます。
そのために、パターン照合演算子と呼ばれる機能を使います。

${変数%パターン}:変数の最後とパターンが一致した場合、一致する最短部分を削除して残りを戻す
${変数%%パターン}:変数の最後とパターンが一致した場合、一致する最長部分を削除して残りを戻す
${変数#パターン}:変数の最初とパターンが一致した場合、一致する最短部分を削除して残りを戻す
${変数##パターン}:変数の最初とパターンが一致した場合、一致する最長部分を削除して残りを戻す

例えば、以下のように、拡張子を削除することが可能です。

$ file="index.htm"
$ echo ${file%.htm}
→ index

$ echo ${file%.*}
→ index

この機能を用いれば一括拡張子変換が可能です。

$ ls
global.html index.html orange.htm sample.htm   #.htmlと.htmが混在

$ for file in *.htm  #拡張子が.htmのファイルのみ取り出す
> do
> mv $file ${file%.*}.html  #拡張子を削除し、.htmlをつける
> done

$ ls
global.html index.html orange.html sample.html

シェルスクリプト

シェルのコマンドで記述したプログラムのことをシェルスクリプトといいます。
コマンドを羅列したファイルを作成し、後から呼び出す形で使用します。ただし、このファイルの先頭には、次の形式でスクリプトを実行するプログラムの絶対パスを記述する必要があります。

#!【プログラムの絶対パス】

bashは通常「/bin」ディレクトリに保存されています。これを考慮して、先ほどの拡張子変換をシェルスクリプトにしてみます。

#!~/bin
for file in *.htm
do
 mv $file ${file%.*}.html
done

続いて、コマンドを実行できるように、chmodで実行権限を与えます。

$ chmod a+x ~/bin/htmToHtml

(権限については以下の記事を参考にしてください)

atora1992.hatenablog.com

シェルスクリプトを実行するには、ファイルを呼び出せばOKです。

$ ~/bin/htmToHtml

$ htmToHtml
※大抵の場合は、~/binディレクトリにおいたコマンドは、コマンド名だけで実行できます

作成したコマンドは以下のどちらかに保存するのが通常です。

  • /usr/local/bin:全てのユーザーが使うコマンド
  • ~/bin:自分だけで使用するコマンド

シェルの環境設定

組み込みシェル変数

シェルの動作を制御したり、シェルの情報を格納している変数のことです。
現在設定されているシェル変数はsetコマンドで確認できます。

$ set

さらに、oオプションをつけて実行すれば、シェルのコマンドラインの動作に関する設定オプションを確認できます。

$ set -o
allexport       off
braceexpand     on
emacs           on
errexit         off
....

「on」が有効になっているオプション、「off」が無効になっているオプションです。

オプションの有効・無効は以下のコマンドで切り替え可能です。

$ set -o【オプション名】  #有効化
$ set +o【オプション名】  #無効化

有効なオプションのみ取り出すことも可能です。

$ set -o | grep "on$"

環境変数

シェル変数は、シェルの中だけで有効な変数です。つまり、シェルから起動したプログラムはシェル変数を参照しません。

一方で、シェルから起動したプログラムにも引き継がれていく変数のことを環境変数と呼びます。

環境変数を設定・削除するにはexportコマンドunsetコマンドを用います。

$ export【変数名】=【値】

#あらかじめ設定済みの通常のシェル変数を環境変数にする
$ export【変数名】

$ unset【変数名】  #環境変数を削除

環境変数から値を取り出す方法は、シェル変数と同じく"$"を変数名の前につけます。

現在、どのような環境変数が設定されているかはprintenvコマンドで確認できます。

$ printenv

環境変数を常に変更しなくとも、コマンド実行の間だけ環境変数を変更するには envコマンドを使用します。

$ env【変数名】=【値】 【実行するコマンド】

エイリアス

コマンドを別の名前で呼び出す機能をエイリアスと呼びます。
エイリアスの設定にはaliasコマンドを用います。

$ alias【エイリアス名】=【コマンド名】

コマンドにはパイプを用いた複数のコマンドを定義することもできます(コマンド全体をクォーテーションで囲みます)

$ alias findgrep='find . -type f -name "*.txt" -print0 | xargs -0 grep'

$ findgrep Atora  #文字列「Atora」を含むファイルを探す

設定されているエイリアン一覧の確認には、引数なしでaliasコマンドを実行します。

$ alias

エイリアスの定義を削除するには、unaliasコマンドを用います。

$ unalias【エイリアス名】

シェルの環境設定ファイル

環境設定ファイルに記述しておくことで、ログイン時にシェル変数・環境変数エイリアスなどの定義を自動的に設定することが可能です。

環境変数は「~/.bash_profile(初期状態ではないので自分で作成する)」に、それ以外は、「~/.bashrc(初期状態ではないので自分で作成する)」に記述するのが基本のようです。

前者は、最初のログイン時に1回だけ読み込まれます。一方で、後者はターミナルを開くたびに読み込まれます。

上記ファイルを変更した場合には、ログインし直さなくとも以下のコマンドで設定を反映させることが可能です。

$ source ~/.bashrc
$ source ~/.bash_profile