ベビーサンの記録

勉強したことと思ったことをね

git clone したら「Permission denied (publickey).」っていわれた

作成したリポジトリをローカルにクローンしようとしたら……

$ git clone git@github.com:sakana/example.git
Cloning into 'example'...
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

鍵の権限がない。涙
そもそも鍵を読み込んでくれているのかを確認する。

$ ssh-add -l
The agent has no identities.

鍵がないと言われてしまった。 ので、ssh-addで秘密鍵を読み込ませます。

$ ssh-add ~/.ssh/id_rsa_github
Enter passphrase for /Users/sakana/.ssh/id_rsa_github: 
Identity added: /Users/sakana/.ssh/id_rsa_github (sakana@gmail.com)

これでできるはず、、

$ git clone git@github.com:sakana/example.git
Cloning into 'example'...
remote: Enumerating objects: 69, done.
remote: Counting objects: 100% (69/69), done.
remote: Compressing objects: 100% (54/54), done.
remote: Total 69 (delta 13), reused 67 (delta 11), pack-reused 0
Receiving objects: 100% (69/69), 5.17 MiB | 87.00 KiB/s, done.
Resolving deltas: 100% (13/13), done.

done!

参考記事では、macなどはssh-add必要ないと書いてあるのだけど、なんでだろう。
と思ったら、sshのconfigファイルが真っ白だった。
コマンド実行する前にconfigファイル確認しなきゃだよね。反省。
これからは「鍵がない」と言われたら、configファイル確認してからssh-addで読み込ませるね。

gitホントにむずいから1回体系的に勉強しないとなあ。

参考:
Githubに接続できない時の対処法 - Qiita

エンジニア2年生がエンジニアになった理由とこれからのこと考えた

エンジニア2年生。
キャリアについて、今の考えを言語化することで整理する。

キーワード

ITコンサル
業務ハッカー
業務改善
上流工程

なんでエンジニアになったんだろう

ITの力で業務改善して、働く人の力になりたいから。

学生時代は、音楽教育を勉強しつつつも、オーケストラ事務局のバイトもしてた。
労働環境は職場や職種によるだろうが、教育業界・クラシック音楽業界ともにブラックな働き方が蔓延していることは知っていた。
学生時代の自分は、「ブラックだから働きたくない」ってワケじゃなくて、ブラックな労働環境を少しでも改善したいと思ったの。
その業界のプレイヤーというかメインの働き手として活躍することで社会に貢献するのではなくて、働く人のために働きたいな、って。
働く人が最高のパフォーマンスを発揮できる手伝いをして、教育の質とか、クラシック音楽文化の普及(存命…?)とかがもっと良くなる/盛り上がれば最高じゃ。。。

あと、便利なソフトウェアとかめちゃいい感じのワークフローを提案して取り入れてもらってそれがうまくいけば、
業務効率が上がって
仕事が楽になって
心に余裕ができて
みんなが生き生きと仕事できるようになるんじゃないか。
それで事業がもっと成長できたら人も会社もハッピーじゃん!
と思っている。

まあ実現することはめちゃめちゃめちゃ難しいはずなので、まずは自分の力をつけていかないかんのだ。

これからどうなりたいのか

将来的に自分のしたいことはITコンサルとか上流工程に携わることとかなんだな、って思っている。

あとは最近知った業務ハッカー
簡単にいうとコンサルと開発を一人でやるんだって。バケモンや、、、
これは社内SE的な位置で働くのが方法のひとつ。
あと、調べてたらとても魅力的な会社さんを発見。
その名も「ソニックガーデン」。
入社試験がすごい大変そう。Ruby必須らしい。うーん。

これからやること

とりあえず「スッキリわかるJava」の2冊を完全理解状態にならんと。
Javaでプログラミングの軸を固めるんだ。
あとStrutsとSpringの勉強で書いたソースリファクタしてGithubに公開しよ。
ソースを他人に見られるってことをもっと意識して動いていかんと。

フワッと構想だけど、jsとかRubyもやった方がいいかなぁ。
とりまjs優先しよ。

AWSでサーバーとネットワーク構築を勉強してみたよ

サーバーサイドエンジニア2年生の自分が、書籍「Amazon Web Services 基礎からのネットワーク&サーバー構築」でインフラの基礎を学んで、アウトプットとしてまとめた。
この記事を読んだ後に実際にAWSに触ってみた時、何をやっているのかざっくりわかる」ような記事を意識した。
いろいろな方がお勧めしているとおり、ハンズオン形式でAWSだけでなくインフラの基礎も学べるよ。

はじめにざっくり理解

ネットワーク構築とは、コンピュータ同士を安全に接続するためにいろいろな設定をする作業
【やること】

サーバー構築とは、サーバーを用意して、安全かつ安定したサーバーになるようにいろいろな設定をする作業
【やること】

