aws周りのメモ2


## postgresqlを使う

### RDSへpostgresqlをいれて立ち上げ

### 認証と接続

import-key-pair — AWS CLI 1.11.87 Command Reference
http://docs.aws.amazon.com/cli/latest/reference/ec2/import-key-pair.html

```bash
cd $HOGE
openssl genrsa -out my-key.pem 2048
openssl rsa -in my-key.pem -pubout > my-key.pub
# IAMのコンパネで*.pubを入力
# 多分、権限があれば以下でもいける
# aws iam upload-ssh-public-key
```

【AWS 再入門】EC2 + RDS によるミニマム構成なサーバー環境を構築してみよう – NET BIZ DIV. TECH BLOG
https://tech.recruit-mp.co.jp/infrastructure/retry-aws-minimum-vpc-server-environment/

## 便利

### 無料枠

無料のクラウドサービス | AWS 無料利用枠
https://aws.amazon.com/jp/free/

### AMI

AWS Marketplace: Search Results
https://aws.amazon.com/marketplace/search/results?x=14&y=18&searchTerms=&page=1&ref_=nav_search_box

### CFテンプレート

サンプルコード & テンプレート - AWS CloudFormation | AWS
https://aws.amazon.com/jp/cloudformation/aws-cloudformation-templates/

### ec2 ami tool & ec2 api tool

Mac で Amazon EC2 API Toolsを設定する – サーバーワークスエンジニアブログ
http://blog.serverworks.co.jp/tech/2013/01/31/mac-amazon-ec2-api-tools-setup/

ec2 api toolは若干心配。

## VPCを使う

接続の際に、sshを経由したい。sslでもいいけどなんかsshがいいなと。
パスワードよりkeyのほうがセキュアだからかな。

0から始めるAWS入門①：VPC編 - Qiita
http://qiita.com/hiroshik1985/items/9de2dd02c9c2f6911f3b

導入

Amazon VPC とは? - Amazon Virtual Private Cloud
http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Introduction.html

公式のいろいろ

料金 - Amazon VPC | AWS
https://aws.amazon.com/jp/vpc/pricing/

基本は無料だけどNATとVPNは別課金。

【AWS 再入門】VPC 環境に踏み台サーバーを構築して SSH 接続してみよう – NET BIZ DIV. TECH BLOG
https://tech.recruit-mp.co.jp/infrastructure/retry-aws-bastion-host-vpc/#i-3

ec2(Bastion)を配置する必要がありそう。

【AWS 再入門】EC2 + RDS によるミニマム構成なサーバー環境を構築してみよう – NET BIZ DIV. TECH BLOG
https://tech.recruit-mp.co.jp/infrastructure/retry-aws-minimum-vpc-server-environment/


VPC に推奨されるネットワーク ACL ルール - Amazon Virtual Private Cloud
http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Appendix_NACLs.html

vpcでのネットワークのポリシーの例

### Default VPC

AWSのDefault VPCを削除して困った話 - MikeTOKYO Developers
http://blog.miketokyo.com/post/49939300091/aws-default-vpc

デフォルトvpcは削除したらダメか。使い分けがわからん。

Amazon EC2 と Amazon Virtual Private Cloud - Amazon Elastic Compute Cloud
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-vpc.html

基本の機能はデフォルトとそうじゃないvpcは同じだけど、
デフォルトvpcがないとちゃんと機能しない。
デフォルトの属性によって、指定がないとipを紐付けたりする。

### VPCネットワーク設計

これだけ押さえておけば大丈夫！Webサービス向けVPCネットワークの設計指針 | eureka tech blog
https://developers.eure.jp/tech/vpc_networking/

> ネットワークは一度稼働させると移行が大変なので、初期設計が非常に重要になります。

わかりやすい。図が特に。

* Bastion
* NAT
* Security Group

### ENI

インフラエンジニアに贈るAmazon VPC入門 ｜ シリーズ ｜ Developers.IO
http://dev.classmethod.jp/series/vpcfor-infra-engineer/

> サブネットで指定したIPアドレスのうち、先頭4つと末尾の1つはVPCで予約されるため使用できません。
> ...
> VPCでは常にDHCP有効とするのがポイントです。
> ...
> また、DHCPサービスで伝えられる情報(DHCPオプション)は、変更することもできます。
> ...
> 仮想マシンにひもづくENIにより、DHCPサーバーから毎回同じMACアドレス、IPアドレスが付与されます。これは、仮想マシンの状態に依存しないため、仮想マシンを再起動しようと、一旦シャットダウンしてしばらくしてから起動した場合でも必ず同じアドレスが付与されます。

ENI(Elastic Network Interface)か。。なるほど。でも、使うことはなさそうだな。

### NAT

