スクリーンショット_2019-05-15_0

Udemy で AWS を学んでみた(2)

(1) (2) (3) (4)

■受講したコース(現在は新規購入停止中)

■メモ

□S3(Simple Storage Service)について
・安価で耐久性の高いオブジェクトストレージ
 ・利用料:0.025USD/GB(月間)
 例)月10GBの利用でも約30円
 ⇔EBS利用料:0.12USD/GB(月間)
 ・耐久性:99.999999999%(イレブンナイン)
・よくある利用パターン
 ・静的コンテンツの配信
 ・ログなどのエクスポート先
 ・バッチ連携用のファイル置き場
 ・静的Webホスティング

□DNSのレコードタイプ
・A:ドメインとIPアドレスの対応
 例)outputnote.com⇒xxx.xxx.xxx.xxx
・CNAME:ドメインの別名をマッピング
 例)xxx.output.com⇒xxx.dkim.amazons.com
・NS:そのドメイン(ゾーン)を管理するネームサーバ
 例)outputnote.com⇒ns-xxx.awsdns-xx.co.xx.

□Route 53について
・DNSの機能を簡単に利用できる
 ・GUIから設定可能
 ・CLIやCloudFormationなどを用いた設定自動化も可能
・SLAは100%
・ルーティングポリシー
 ・Simple:基本的なDNS
 ・Weighted:ドメインへの問い合わせを重みに従ってルーティング
  例)提供リソースに差がある場合やABテスト
 ・Latency:Latencyが最小のリソースが優先されるルーティング
  ・グローバル(マルチリージョン)にリソースが存在する場合に有効
 ・Geolocation(位置情報):リクエスト元の位置情報によって優先度が変わる
  ・ローカライズ、地域限定配信
 ・Failover:プライマリとセカンダリを指定し、プライマリのヘルスチェックに失敗するとセカンダリに振り分ける

□独自ドメインの取得(無料)

□IAMベストプラクティス
1. 利用者ごとにIAMユーザーを払い出し、IAMユーザーを使い回さない
2. 役割ごとのIAMグループを作成し、IAMグループに権限を振る
3. 権限は必要最小限のものを割り当て、必要になったら増やす
4. 定期的に棚卸しをする
5. プログラムから利用する場合、アクセスキー、シークレットキーではなくIAMロールを利用できないか考える

□AWS CLIの導入
1. インストール

2. 初期設定

$ aws configure
AWS Access Key ID [None]: <作成したアクセスキーのAccess key ID>
AWS Secret Access Key [None]: <作成したアクセスキーのSecret access key>
Default region name [None]: ap-northeast-1
Default output format [None]: json

■実践メモ

□Webサーバ+DBサーバ(RDS)+Batchサーバ+ロードバランサ

・Webサーバ+DBサーバ(RDS)+ロードバランサを構築
 *構築手順は(1)参照
・S3 バケットの作成
・EC2インスタンスの作成
 ・ユーザーデータの設定

#!/bin/bash

# ホスト名設定
sed -i 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=<ホスト名>/g' /etc/sysconfig/network
hostname '<ホスト名>'

# タイムゾーン設定
cp /usr/share/zoneinfo/Japan /etc/localtime
sed -i 's|^ZONE=[a-zA-Z0-9\.\-\"]*$|ZONE="Asia/Tokyo”|g' /etc/sysconfig/clock

# 言語設定
echo "LANG=ja_JP.UTF-8" > /etc/sysconfig/i18n

# 必要なパッケージの導入
yum update -y
yum install -y php70 php70-mbstring php70-pdo php70-mysqlnd
yum install -y mysql
yum install -y git

 ・セキュリティグループの設定
  ・「SSH(22)」をフルオープン(本当は良くない)
・DBサーバのセキュリティグループの設定変更
  ・「MySQL(3306)」にBatchサーバのセキュリティグループからの通信も許可
・IAMユーザーのアクセスキーの作成
・EC2インスタンスに接続
・aws のクレデンシャルの設定