セキュリティ強化のために行われる当たり前のサーバー構築手法

  • 踏み台サーバーを作る
  • NAT(Network Address Translation)サーバーを作る

前提知識

今回利用するサービスは、VPCとEC2の2つだけ。
VPCはネットワーク構築、EC2はサーバー構築に関するサービス。
はじめに、AWSの専門用語2つと、IPアドレス、サーバーについて整理する。

リージョン(Region)

これはAWSの専門用語。
世界で10か所のデータセンター群があり、その一つ一つのデータセンター群の事をリージョンという。 たとえば、「オレゴンリージョン」「東京リージョン」がある。
実際に運用する時は、エンドユーザに近いリージョンを選ぶとよい(レスポンスがよくなる)。
2020年5月現在、日本のリージョンは「東京リージョン」のみ。
AWS公式によると、「大阪リージョン」が近日開始するとのこと。1

アベイラビリティゾーン(Availability Zone:AZ)

これもAWSの専門用語。
リージョンがさらに分割された区域のこと。耐障害性のために、リージョンの中に分散している。
たとえば、「ap-northeast-1(アジアパシフィックの東京)」「ap-northeast-2(アジアパシフィックのソウル)」「us-east-1(米国東部のバージニア北部)」などがある。
実際に運用する時は、耐障害性を高めるために、複数のアベイラビリティゾーンに同じサーバーを置いて負荷分散するとよい(AWS公式が推奨している)。

IPアドレス

ネットワークに繋がれているコンピュータやネットワーク機器に割り振られる、一意の番号のこと。インターネット上の住所ともいえるよ。
IPアドレスは大きく2種類。

パブリックIPアドレスグローバルIPアドレス

  • インターネットに接続するときにつかうIPアドレスのこと
  • ICANN(Internet Corporation for Assigned Names and Numbers)という団体が管理している
  • AWSでは「パブリックIPアドレス」という名称がつかわれているよ

プライベートIPアドレス

  • インターネットで使われないIPアドレスのこと
  • だれも管理してないから、自由に使っていい
  • 例えば、社内LANを構築する時に使ったり、個人の学習用として使える
  • だいたいは、10, 172, 192 のどれかからはじまる

サーバー

LinuxとかWindows ServerとかのサーバーOSがインストールされたコンピューターのこと。
サーバーOSとは、サーバー用に作られたOSのこと。
たくさんのユーザ(=クライアント)からの接続要求に答えたり、常時安定した稼働を実現するなど、クライアントに対してサービスを提供することに特化している。
サーバーに専用のソフトウェアをインストールすることで、「Webサーバー」とか「DBサーバー」が出来上がる。
もう少し具体的な例を図にしてみた。
スクリーンショット 2020-04-12 18.01.50.png

ちなみに、Webサーバー用のソフトとDBサーバー用のソフトをインストールすることで、「Webサーバー兼DBサーバー」も作れるよ。

ネットワーク構築って何をするの

ネットワーク構築とは、ざっくりいうと、コンピュータ同士を安全に接続するための設定をいろいろすること

VPC領域を作る

実世界でいうと、ルータやハブなどを用意して環境を整える作業にあたる。

VPC(Amazon Virtual Private Cloud)

ひとことで言うと、AWS上のネットワークの範囲のこと。
パブリックサブネット(インターネットに接続することを目的としたサブネット)と、プライベートサブネット(インターネットから隔離したサブネット)の2種類を作ることが多い。
こうすることで、セキュリティを高めることができる。
たとえば、DBサーバーをプライベートサブネットに配置することで、外部から攻撃を受けにくくなる。
(プライベートサブネットはインターネットから隔離してあるから)

VPC領域を作った直後は、デフォルトのルートテーブルが作られる。 サブネットを作った時も、そのサブネットのデフォルトルートテーブルが作られる。

少し踏み込んだ内容になりますが…
はじめてサブネットを作成するとき、[Availability Zone]は「No Presence」でよい。
 →ランダムなアベイラビリティゾーンが自動で割り当てられるから
2つめ以降を作るときは、1つめに作ったアベイラビリティゾーン以外のアベイラビリティゾーンを選択するとよい。
 →片方のアベイラビリティゾーンに障害があったときに、影響が出にくくなるから

ルーティング情報を設定する

ネットワークにデータを流すために、ルーティング情報を設定する。
この設定を、「ルートテーブル」や「ルーティングテーブル」という。
具体的には、宛先IPアドレスの値がいくつのときに、どのネットワークに流すべきかを設定する。
スクリーンショット 2020-04-13 0.31.49.png

上の設定値の意味は、

送信先が「10.0.0.0/16」に含まれるIPアドレスのパケットであれば、VPC領域のルーターに接続されている相手への通信と判断するよ。
だから、VPC領域のルータ(今回はlocal)にパケットを転送するよ。