> IPマスカレードが使えないVPC
> NATは、Static（静的・サーバー用途）とElastic（仮想・クライアント用途）がある。
> 個人的には、このNATインスタンスの実装は、あまり好きではありません。動きがややこしいですし、ユーザーが自分でNATインスタンスの管理をしなければならないのも煩雑な印象を受けます。VPCのネットワークサービスの一つとして提供される機能であれば、ユーザーからはなるべく抽象化され仮想マシンとして意識されないようにするべきと考えます。
ただ、ユーザーから仮想マシンとして見える分、機能・実装が具体的に把握できる点やカスタマイズ性が高い点は良いとも思っています。

NAT インスタンスと NAT ゲートウェイの比較 - Amazon Virtual Private Cloud
http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpc-nat-comparison.html

なるほど。。

### Bastion

AWSで最低限セキュアな構成を組む - Qiita
http://qiita.com/ausuited/items/09b626fa5264f0c650fd

> パブリックSubnetにEC2インスタンス（踏み台サーバーとして）
NATインスタンスを作成した要領で、パブリックSubnetにEC2インスタンスを作成する。Security groupは新規に作成してSSHをAnywhereに。Key pairは厳重に管理。尚、踏み台サーバーは、使用する時以外はStoppedにしておく事で、さらにセキュアな状態とする。このデザインパターンをOn Demand Bastionパターンと呼ぶらしい。

詳しい。「On Demand Bastionパターン」か。なるほど。

vpcへの踏み台サーバー
ポートフォワーディング、トンネルなどと同じ意味。

### Network ACL

インスタンス単位じゃなくサブネット単位でより制限してセキュアにしたい場合に使うのかな。

安全なVPC設計 — Commerce Hack
http://tech.degica.com/ja/2016/01/07/designing-vpc-and-subnets/

------------------------------------------------------------------------------------------------
	結局どうするのか、、ひとまずNATはつかわずに、Bistionをつくってみる感じかな。
------------------------------------------------------------------------------------------------

### アベイラビリティーゾーン

リージョンごとでの、障害などで全部やられないように物理的にセグメントされた範囲の単位かな。
RDSではセグメントグループに２つ以上のゾーンを含める。でも、一つしか使わなくていい。ということか。s

### RDSのVPC間の移動

サブネットグループの関連付けを変えればいいらしい。間違って設定したので移動した。

【小ネタ】知っていましたか？RDSを別のVPCに移動できることを ｜ Developers.IO
http://dev.classmethod.jp/cloud/aws/rds_can_move_to_another_vpc/


### Bastion作成作業をしてみる

主に下記を参考。

【AWS 再入門】EC2 + RDS によるミニマム構成なサーバー環境を構築してみよう – NET BIZ DIV. TECH BLOG
https://tech.recruit-mp.co.jp/infrastructure/retry-aws-minimum-vpc-server-environment/


* サブネットってなんだっけとか復習。
* ストレージはどうするのか。
	* とりあえずssdにしたけどマグネティックでよかったかなあ。
		* ssd:$0.12 : 1 か月にプロビジョニングされたストレージ 1 GB あたり
		* マグネティック: 0.05 USD/GB-月
* public IPは設定必要だよね
	* 必要なかった。固定するためにElastic IPを使うらしい。
		【AWS】IPを固定しよう！Elastic IPの設定【初心者】 - ぱんだの冒険日記！
		http://pandagame.hatenablog.com/entry/2016/09/22/223404
* market placeからamiを取得した方がいいの？
	* とりあえず公式のウィザードを使ったけど。
* 認証にIAMが追加されていたので使ってみた
	* これとは別にキーペアは必要ってことかな。
* CFnテンプレート(CloudFormationテンプレート)というのがあるらしい。。
	* これでつくりなおそうかな。。
* サブネットとかいろいろネットワーク系の設定
	* なんだかんだいっていろいろあった
* セキュリティグループ
	* エイリアスみたいなセキュリティグループにできたらいいのに。タグや名前で明示化かな。
	* bastionは22をあけて、rdsは5432をbastionからのみあける
* ログイン
	* amazonlinuxじゃなかったのでユーザー名がec2-userじゃなくてubuntuだった。。
	* フィンガープリントの確認
		Amazon EC2 のキーペア - Amazon Elastic Compute Cloud
		http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html#verify-key-pair-fingerprints
* DNS
	* あれ、パブリックDNSがうまく割り振ってないな。。
		AWSでPublic DNS(パブリックDNS)が割り当てられない時の解決法 - Qiita
		http://qiita.com/sunadoridotnet/items/4ea689ce9f206e78a523
	* RDSのDNS
		* nslookupしたら内部ipがかえってくるのね。接続できないけどなんか気持ち悪いな。これかな。。
			外部からdnsを引けることを気にしている人は見かけなくて便利だからって話なのかね。
			【AWS】VPC内でPrivate DNSによる名前解決 - Qiita
			http://qiita.com/y_takeshita/items/2eb5e6abb5eb5516d1de


------------------------------------------------------------------------------------------------
	やってるうちはいいけど、しばらくやらないと設定の方法とか忘れそう。。こういうのは学習コストだけじゃないな。