$ aws configure
AWS Access Key ID [None]: <作成したアクセスキーのAccess key ID>
AWS Secret Access Key [None]: <作成したアクセスキーのSecret access key>
Default region name [None]: ap-northeast-1
Default output format [None]: json

・AWS SDK for PHP の導入

$ curl -sS https://getcomposer.org/installer | php
$ php composer.phar require aws/aws-sdk-php

・サンプルプログラムの取得

$ git clone https://github.com/ketancho/udemy-aws-14days.git
$ mkdir src
$ cd src
$ cp -r ../udemy-aws-14days/Day7/src-s3-sample/* .

・サンプルプログラムの動作確認

// S3 で作成されているバケット名の一覧が取得できていることを確認
$ php ListBuckets.php

・サンプルプログラムの実行

// Batchサーバ上のCSVファイルを指定したS3バケットにアップロード
$ php PutObject.php

// Batchサーバ上のCSVファイルを削除
$ rm data.csv

// S3バケット上のCSVファイルをBatchサーバにダウンロードし、ダウンロードしたCSVファイルで
// DBサーバのデータを更新
$ php DbUploadFromCSV.php

・Webサーバにアクセスし、データが更新されたことを確認

□静的ホスティングによるWebサイト構築

・S3 バケットの作成
 ・S3 の静的ホスティングで構築したWebサイトを独自ドメインを利用して公開する場合、独自ドメイン名と S3 バケット名を一致させなければならないという制約がある
 例)独自ドメイン名:outputnote.com→S3 バケット名:outputnote.com
・ホスティング設定
 ・作成した S3 バケットープロパティーStatic website hosting
  ・「このバケットを使用してウェブサイトをホストする」
  ・インデックスドキュメントは index.html を設定
 ・作成した S3 バケットーアクセス権限ーバケットポリシー
  ・パブリックアクセス権限を付与

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadForGetBucketObjects",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<作成したS3バケット名>/*"
        }
    ]
}

・静的ホスティング用 index.html を作成した S3 バケットにアップロード

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>Hello World</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous">
  </head>
  <body>

    <h2 class="text-center mt-3 mb-5">Simple Blog</h2>
    <div class="container">
      <div class="mb-5 text-center">
        申し訳ありませんが、現在システムメンテナンス中です。<br>
        xxx@yyy.zzz までお問い合わせください。
      </div>
    </div>
  </body>
</html>

・S3 バケットのエンドポイントにアクセス

□ルーティング設定(Simple)

・独自ドメインの取得
・ホストゾーンの作成
 ・作成されたNSレコードを独自ドメインを取得したところのNameserverに設定
・Aレコードの作成
 ・Alias TargetにALBのDNS名を設定
 ・Routing PolicyにSimpleを設定
・名前解決できているか確認

// まだ名前解決できていない場合
$ nslookup <独自ドメイン名>
Server:		xxx.xxx.xxx.xxx
Address:	xxx.xxx.xxx.xxx

** server can't find aaa.aa: NXDOMAIN

// 名前解決できている場合
$ nslookup <独自ドメイン名>
Server:		xxx.xxx.xxx.xxx
Address:	xxx.xxx.xxx.xxx

Non-authoritative answer:
Name:	<独自ドメイン名>
Address: xxx.xxx.xxx.xxx

□ルーティング設定(Failover)

・(Alias TargetがALBのDNS名の)Aレコードの設定変更
 ・Routing PolicyをSimpleからFailoverに設定変更
  ・Failover Record TypeにPrimaryを設定(デフォルトまま)
 ・Evaluate Target HealthにYesを設定
・Aレコードの作成
 ・Alias TargetにS3の静的ホスティングで構築したWebサイトのエンドポイント名を設定
 ・Routing PolicyにFailoverを設定
  ・Failover Record TypeにSecondaryを設定

□(AWS CLI)Webサーバ2台+DBサーバ(RDS)+ロードバランサ 

・事前準備

$ aws configure
AWS Access Key ID [None]: <作成したアクセスキーのAccess key ID>
AWS Secret Access Key [None]: <作成したアクセスキーのSecret access key>
Default region name [None]: ap-northeast-1
Default output format [None]: json

・VPCの作成

$ aws ec2 create-vpc \
--cidr-block 10.0.0.0/16
{
・・・(略)・・・ 
        "VpcId": "<VPC ID>", 
・・・(略)・・・ 
}

$ aws ec2 create-tags \
--resources <VPC ID> \
--tags Key=Name,Value=cli-demo-vpc

・インターネットゲートウェイの作成

$ aws ec2 create-internet-gateway
{
・・・(略)・・・ 
        "InternetGatewayId": "<インターネットゲートウェイ ID>"
・・・(略)・・・ 
}

$ aws ec2 create-tags \
--resources <インターネットゲートウェイ ID> \
--tags Key=Name,Value=cli-demo-ig

・インターネットゲートウェイをVPCにアタッチ

$ aws ec2 attach-internet-gateway \
--vpc-id <VPC ID> \
--internet-gateway-id <インターネットゲートウェイ ID>

・パブリックサブネットの作成(1)

$ aws ec2 create-subnet \
--availability-zone ap-northeast-1a \
--cidr-block 10.0.1.0/24 \
--vpc-id <VPC ID>
{
・・・(略)・・・ 
        "SubnetId": "<パブリックサブネット ID(1)>", 
・・・(略)・・・ 
}

$ aws ec2 create-tags \
--resources <パブリックサブネット ID(1)> \
--tags Key=Name,Value=cli-demo-public-subnet-1a

・パブリックサブネットの作成(2)

$ aws ec2 create-subnet \
--availability-zone ap-northeast-1c \
--cidr-block 10.0.2.0/24 \
--vpc-id <VPC ID>
{
・・・(略)・・・ 
        "SubnetId": "<パブリックサブネット ID(2)>", 
・・・(略)・・・
}

$ aws ec2 create-tags \
--resources <パブリックサブネット ID(2)> \
--tags Key=Name,Value=cli-demo-public-subnet-1c

・カスタムルートテーブルの作成

$ aws ec2 create-route-table \
--vpc-id <VPC ID>
{
・・・(略)・・・
        "RouteTableId": "<ルートテーブル ID>", 
・・・(略)・・・
}

$ aws ec2 create-tags \
--resources <ルートテーブル ID> \
--tags Key=Name,Value=cli-demo-rt

・ルートの作成

$ aws ec2 create-route \
--route-table-id <ルートテーブル ID> \
--destination-cidr-block 0.0.0.0/0 \
--gateway-id <インターネットゲートウェイ ID>

・カスタムルートテーブルの関連付け

$ aws ec2 associate-route-table  \
--subnet-id <パブリックサブネット ID(1)> \
--route-table-id <ルートテーブル ID>

$ aws ec2 associate-route-table  \
--subnet-id <パブリックサブネット ID(2)> \
--route-table-id <ルートテーブル ID>

・プライベートサブネットの作成(1)

$ aws ec2 create-subnet \
--availability-zone ap-northeast-1a \
--cidr-block 10.0.11.0/24 \
--vpc-id <VPC ID>
{
・・・(略)・・・
        "SubnetId": "<プライベートサブネット ID(1)>", 
・・・(略)・・・
}

$ aws ec2 create-tags \
--resources <プライベートサブネット ID(1)> \
--tags Key=Name,Value=cli-demo-private-subnet-1a

・プライベートサブネットの作成(2)

$ aws ec2 create-subnet \
--availability-zone ap-northeast-1c \
--cidr-block 10.0.12.0/24 \
--vpc-id <VPC ID>
{
・・・(略)・・・
        "SubnetId": "<プライベートサブネット ID(2)>", 
・・・(略)・・・
}

$ aws ec2 create-tags \
--resources <プライベートサブネット ID(2)> \
--tags Key=Name,Value=cli-demo-private-subnet-1c

・プライベートキーファイルの作成

$ aws ec2 create-key-pair \
--key-name CLIKeyPair \
--query 'KeyMaterial' \
--output text > CLIKeyPair.pem

$ ll CLIKeyPair.pem
-rw-r--r--  1 user group  1671  4  1 20:07 CLIKeyPair.pem

$ chmod 400 CLIKeyPair.pem

$ ll CLIKeyPair.pem
-r--------  1 user group  1671  4  1 20:07 CLIKeyPair.pem

・Web サーバ用セキュリティグループの作成

$ aws ec2 create-security-group \
--group-name cli-demo-sg-web \
--description "Security group for Web" \
--vpc-id <VPC ID>
{
    "GroupId": "<Web サーバ用セキュリティグループ ID>"
}

$ aws ec2 create-tags \
--resources <Web サーバ用セキュリティグループ ID> \
--tags Key=Name,Value=cli-demo-sg-web

$ aws ec2 authorize-security-group-ingress \
--group-id <Web サーバ用セキュリティグループ ID> \
--protocol tcp \
--port 22 \
--cidr 0.0.0.0/0

$ aws ec2 authorize-security-group-ingress \
--group-id <Web サーバ用セキュリティグループ ID> \
--protocol tcp \
--port 80 \
--cidr 0.0.0.0/0

・Web サーバ用 EC2 インスタンスの作成(1)

$ aws ec2 run-instances \
--image-id ami-00a5245b4816c38e6 \
--count 1 \
--instance-type t2.micro \
--key-name CLIKeyPair \
--security-group-ids <Web サーバ用セキュリティグループ ID> \
--subnet-id <パブリックサブネット ID(1)> \
--associate-public-ip-address \
--user-data file://script-web.txt
{
・・・(略)・・・
            "InstanceId": "<Web サーバ用 EC2 インスタンス ID(1)>", 
・・・(略)・・・
}

$ aws ec2 create-tags \
--resources <Web サーバ用 EC2 インスタンス ID(1)> \
--tags Key=Name,Value=cli-demo-web-1a
========== script-web.txt ==========
#!/bin/bash

# ホスト名設定
sed -i 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=cli-demo-web/g' /etc/sysconfig/network
hostname 'cli-demo-web'

# タイムゾーン設定
cp /usr/share/zoneinfo/Japan /etc/localtime
sed -i 's|^ZONE=[a-zA-Z0-9\.\-\"]*$|ZONE="Asia/Tokyo”|g' /etc/sysconfig/clock

# 言語設定
echo "LANG=ja_JP.UTF-8" > /etc/sysconfig/i18n

# 必要なパッケージの導入
yum update -y
yum install -y httpd24
yum install -y php70 php70-mbstring php70-pdo php70-mysqlnd
yum install -y mysql
yum install -y git

・AMI の作成

$ aws ec2 create-image \
--instance-id <Web サーバ用 EC2 インスタンス ID(1)> \
--name cli-demo-ami-web \
--reboot
{
    "ImageId": "ami-0abe8bfadd6ee8dcb"
}

・Web サーバ用 EC2 インスタンスの作成(2)

$ aws ec2 run-instances \
--image-id ami-0abe8bfadd6ee8dcb \
--count 1 \
--instance-type t2.micro \
--key-name CLIKeyPair \
--security-group-ids <Web サーバ用セキュリティグループ ID> \
--subnet-id <パブリックサブネット ID(2)> \
--associate-public-ip-address
{
・・・(略)・・・
            "InstanceId": "<Web サーバ用 EC2 インスタンス ID(2)>", 
・・・(略)・・・
}

$ aws ec2 create-tags \
--resources <Web サーバ用 EC2 インスタンス ID(2)> \
--tags Key=Name,Value=cli-demo-web-1c

・ロードバランサー用セキュリティグループの作成

$ aws ec2 create-security-group \
--group-name cli-demo-sg-alb \
--description "Security group for ALB" \
--vpc-id <VPC ID>
{
    "GroupId": "<ロードバランサー 用セキュリティグループ ID>"
}

$ aws ec2 create-tags \
--resources <ロードバランサー 用セキュリティグループ ID> \
--tags Key=Name,Value=cli-demo-sg-alb

$ aws ec2 authorize-security-group-ingress \
--group-id <ロードバランサー 用セキュリティグループ ID> \
--protocol tcp \
--port 80 \
--cidr 0.0.0.0/0

・ターゲットグループの作成

$ aws elbv2 create-target-group \
--name cli-demo-target-group \
--protocol HTTP \
--port 80 \
--vpc-id <VPC ID>
{
・・・(略)・・・
            "TargetGroupArn": "<ターゲットグループ ARN>", 
・・・(略)・・・
}

・ロードバランサーの作成

$ aws elbv2 create-load-balancer \
--name cli-demo-alb  \
--subnets <パブリックサブネット ID(1)> <パブリックサブネット ID(2)> \
--security-groups <ロードバランサー 用セキュリティグループ ID>
{
・・・(略)・・・
            "LoadBalancerArn": "<ロードバランサー ARN>", 
・・・(略)・・・
}

$ aws elbv2 register-targets \
--target-group-arn <ターゲットグループ ARN> \
--targets Id=<Web サーバ用 EC2 インスタンス ID(1)> Id=<Web サーバ用 EC2 インスタンス ID(2)>

$ aws elbv2 create-listener \
--load-balancer-arn <ロードバランサー ARN> \
--protocol HTTP \
--port 80 \
--default-actions Type=forward,TargetGroupArn=<ターゲットグループ ARN>
 

・DB サーバ用セキュリティグループの作成

$ aws ec2 create-security-group \
--group-name cli-demo-sg-db \
--description "Security group for DB" \
--vpc-id <VPC ID>
{
    "GroupId": "<DB サーバ用セキュリティグループ ID>"
}

$ aws ec2 create-tags \
--resources <DB サーバ用セキュリティグループ ID> \
--tags Key=Name,Value=cli-demo-sg-db

$ aws ec2 authorize-security-group-ingress \
--group-id <DB サーバ用セキュリティグループ ID> \
--protocol tcp \
--port 22 \
--source-group <Web サーバ用セキュリティグループ ID>

$ aws ec2 authorize-security-group-ingress \
--group-id <DB サーバ用セキュリティグループ ID> \
--protocol tcp \
--port 3306 \
--source-group <Web サーバ用セキュリティグループ ID>

・サブネットグループの作成

$ aws rds create-db-subnet-group \
--db-subnet-group-name cli-demo-subnet-group \
--db-subnet-group-description cli-demo-subnet-group \
--subnet-ids "<プライベートサブネット ID(1)>" "<プライベートサブネット ID(2)>"

・パラメーターグループの作成

$ aws rds create-db-parameter-group \
--db-parameter-group-name cli-demo-param-group-mysql57 \
--db-parameter-group-family mysql5.7 \
--description cli-demo-param-group-mysql57

・DB インスタンスの作成

$ aws rds create-db-instance \
--db-instance-identifier cli-demo-mysql \
--allocated-storage 20 \
--db-instance-class db.t2.micro \
--engine mysql \
--master-username root \
--master-user-password <rootユーザのパスワード> \
--vpc-security-group-ids <DB サーバ用セキュリティグループ ID> \
--db-subnet-group-name cli-demo-subnet-group \
--preferred-maintenance-window Sat:19:00-Sat:19:30 \
--db-parameter-group-name cli-demo-param-group-mysql57 \
--preferred-backup-window 20:00-20:30 \
--multi-az \
--engine-version 5.7.23 \
--auto-minor-version-upgrade

この記事が気に入ったらサポートをしてみませんか?