デフォルトゲートウェイを設定する

デフォルトゲートウェイとは、転送先が設定されてないときのデフォルトの転送先のこと。 「0.0.0.0/0」は、すべてのIPアドレス範囲を表す。
つまり、「0.0.0.0/0」に対するターゲットの設定は、デフォルトゲートウェイとして機能する。
このデフォルトゲートウェイを、インターネットゲートウェイに設定すれば、インターネットに接続できる。

先ほどの2工程、「ルーティング情報を設定」と「(インターネットゲートウェイとしての)デフォルトゲートウェイを設定」をすることで、インターネットに接続できる状態になる。

サーバー構築って何をするの

サーバー構築とは、ざっくりいうと、サーバーを用意して、安全かつ安定したサーバーになるように設定をいろいろすること
ただ作ればいいってもんじゃないの。

EC2インスタンスを作る(立てる)

つまりサーバーを立てるってこと。
実世界でいうと、レンタルサーバーを契約したり、マシンを用意してそれにサーバー用OSをインストールすること。

EC2(Amazon Elastic Compute Cloud)

平たく言うと、サーバーのこと。
もう少し詳しくいうと、AWSの仮想サーバーのこと。
だからインスタンスのことは仮想サーバーと読み替えても問題ない。
AWSで作ったサーバーのことをインスタンスという。
AWSで作ったサーバー」とざっくり言った理由は、EC2の他にもRDS(DB構築&管理できるサービス)やEB(Elastic Beanstalk:アプリのデプロイや管理を自動でしてくれるサービス)などからもインスタンスが作成できるから。
インスタンスを作るときは、

  • CPUのスペック
  • ディスクの容量

などが決められる。
高性能なインスタンスを作る場合は課金が必要。

サーバーにセキュリティを設定する

AWSでは、「セキュリティグループ」で設定する
「Inbound」「Outbound」の2種類設定できる

  • Inbound・・・外から、このインスタンス(仮想サーバ)に接続するときの設定
    →誰かが接続しようとしているのを排除するために設定する

  • Outbound・・・このインスタンス(仮想サーバ)から、外側に出ていくときの設定
    →サーバーから、他のコンピュータに接続しようとするのを防ぐために設定する

踏み台サーバーを作る

踏み台サーバーとは、インターネット接続されていないサーバーにアクセスするための方法のひとつ。
これは、セキュリティ強化のための、クラウド・オンプレ環境の両方にある概念というか手法。 よくある構造は以下。
スクリーンショット 2020-05-05 1.10.35.png

言葉にすると、

ローカル環境やインターネットから、Webサーバーにアクセスする そして、WebサーバーからDBサーバーにアクセスして処理が行われる

このときのWebサーバーは、DBサーバーの「踏み台サーバー」になる。
どうしてわざわざ踏み台サーバーを作るか、というと、セキュリティを強化できるから。
→たとえば、踏み台サーバー以外のところからのアクセスは全て不正アクセスとする、とかできる。

でも、必要なアプリをインストールとかアップデートするときも、わざわざ踏み台サーバー経由するの手間かかるな、、、
そこでつかえる方法が、NATサーバー。
NATサーバーを利用すれば、プライベートサブネット内のサーバーからインターネットに接続できる。

NAT(Network Address Translation)サーバーを作る

NATサーバーの役割は、IPアドレスを変換すること。
IPアドレスを変換することで、「プライベートサブネット→インターネット」の向きのみ許可する通信を実現できる。

もう少し具体的にいうと、2つの仕事をしている。

① プライベートサブネット内ホストのIPアドレスを自分(NATサーバー)のIPアドレスに変換して、プライベートサブネットからの要求を接続先へに伝える
② 接続先からの応答を受け取り、宛先をプライベートサブネット内ホストのIPアドレスに変換して、インターネットからの応答をプライベートサブネット内のホストに伝える

図解もしてみた。
スクリーンショット 2020-05-05 1.47.44.png

プライベートサブネット側からの送受信はできるが、インターネット側からの送受信はできない。
プライベートサブネットにパブリックIPアドレスを割り当ててインターネット接続する(つまりインターネット側からも送受信できる状態)よりも、セキュリティを高めることができる。

まとめ

はじめにざっくり理解と同じ内容だけど。
ネットワーク構築とは、コンピュータ同士を安全に接続するためにいろいろな設定をする作業
【やること】

サーバー構築とは、サーバーを用意して、安全かつ安定したサーバーになるようにいろいろな設定をする作業
【やること】

セキュリティ強化のために行われる当たり前のサーバー構築手法

  • 踏み台サーバーを作る
  • NAT(Network Address Translation)サーバーを作る

参考文献と註