------------------------------------------------------------------------------------------------

### PlantUMLで図にしておく

![Kobito.hQIwJs.png](https://qiita-image-store.s3.amazonaws.com/0/18421/f484e897-6a52-47fa-273f-75f7b4873417.png "Kobito.hQIwJs.png")

### VPC内のRDSへLambdaから接続。。

しまった！アンチパターンだそうだ。。

Lambda+RDSはアンチパターン - Qiita
http://qiita.com/teradonburi/items/86400ea82a65699672ad

> こちらは検証済みで、同じコネクションを使い回してくれました。
念の為ハンドラ内部でコネクションするコードで確認した際にはコネクションは使い捨てで利用されていることも確認済みです。

コネクションはリクエスト間で継続して使いまわしてくれるっぽい。。

> RDSのmax connectionsはparameter groupで変更可能
> ...
> 測定の際に「途中からconnectionが不安定」という部分がもしコネクションプールが有効ならば不安定になるのかということも気になりました。不安定でなければスループットの結果も違っていたのかもしれません。

IAM認証の導入でボトルネック改善になるのかどうなのか。。

Lambda + RDS benchmark - Qiita
http://qiita.com/taruhachi/items/3f95ae3e84f56edb3787

新し目の記事でIAM認証でクリアできそうな。。

【全世界待望】Public AccessのRDSへIAM認証(+ SSL)で安全にLambda Pythonから接続する – サーバーワークスエンジニアブログ
https://blog.serverworks.co.jp/tech/2017/04/27/rds-iam-auth-lambda-python/

> VPC内でコールドスタートしたLambdaは起動する際にVPC内で通信するための「ENI生成」という処理が始めに実行されます。この処理は10秒程度（あるいはそれ以上）かかるものであり、これはオンライン処理では到底許容できるものではありません。

------------------------------------------------------------------------------------------------
	セキュアに接続するのと速度のトレードオフになっていたのが
	IAM認証のおかげで両方可能になったということっぽい。
	でも、ネットのスループット、コネクション数（料金・負荷）、など、、ほかにも気にすることが出て来そうで若干不安。
	非同期でよければキューイングして一回投げっぱなしすればどうだろう。
	もしくは、似てるけど、Lambdaから一回値を返してもらってからRDSへ投げ直す。
	これでいっかなあ。。Lambdaの意味がなくなる？うーん。
------------------------------------------------------------------------------------------------

全体像がわかりやすい

IAM認証RDS ・非VPC Lambda・API Gateway・CloudFront・WAFで接続元IP制限付きAPIを作成する - Qiita
http://qiita.com/makisyu/items/80a9455305e30209a781

> 特定のIAMロールを持つ非VPC Lambdaからのみのアクセスを許可するようなRDS MySQLを作ることができる
> ...
> RDSをPublic Accessibleにできるようになる、とも言います。RDSがPublic Accessibleなら、Lambdaも非VPCでよくなります。しかもそのLambdaも特定のIAMロールを持つものだけに制限できます。安心だ。

公式の例

チュートリアル: Amazon VPC の Amazon RDS にアクセスできるように Lambda 関数を設定する - AWS Lambda
http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/vpc-rds.html

ステップ 2.2: 実行ロール (IAM ロール) を作成する - AWS Lambda
http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/vpc-rds-create-iam-role.html

------------------------------------------------------------------------------------------------
	今ところの理解としては、
	LambdaはENIを使わないほうがいい、つまり、VPCに入れないほうがいい。
	毎回必要になるENI立ち上げが遅いから。
	AWSLambdaVPCAccessExecutionRoleの権限もLambdaには不要なのか。。
	デプロイで必要になったりするかしら。
	CloudWatchへのロギングは個別で許可すればENIは関係なくできるのかどうなのか。
	
	認証はIAMで結構セキュアにできるから、その範囲で他サービスと連携する。
	
	コネクション数とか他にも問題はあるかもなので注意。
	ひとまずタイムアウトの処理とかでごまかしてたら
	ベストプラクティスを偉い人が確立とかなるシナリオはどうかしら。
------------------------------------------------------------------------------------------------

### やっぱだめだ

postgresqlはiam認証はまだできないのね。
small,microも対象から除外か。。
せっかく調べたのに。。

IAM認証によるRDS接続を試してみた ｜ Developers.IO
http://dev.classmethod.jp/cloud/aws/iam-auth-rds/


### 今後

* 疑問としてrdsなど内部向けのdnsを外から見れなくできないものか。
* というか、rdsのエンドポイントって再起動したら変わったりしないかね。ipは固定されるのか。
	* たぶん、サブネット内でdhcpになるのでipは変動するけどエンドポイントは固定。。じゃないかしら。

## posgresqlをつかうための情報

Amazon RDS 上の PostgreSQL - Amazon Relational Database Service
http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html#PostgreSQL.Concepts.General.SSL