Large Datasets Repository | Public Datasets on AWS

Large Datasets Repository | Public Datasets on AWS. AWS hosts a variety of public datasets that anyone can access for free. Previously, large dataset… 続きを表示. AWS hosts a variety of public datasets that anyone can access for free. Previously, large datasets such as satellite imagery or genomic data … 続きを読む

カテゴリー 未分類 | タグ

HDP 2.6.3をAWSにインストール 乞食版

ゴール

AWSの超安いインスタンスに、HDPをインストールして遊ぶ。

インスタンス初期化

Ambari

t2.nano

[ec2-user@ip-172-31 ~]$ free -m
              total        used        free      shared  buff/cache   available
Mem:            990          80         731          12         179         739
Swap:             0           0           0

AWS Amazon Linux スワップファイル作成によりSwap領域のサイズを増やす
https://qiita.com/na0AaooQ/items/278a11ed905995bd16af

現在は1GBあるので、8GBのSwapメモリを追加

grep Mem /proc/meminfo
grep Swap /proc/meminfo
free
uname -a
# /swapfile1 に保存
sudo dd if=/dev/zero of=/swapfile1 bs=1M count=8192
grep Swap /proc/meminfo

ll /swapfile1
sudo chmod 600 /swapfile1
sudo mkswap /swapfile1
ll /swapfile1
swapon -s
free
sudo swapon /swapfile1
free
grep Swap /proc/meminfo

メモリ追加しました。

[ec2-user@ip-172-31 ~]$ free -m
              total        used        free      shared  buff/cache   available
Mem:            990          77          64          12         848         731
Swap:          3083           0        3083
[ec2-user@ip-172-31 ~]$

t2.micro instance作成

Ambari:1台
Master:1台
Slave:3台

image.png

注意事項

RHEL 7.4

Red Hat Enterprise Linux 7.4 (HVM), SSD Volume Type – ami-26ebbc5c

AWS setting

t2.micro instance

Storage setups —

Ambari: EBS 15G
NN/DN: EBS 20G

image.png

image.png

セキュリティ設定

All Traffic, Allow, HDPのセキュリティグループID指定(内部通信を全部許可)
All Traffic, Allow, MyIP (管理者のIPを許可)
これでOK

ssh private key

scp -i amuisekey.pem amuisekey.pem ec2-user@ec2-54-234-94-128.compute-1.amazonaws.com:~/.ssh/id_rsa
# 全部サーバーにアップロード

hosts

自分のMBP /etc/hosts

    127.0.0.1 localhost.localdomain localhost
    ::1 localhost6.localdomain6 localhost6

#外部IP
    10.110.35.23 hdpmaster1.hdp.hadoop hdpmaster1
    10.191.45.41 hdpmaster2.hdp.hadoop hdpmaster2
    10.151.94.30 hdpslave1.hdp.hadoop hdpslave1
    10.151.87.239 hdpslave2.hdp.hadoop hdpslave2
    10.70.78.233 hdpslave3.hdp.hadoop hdpslave3
    10.151.22.30 ambarimaster.hdp.hadoop ambarimaster

AWSサーバーの /etc/hosts

    127.0.0.1 localhost.localdomain localhost
    ::1 localhost6.localdomain6 localhost6

#外部IP
    10.110.35.23 hdpmaster1.hdp.hadoop hdpmaster1
    10.191.45.41 hdpmaster2.hdp.hadoop hdpmaster2
    10.151.94.30 hdpslave1.hdp.hadoop hdpslave1
    10.151.87.239 hdpslave2.hdp.hadoop hdpslave2
    10.70.78.233 hdpslave3.hdp.hadoop hdpslave3
    10.151.22.30 ambarimaster.hdp.hadoop ambarimaster

Install

https://community.hortonworks.com/articles/14512/ambari-on-ec2.html

image.png

続きを読む

NixOpsを使ってAWS EC2にGPUクラスタを作ってChainerMNを動かしてみた

使用するもの

NixOS

  • Linuxディストリビューションの1つ

    • 関数型パッケージ管理ツールNixを使用している
    • パッケージ自体はnixpkgsのリポジトリで管理・開発されている(個々のパッケージはhttps://nixos.org/nixos/packages.html# で検索できる)
  • 環境の構築が楽にできる
    • 1つのファイルでシステム全体の設定ができる -> 管理が楽
    • システムのアップデート -> システムのロールバック ということが楽にできる
    • sudoとかしなくてもパッケージを用意できる(たとえばpythonでnumpyとmatplotlibを使いたい時は以下のようにする)
$ nix-shell -p python3 -p pythonPackages.numpy -p pythonPackages.matplotlib

NixOps

  • NixOSの環境をリモートマシンにdeployするためのツール
  • 基本的な使い方は以下のような感じ
登録
$ nixops create [deployする環境を書いた.nixファイル(複数可)] -d [環境の名前]

インスタンスの作成&deploy
$ nixops deploy -d [環境の名前]

インスタンスの破棄
$ nixops destroy -d [環境の名前]

Chainer

  • ニューラルネットワーク記述用のpythonフレームワーク

ChainerMN

  • Chainerで複数のGPU上での分散処理を行うための追加パッケージ

はじめに

NixOpsでは、Nixのコードを書くことで、Nixパッケージマネージャを利用した環境をリモートにdeployすることができます。
これを使ってGPUクラスタをデプロイできないかということでやってみました。

利用環境

AWSのEC2のp2.xlargeのインスタンスを使用しました。
GPUはTesla K80になります。

CUDAはCUDA 9.0、cudnnはv7.0、NCCLはv2.1.2を使用します。
MPIはOpenMPIのv1.10です。
これらはすべて利用したnixpkgsに含まれているものを使用します。
(これを書いている時点ではnixpkgsは自前で用意しています)

コード

NixOpsで使用するコード
https://github.com/hyphon81/ec2-gpu-cluster-with-NixOps

./ec2-gpu-cluster-with-NixOps というディレクトリがある想定で書きます。

nixpkgs
https://github.com/hyphon81/nixpkgs/tree/add/chainermn

これについても、 ./nixpkgs が存在する前提で書きます。

事前準備

AWSの準備

  • 当然、アカウントを作ります。
  • NixOpsのマニュアルで説明されてるように、AWS IAMのアクセスキーIDとアクセスキーを入手します。
  • AWS EC2インスタンスで使用するセキュリティグループの設定をします。これは以下の設定を含む必要があります。
    • sshポートの許可
    • 同じセキュリティグループ内でのパケットの許可
  • AWS EC2で使用するsshキーペアを入手します。
  • p2.xlargeインスタンスを使用する場合、インスタンス作成の上限数が1に設定されていると思うので、上限規制緩和の申請を行います。

※これらの手順等についてはここでは説明しません。

ファイルの準備

~/.ec2-keys
<アクセスキーID> <アクセスキー> <IAMユーザ名>
~/.aws/credentials
[<IAMユーザ名>]
aws_access_key_id = <アクセスキーID>
aws_secret_access_key = <アクセスキー>
  • ./ec2-gpu-cluster-with-NixOps/ec2-info.nix を次のように用意します。
./ec2-gpu-cluster-with-NixOps/ec2-info.nix
{ config, pkgs, ... }:

with pkgs.lib;

{
  deployment.ec2.accessKeyId = "<アクセスキーID>";
  deployment.ec2.keyPair = "<AWS EC2のsshキーペア名>";
  deployment.ec2.privateKey = "<ssh秘密鍵ファイルのパス>";
}
  • インスタンス間のssh接続に使用するsshキーペア(ed25519)を用意します。
$ ssh-keygen -t ed25519
...
$ cp ~/.ssh/id_ed25519* ./ec2-gpu-cluster-with-NixOps/

NixOpsによるデプロイ

①. nixops create コマンドを実行し、設定を作ります。

$ nixops create ./ec2-gpu-cluster-with-NixOps/ec2gpu-cluster.nix -d ec2-gpu-cluster

②. 早速 nixops deploy コマンドでAWS EC2インスタンスの作成→環境のデプロイを行います。

$ nixops deploy -d ec2-gpu-cluster -I nixpkgs=./nixpkgs

以上です。
コマンドは2行とあっけないですが、デプロイに結構時間がかかります。
私の場合は1〜2時間ぐらい待ちました。
NVIDIAのドライバやCUDAなどを含むため、デプロイするファイルサイズの合計が5GBぐらいになるようです。

デプロイする環境の設定について

今回用意したファイルは以下のようになっています。

./ec2-gpu-cluster-with-NixOps/ec2gpu-cluster-conf.nix
{ region, ami, instanceType, securityGroups, publicKey, secretKey, hosts }:

{ config, pkgs, resources, ...}:
let
  ## この辺は使用するパッケージの設定です。
  python = pkgs.python3;
  cudatoolkit = pkgs.cudatoolkit;
  mpi = pkgs.openmpi.overrideDerivation (attrs: {
    configureFlags = [ "--with-cuda=${pkgs.cudatoolkit}" ];
  });
  gpu-test1 = pkgs.callPackage ./gpu-test1.nix {
    mpi = mpi;
  };
  gpu-test2 = pkgs.callPackage ./gpu-test2.nix {
    python = python;
    cython = python.pkgs.cython;
    mpi = mpi;
    cudnnSupport = true;
    cudatoolkit = cudatoolkit;
    cudnn = pkgs.cudnn;
    nccl = pkgs.nccl;
  };
in
{ imports = [ ./ec2-info.nix ];
  deployment.targetEnv = "ec2";
  deployment.ec2.ami = ami;
  deployment.ec2.region = region;
  deployment.ec2.instanceType = instanceType;
  deployment.ec2.securityGroups = securityGroups;
  deployment.ec2.ebsInitialRootDiskSize = 20;

  nixpkgs.config.allowUnfree = true;

  environment.systemPackages = [
    python
    mpi
    cudatoolkit
    gpu-test1
    gpu-test2
  ];

  ## 以下が環境設定です。
  services.xserver = {
    enable = true;
    videoDrivers = [
      "nvidia"
    ];
  };

  services.openssh = {
    enable = true;
    hostKeys = [
      { bits = 4096; path = "/etc/ssh/ssh_host_rsa_key"; type = "rsa"; }
      { path = "/etc/ssh/ssh_host_ed25519_key"; type = "ed25519"; }
      { path = "/etc/root/ssh/id_ed25519"; type = "ed25519"; }
    ];
    knownHosts = hosts;
    passwordAuthentication = false;
    challengeResponseAuthentication = false;
  };

  environment.etc = {
    "/root/ssh/id_ed25519" = {
      enable = true;
      user = "root";
      group = "root";
      mode = "0600";
      source = secretKey;
    };
  };

  ## LD_LIBRARY_PATHに必要なライブラリを含めるためにこんなことやってしまっています。
  ## もっとかっこいい方法をご存じの方がいたらぜひ教えてください。
  hardware.opengl = {
    extraPackages = [
      mpi
      pkgs.linuxPackages.nvidia_x11
      cudatoolkit
      cudatoolkit.lib
    ];
  };

  networking.firewall.enable = false;

  users.users.root = {
    openssh.authorizedKeys.keyFiles = [ publicKey ];
  };

  programs.bash.shellInit = ''
    if [ ! -e ~/.ssh/id_ed25519 ] ; then
      if [ -f /etc/root/ssh/id_ed25519 ] ; then
        /run/current-system/sw/bin/ln -s /etc/root/ssh/id_ed25519 .ssh/id_ed25519
      fi
    fi
  '';
}
./ec2-gpu-cluster-with-NixOps/ec2gpu-cluster.nix
let
  ## ここでデプロイする先のAWS EC2の設定を記述しています
  region = "ap-northeast-1"; ## 東京リージョン
  ami = "ami-89b921ef"; ## 東京リージョンのNixOSのAMI https://nixos.org/nixos/download.html
  instanceType = "p2.xlarge"; ## インスタンスタイプ
  ec2 = import ./ec2gpu-cluster-conf.nix;

  securityGroups = [ "allow-ssh" ]; ## インスタンスが所属するセキュリティグループ名を入れてください
  secretKey = ./id_ed25519;
  publicKey = ./id_ed25519.pub;

  hosts = [
    { hostNames = [ "node1" ]; publicKeyFile = publicKey; }
    { hostNames = [ "node2" ]; publicKeyFile = publicKey; }
    { hostNames = [ "node3" ]; publicKeyFile = publicKey; }
    { hostNames = [ "node4" ]; publicKeyFile = publicKey; }
  ];
in
{
  network.description = "An ec2 gpu cluster create test";

  node1 = ec2 {
    inherit region ami instanceType securityGroups publicKey secretKey hosts;
  };
  node2 = ec2 {
    inherit region ami instanceType securityGroups publicKey secretKey hosts;
  };
  node3 = ec2 {
    inherit region ami instanceType securityGroups publicKey secretKey hosts;
  };
  node4 = ec2 {
    inherit region ami instanceType securityGroups publicKey secretKey hosts;
  };
  ## 4ノード作成します
}

デプロイ完了後の操作(動作確認)

①. NVIDIAドライバインストールがあったため、ドライバの読み込み等必要になるので、一度全ノードをrebootしたほうが良いです。

$ nixops ssh-for-each -d ec2-gpu-cluster -p reboot

②. その後少し待ってnode1に接続します。

$ nixops ssh -d ec2-gpu-cluster node1
...
[root@node1]#

③. 今回用意したnixコードでは以下のパッケージを含み、テストができます。
(こちらに記載されているテストコードをそのまま使用しています。)

// gpu-mpi-test
// mpiパッケージがCUDA-Awareに対応しているか確認するプログラムです。
// 問題なければOKと出るだけです。
[root@node1]# gpu-mpi-test
OK.

// check_mpi4py
// mpi4pyが動作するかの確認です。
// node1〜node4が表示されれば問題ありません。
[root@node1]# mpiexec --allow-run-as-root -n 4 -host node1,node2,node3,node4 check_mpi4py
node1 0
node2 1
node3 2
node4 3

まぁ、Nixなので一度動作を確認できた環境なら同じコード使えば同じように動くはずなんですが・・・

ChainerMNを使用したMNISTの学習の動作

コード自体はここに従って用意しています。

実際に動作させてみたときの動画がこちらです
※ 6分程度と長いのでBGMつけました。音が出ます。

ビデオが開けなかった場合に表示されます

一応、動作していました。

余談

ChainerMNでMNISTの学習が動作できたのですが、
ノードを1つだけ使ったときのほうが計算が早く終わりました。

ビデオが開けなかった場合に表示されます

ChainerMNの論文を見る限り、
ノード増やすとほぼリニアにスピードアップするグラフが乗っているので、
何か間違ったかと思っていました。
https://arxiv.org/abs/1710.11351

ですが、こちらのスライドではそもそもMNISTの学習は
ChainerMNの速度の測定に使用するには向かない旨の注意が書いてありました。
https://www.slideshare.net/pfi/20171128chainermn

というわけで、ノード増やしてスピードアップすることを確認するには、
ちゃんとしたベンチマークになりうるプログラムを用意する必要がありそうです。

とりあえず、NixOpsでChainerMNが動作する環境の構築はできたということで、
今回はここまでです。

続きを読む

AnsibleでAWSの複数のEC2にWordPressをS3プラグインの設定も行いながら100サイト以上デプロイする方法。

課題

Wordpressで構築されたWEBパッケージを単一サーバのバーチャルホストで提供していました。
1年ほど経過した時点で、200個近くに膨れ上がってしまいました。
また、動画を扱うサービスのためストレージが不足するようになってきました。

柔軟に複数のサーバに同一ドメインのバーチャルホストを分散してデプロイしたら解決すると考えました。

今回の目標は次の通りです。

  • 複数のサーバにバーチャルホストを分散させたい。
  • 低価格サービスなので多重化は行わない。
  • route53の設定も自動化したい。
  • iamの設定も自動化したい。
  • jenkinsでデプロイを自動化したい。
  • S3プラグインを使用して動画・画像はS3に追い出したい。

例として、EC2インスタンスが2台あって以下のようにデプロイするイメージです。

【EC2インスタンス1】
site01.hoge.com
site02.hoge.com
site03.hoge.com
site04.hoge.com
site99.hoge.com

【EC2インスタンス2】
site10.hoge.com
site11.hoge.com
site12.hoge.com
site13.hoge.com

site199.hoge.com

対応

以前作った、単一のEC2にバーチャルホストを追加していくAnsibleのスクリプトをがあります。それを改良して複数ホスト対応にする事にしました。

そのスクリプトはまた別の記事でご紹介したいと思います。

yamlの書き方の考える

以前の方法は、単一サーバに対して複数のroleのパラメータを変えて何度も実行させるという方法でした。しかし、この方法だと複数ホストに異なるバーチャルホストをデプロイすることができません。
単にホストインベントリーにホストを追加しただけだと、全く同一設定のホストが2個できます。Ansibleの使い方としては真っ当ですが、今回の要件に適していません。

site.yml

  roles:
    - common
    - { role: "ec2" }
    - { role: "apache" }
    - { role: "vhost-wordpress",
        vhost_name: "site01" }
    - { role: "vhost-wordpress",
        vhost_name: "site02" }
    - { role: "vhost-wordpress",
        vhost_name: "site03" }

今回はYAMLを以下のように変更しました。

ホストインベントリに複数のサーバを指定します。

hosts

host1
host2

そして各ホストにバーチャルホストのレイアウトを記述します。

host_vars/host1

vhosts:
    site1.hoge.com:
        param1: huga
    site2.hoge.com:
        param1: huga

host_vars/host2

vhosts:
    site10.hoge.com:
        param1: huga
    site11.hoge.com:
        param1: huga

loop内で複数の処理を行う。

各ホストのProvisioningはいつも通りroleで定義した処理を実行させます。
tasksのセクションで各ホスト毎に違った処理を行わせるために、include_tasksを使ってループの内側の処理を実行させます。

---
- hosts: webservers
  become: yes
  become_user: root
  roles:
    - ec2
    - common
    - apache
  tasks:
    - include_vars: vars/defaults.yml
    - name: setup vhost
      include_tasks: tasks/deploy_wp_vhost.yml
        HOST="{{ inventory_hostname }}"
        HOSTNAME="{{ item.key.split('.')[0] }}"
        VHOSTNAME="{{ item.key }}"
        MANAGE_PASSWORD="{{  item.value.manage_password }}"
      with_dict: "{{ hostvars[inventory_hostname].vhosts }}"

Ansibleではloop内に複数の処理を書くことはできません。
別のymlに処理を追い出して、それをincludeすることでloop内の複雑な処理を実行させています。

vhostのサブドメインをroute53に登録したい

設定したバーチャルホストをブラウザで見れる状態にするにはDNSレコードを設定する必要があります。
AnsibleにはAWSのRoute53を操作するモジュールがあります。

- name: route53 update
  route53:
    aws_access_key: "{{ lookup('env', 'AWS_ACCESS_KEY_ID') }}"
    aws_secret_key: "{{ lookup('env', 'AWS_SECRET_ACCESS_KEY') }}"
    state: present
    overwrite: yes
    zone: "{{ R53_ZONE }}"
    record: "{{ VHOSTNAME }}"
    type: A
    ttl: 300
    value: "{{ HOST }}"
  delegate_to: localhost
  become: false
  register: r53_status

delegate_to: localhost という記述があります。これは実行を指定したホストの移譲せよという指定です。
この記述がないとroute53モジュールはリモートのpythonで実行されます。
Ansibleを動かしているホストで実行したい場合は注意しましょう。
レコードが変更されたかどうかは、r53_status.changedで判定できます。

S3バケットを設定する

EC2のサーバのストレージを食いつぶすwordpressのmediaファイルをS3に追い出してしまいたいので、S3のバケットも自動で準備しましょう。

- name: S3バケットを作成しています。 "{{ bucket_name }}"
  s3_bucket:
    name: "{{ bucket_name }}"
    policy: "{{ lookup('template','public.json.j2') }}"
    state: present
    region: ap-northeast-1
    aws_access_key: "{{ lookup('env', 'AWS_ACCESS_KEY_ID') }}"
    aws_secret_key: "{{ lookup('env', 'AWS_SECRET_ACCESS_KEY') }}"
  delegate_to: localhost
  become: false
  register: s3_status

s3_bucketモジュールを使えば簡単です。先程のモジュールと同じでansbileを動作させているホストで実行したいので、同じくdelegate_toを指定してあります。

また、作成したバケットにpublic_readを与えたいので、バケットポリシも同時に指定しています。

public.json.j2

{
  "Version":"2012-10-17",
  "Statement":[{
    "Sid":"PublicReadGetObject",
        "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::{{ bucket_name }}/*"
      ]
    }
  ]
}

JSONファイルもテンプレート化してしまえるのでとても便利です。

バケットごとにIAMを発行して個別にアクセスキーを発行したい

以下、IAMとクレデンシャル取得のyamlの例です。
Ansibleのiamとiam_policyのモジュールを使用しました。
作成したcredentialは変数に格納されます。
初回のみsecret_keyが格納されます。二回目は格納されません。
この動作はAWSコンソールでクレデンシャルを作成したときと同じ動きです。

- name: S3バケットに対応したIAMを作成しクレデンシャル取得
  iam:
    iam_type: user
    name: "{{ VHOSTNAME }}"
    key_count: 1
    access_key_state: create
    state: present
    groups: "{{ IAM_GROUP }}"
  delegate_to: localhost
  become: false
  register: credentials

- name: iamのpolicy設定
  iam_policy:
    iam_type: user
    iam_name: "{{ VHOSTNAME }}"
    policy_name: "s3_limited_access_{{ bucket_name }}"
    policy_json: "{{ lookup( 'template', 's3_policy.json.j2') }}"
    state: present
  delegate_to: localhost
  become: false
  when: credentials.changed

ちなみに、作成したaccess_key, secret_access_keyはこのように取り出せます。

- name: access_keyを保存
  set_fact:
    s3_access_key: "{{ credentials['user_meta']['access_keys'][0]['access_key_id'] }}"
  when: credentials['user_meta']['access_keys'][0]['access_key_id'] is defined

- name: s3_secret_access_keyを保存
  set_fact:
    s3_secret_access_key: "{{ credentials['user_meta']['access_keys'][0]['secret_access_key'] }}"
  when: credentials['user_meta']['access_keys'][0]['secret_access_key'] is defined

is definedでキー存在を確認しています。いきなり値を取り出そうとすると、2回目は存在しないキーをアクセスすることになりますので、エラーが発生してそこで実行が止まってしまいます。

wordpressにAWSのaccess_keyを渡す

もっと行儀よく環境変数で渡すこともできますが、今回はwp_config.php に埋め込む方法をとりました。

- name: copy wordpres config
  become: true
  template:
    src: wp-config-sample.php
    dest: "{{ wp_vhost_path }}/wp-config.php"
    owner: apache
    group: apache
    mode: 0755
  when: s3_secret_access_key is defined

secret_keyが生成された初回のみwp-config.phpをテンプレートから所定の場所にコピーしました。
必要な情報をコード内に埋め込みたかったので以下のようにテンプレート化してあります。

define('DBI_AWS_ACCESS_KEY_ID', '{{ s3_access_key }}');
define('DBI_AWS_SECRET_ACCESS_KEY', '{{ s3_secret_access_key }}');
define('AS3CF_BUCKET', '{{ bucket_name }}');
define('AS3CF_REGION', 'ap-northeast-1');

wordpressのpluginの自動設定

wp_cliを入れてしまえばこっちのものです。以下の例はwp-cliをダウンロードして、/usr/local/bin/ の下に配置します。

- name: install wp-cli
  become: true
  get_url: url=https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
    dest="/usr/local/bin/" validate_certs=no mode=0755

この処理は各ホスト1回だけでいい処理です。

各バーチャルホストの設定のときに
必要なプラグインをinstallしたり。

- name: instlal plugin
  become: yes
  become_user: apache
  shell: "/usr/local/bin/wp-cli.phar --path={{ wp_vhost_path }} plugin install {{ plugin }}"
  with_items:
    - "amazon-web-services"
    - "amazon-s3-and-cloudfront"
  loop_control:
      loop_var: plugin
  when: db_created.changed

プラグインを有効にしたり、

- name: activate plugin
  become: yes
  become_user: apache
  shell: "/usr/local/bin/wp-cli.phar --path={{ wp_vhost_path }} plugin activate {{ plugin }}"
  with_items:
    - "amazon-web-services"
    - "amazon-s3-and-cloudfront"
  loop_control:
      loop_var: plugin
  when: db_created.changed

そして、プラグインの設定を更新したりできます。

- name: config plugin
  become: yes
  become_user: apache
  shell: "/usr/local/bin/wp-cli.phar --path={{ wp_vhost_path }} option update tantan_wordpress_s3 '{{ lookup('template', 'tantan_wordpress_s3_option.json') }}' --format=json"
  when: db_created.changed

wp-cliでプラグインの設定をJSONでDBに書き込むことができます。

{
  "post_meta_version": 6,
  "region": "",
  "domain": "path",
  "cloudfront": "",
  "object-prefix": "wp-content\/uploads\/",
  "copy-to-s3": "1",
  "serve-from-s3": "0",
  "remove-local-file": "0",
  "force-https": "0",
  "object-versioning": "1",
  "use-yearmonth-folders": "1",
  "enable-object-prefix": "1"
}

成果

  • virtual hostの設定をyamlに記述することができる。
  • bitbucket/githubのwebhookでJenkinsと連携しAnsibleを叩ける
  • AWSコンソールを一切触らなくても良くなりました。
  • インフラの知識がない担当者もとりあえずPullRequestを作成できればサイトを一つ増やすことができるようになりました。

続きを読む

[AWS,EC2]初期設定(インスタンス作成,SSH接続,料金のモニタリング)

AWSのアカウントを作成

https://qiita.com/Hikery/items/b919ae9e35f0f66e6a95

インスタンス作成

Step1 サービス > EC2 を選択

ec2.jpg

Step2 localの変更

time.jpg

Step3 マシーンイメージの選択

insutance.jpg

Step4 インスタンスタイプの選択

i_type.jpg

Step5 セキュリティグループの設定

・インスタンス設定
・ストレージ追加
はそのままで
・タグの追加 は適当にtagをつける。

セキュリティグループの設定 は HTTP を追加する。
security.jpg

Step6 キーペアを選択する

key2.jpg

鍵をDownloadして、インスタンスの作成をする。

SSH で繋いでみる

Step1 –

接続をおす
i_ssh_1.jpg

スタンドアロン SSH クライアント
i_ssh_1.jpg

Step2 – .pem fileを .ssh配下に配置する

terminal
$ mv /Users/[user name]/Downloads/***.pem /Users/[user name]/.ssh
$ chmod 600 football_chant.pem
$ ssh -i "***.pem" ec2-user@ec2-**-***-**-***.ap-northeast-1.compute.amazonaws.com
The authenticity of host 'ec2-**-***-**-***.ap-northeast-1.compute.amazonaws.com (**.***.**.***)' can't be established.
ECDSA key fingerprint is SHA***:*******************************************.
Are you sure you want to continue connecting (yes/no)?

yesを選択する。

terminal
Warning: Permanently added 'ec2-**-***-**-****.ap-northeast-1.compute.amazonaws.com,**.***.**.***' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2017.09-release-notes/

環境によっては

terminal
$ sudo yum update

料金をモニターする

画面で料金を確認

右上のアカンウトクリック > 請求ダッシュボード
https://console.aws.amazon.com/billing/home#/
こんな感じで見れます。
price2.jpg

使用した料金をメールで受け取る。

https://console.aws.amazon.com/billing/home#/preference
とりあえず、全部受け取るようにする。
setting.jpg

請求アラートを管理する

“請求アラートを管理する”にLinkする。

アラート.jpg

アラームを作成

make.jpg

メトリック設定

メトリック : 請求
チェック : USD
時間 : 6時間
setting2.jpg

アラームの定義

0$を超えた時、0$に戻った時を指定します。
setting6.jpg

また心配であれば5ドルや10ドルを超えた時点でもアラートを出すと良いかと思います。

参考

AWSアカウントの保護

アカウントのセキュリティ保護のために下記の記事を参考に、
MFAデバイス認証をいれました。

https://qiita.com/tmknom/items/303db2d1d928db720888

料金

初心者なので、これは気をつけようと思いました。参考になります。
https://qiita.com/mochizukikotaro/items/a0e98ff0063a77e7b694

RDSでMySQLを起動させ、EC2のインスタンスにつなぐ

下記を参考にした。
https://qiita.com/na0AaooQ/items/7c69a88c80f1efb4cad3
https://qiita.com/hiroshik1985/items/6643b7323183f82297b2

続きを読む

センサデータを fluentd 経由で Amazon Elasticsearch Service に送信して可視化

1. はじめに

以前の記事 で、RaspberryPi で収集したセンサデータを、 さくらVPS上に構築した Elasticsearch に送信して、Kibana で可視化しました。
今回は勉強を兼ねて、データを Amazon Elasticsearch Service ( Amazon ES ) に送信するように構成を変更します。

2. 全体の構成

image.png

3. 設定

3-1. Server side ( Amazon ES )

Amazon ES を立ち上げます。

Amazon ES ダッシュボード

  • 画面右上で、東京リージョン( ap-northeast-1 )が選択されていることを確認します
  • 新しいドメインの作成ボタンを押します
image

ドメインの定義

  • ドメイン名と Elasticsearch のバージョンを設定します
image

クラスターの設定

  • 今回は最小構成にします
image

アクセスの設定

  • ダッシュボードは特定メンバーに公開したかったので、パブリックアクセスとして、IPアドレスでアクセス制限を設定しました
  • 本当は IAM Role で制限したかったのですが、Webブラウザからのアクセスが面倒になるので今回は見送りました ( ブラウザはIAM認証できない )
image

完了確認

  • 10分ほど待ちます
image
  • 設定の状態が「アクティブ」になれば完了です
image

3-2. Sensor side ( Raspberry PI )

前提条件

以前の記事 の状態が前提です。今回はこれに変更を加えます。

プラグインのインストール

  • fluentd から Elasticsearch に直接格納するためのプラグインをインストールします
  • なお、IAM 認証をする場合は fluent-plugin-aws-elasticsearch-service を使うようです
sudo fluent-gem install fluent-plugin-elasticsearch

fluentd の設定

  • fluentd の設定ファイルを編集して、データの送信先を変更して、fluentd を再起動します
/home/pi/fluent/fluent.conf
<source>
  @type tail
  format json
  path /home/pi/myroom.log
  pos_file /home/pi/myroom.log.pos
  tag log.myroom
</source>

<match log.myroom>
  @type copy
  <store>
    @type elasticsearch
    type_name myroom
    logstash_format true
    logstash_prefix myroom
    reload_connections false
    hosts https://search-myroom-********.ap-northeast-1.es.amazonaws.com
  </store>
</match>

4. 確認

データが送信されていることを確認しました。
image.png

続きを読む

RaspberryPi で収集したセンサデータを Amazon ES に格納

1. はじめに

前回の記事 では、RaspberryPi で収集したセンサデータを、 さくらVPS上に構築した Elasticsearch に格納しました。
今回は勉強を兼ねて、データを Amazon Elasticsearch Service ( Amazon ES ) に格納するように構成変更します。

2. 全体の構成

image.png

3. 設定

3-1. Server side ( Amazon ES )

Amazon ES を立ち上げます。今回はそれだけです。

Amazon ES ダッシュボード

  • 画面右上で、東京リージョン( ap-northeast-1 )が選択されていることを確認します
  • ドメインの作成ボタンを押します
image

ドメインの定義

  • ドメイン名と Elasticsearch のバージョンを設定します
image

クラスターの設定

  • 今回は最小構成にします
image

アクセスの設定

  • ダッシュボードは特定メンバーに公開したかったので、パブリックアクセスとして、IPアドレスでアクセス制限を設定しました
  • 本当は IAM Role で制限したかったのですが、Webブラウザからのアクセスが面倒になるので今回は見送りました ( ブラウザはIAM認証できない )
image

完了確認

  • 10分ほど待ちます
image
  • 設定の状態が「アクティブ」になれば完了です
image

3-2. Sensor side ( Raspberry PI )

前提条件

以前の記事 の状態が前提です。今回はこれに変更を加えます。

プラグインのインストール

  • fluentd から Elasticsearch に直接格納するためのプラグインをインストールします
  • なお、IAM 認証をする場合は fluent-plugin-aws-elasticsearch-service を使うようです
sudo fluent-gem install fluent-plugin-elasticsearch

fluentd の設定

  • fluentd の設定ファイルを編集して、データの送信先を変更して、fluentd を再起動します
/home/pi/fluent/fluent.conf
<source>
  @type tail
  format json
  path /home/pi/myroom.log
  pos_file /home/pi/myroom.log.pos
  tag log.myroom
</source>

<match log.myroom>
  @type copy
  <store>
    @type elasticsearch
    type_name myroom
    logstash_format true
    logstash_prefix myroom
    reload_connections false
    hosts https://search-myroom-q6f5bk4cwppojeescffv24dmkm.ap-northeast-1.es.amazonaws.com
  </store>
</match>

4. 確認

データが送信されていることを確認しました。
image.png

続きを読む

AWS EC2でHyperledger Fabricを動かす(AWS準備編)

AWSにUbuntuをセットアップし、FabricをDockerで起動してみたいと思います。
普段はVirtualBox内のUbuntuでFabricを動かしていて、AWSを触るのは初めて。
果たして最後までできるのかわかりませんが、とりあえず始めてみます。

今回はAWSでサーバを準備する手順をメモ。
大きく分けると以下の手順を実行します。

  1. EC2インスタンス作成〜起動
  2. SSH設定変更
  3. ターミナルからインスタンスへ接続する

1. EC2インスタンス作成〜起動

ログインしてコンソールを表示、仮想マシンの起動を選択します
Image 2018-01-05 18-06-33.jpg

EC2インスタンスを今すぐ始めます
Image 2018-01-05 18-01-53.jpg

適当な名前を入力してください
Image 2018-01-05 18-08-51.jpg

Ubuntu Server 16.04 LTSを選択して続行します
Image 2018-01-05 18-09-49.jpg

インスタンスタイプは無料枠のtc2.microのまま、続行します
Image 2018-01-07 16-31-54.jpg

キーペアに適当な名前を入力してファイルをダウンロードします
ダウンロードしたファイルは、~/.ssh ディレクトリに保管しましょう
Image 2018-01-05 18-12-55.jpg

インスタンスを作成します
Image 2018-01-05 18-13-42.jpg

作成には数分かかります
さきにEC2コンソールへ移動しましょう
Image 2018-01-05 18-14-20.jpg

ステータスがrunningになったら作成完了です
Image 2018-01-07 16-35-28.jpg

ここでSSHログイン試行するも、タイムアウトで接続できず。
軽く調べたところ、SSHの設定の変更が必要?とのこと。
次の手順でセキュリティグループの設定を変更します。

2. SSH設定変更

インスタンスを選択すると詳細が下の方に表示されます
この中から、セキュリティグループを選択します
Image 2018-01-07 16-33-49.jpg

SSHのインバウンドのソースが特定のネットワークに限定されているため解除します
編集を選択します
Image 2018-01-07 16-39-34.jpg

ソースを任意の場所に設定して保存します
Image 2018-01-07 15-56-24.jpg

3. ターミナルからインスタンスへ接続する

インスタンス作成時に保存したキーペアファイルが~/.sshディレクトリにコピーされている前提です。
権限を編集してからsshで繋ぎます。
AWSのUbuntuでは、ubuntuがデフォルトユーザになります。
アクセス先のIPアドレスは、インスタンスの「パブリックDNS(IPv4)」です。

$ chmod 400 .ssh/user1.pem 
$ ssh -i ".ssh/user1.pem" ubuntu@ec2-xx-xx-xx-xx.us-east-2.compute.amazonaws.com
The authenticity of host 'ec2-xx-xx-xx-xx.us-east-2.compute.amazonaws.com (xx-xx-xx-xx)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ec2-xx-xx-xx-xx.us-east-2.compute.amazonaws.com,xx-xx-xx-xx' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-1043-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@ip-xx-xx-xx-xx:~$ pwd
/home/ubuntu

AWS EC2のUbuntu 16.04に、SSHでログインできました。

次は、Fabricを起動できればと思います。

続きを読む

PHPでFlysystemのAwsS3AdapterをS3互換サービスで使うときにハマったこと

ハマった時の状況

  • Laravelを使ってる
  • 環境はDockerで構築
  • S3互換サービスはDocker上のminio

結論

use_path_style_endpointをtrueにするとサブドメインを使わずにバケットを指定することができる

タイムライン

  • LaravelからS3にアップロードしたい
  • S3だけローカルから外すのはびみょい
  • テスト環境としてminioを選択
  • minioをdocker-composeに追加してみる
  • 一通りの設定をして、接続してみる
  • バケット名がサブドメインになるので、docker-composeでの名前解決に失敗する
  • 取り急ぎhostsに名前書いて名前解決できるようにする
  • 依然としてエラー そのようなバケットはありませんと言われる
  • minioのブラウザ側でバケットを作成
  • それでもエラー・・・ よく見るとエラー対象のバケット名が入っていない
  • ひょっとして、サブドメインでバケット名拾えない?
  • ネットの海を彷徨う
  • force_path_styleという設定をrubyのコードないで見つける
  • ダメ元で設定を追加してみる、ダメっぽい
  • AwsS3Adapterのオプションにuse_path_style_endpointというのを見つける
  • 上記オプションをオンにすることで接続が成功

続きを読む

Route53でドメイン買ってACMでSSL証明書発行してCloudFrontでGithub Pageと買ったドメインと紐付けた

なにこれ

タイトル通りの手順です。流れなので長いのはお許しください。

0からでもうまいことやれたので備忘録として書きました。参考までにどうぞ。


事前準備

  • AWSへのアカウント登録関連は完了しておく

    • メール認証・クレカ登録などお忘れなく
  • Github Page 作成
    • 無料垢でもOK

Route53でドメインを買う

  • Route53にアクセス。
  • 「Register Domain」ボタンよりドメイン購入手続き
    Screenshot from Gyazo

  • 購入したいドメイン名を入力
  • 欲しいTLD(.com, .net, .orgなど)を選択
  • 「Check」ボタンより購入可能なドメインを検索

Screenshot from Gyazo


  • 「Add to cart」で欲しいドメインをカートに追加
  • ページ下部の「Continue」ボタンで次へ

Screenshot from Gyazo


  • 購入者入力画面で各種入力

Screenshot from Gyazo


  • 入力後、問題なければ「Continue」ボタンで確認画面に遷移
  • 「Terms and Conditions」の同意確認箇所にチェックを入れ、「Complete Purchase」ボタンで購入確定へ

Screenshot from Gyazo


  • メールにて購入完了の旨を受け取る。ドメイン購入はこれにて完了。

    • 下図は実際に買ったときのやつ
  • AWS Certificate Managerに移動

Screenshot from Gyazo


AWS Certificate Manager

  • 右上のリージョンが「バージニア北部」になっていることを確認

    • なっていなかったら選択
    • CloudFrontで使用する際に必要
      Screenshot from Gyazo

  • 「証明書のリクエスト」をクリック

Screenshot from Gyazo


  • ドメイン名の追加で先程購入したドメインを入力して「次へ」をクリック

Screenshot from Gyazo


  • 証明書のリクエスト検証はDNSにして「次へ」をクリック

Screenshot from Gyazo


  • 確認で問題なければ「確定とリクエスト」ボタンをクリック。

Screenshot from Gyazo

  • その後遷移する確定後の画面より「続行」ボタンをクリック。

  • ダッシュボードに遷移して、検証保留中になっているのを確認したらCloudFrontに移動

Screenshot from Gyazo


CloudFront

  • 「Distributions」ダッシュボードが開いているのを確認して、「Create Distribution」をクリック

Screenshot from Gyazo


  • Webの方の「Get Started」をクリック

Screenshot from Gyazo


01. Origin Settings

  • 「Origin Domain Name」に自分のgithub pageを入力

    • ここではgithub pageのURL=インデックスページという想定です

Screenshot from Gyazo


02. Default Cache Behavior Settings

  • 「Viewer Protocol Policy」をRedirect HTTP to HTTPS
  • 「Cache Based on Selected Request Headers」をWhitelist
  • 「Whitelist Headers」でHostsをAdd

Screenshot from Gyazo


03. Distribution Settings

  • 「Alternate Domain Names(CNAMEs)」 に適応させるドメインを入力
  • 「SSL Certificate」はCustom SSL Certificateを選択
    • このときAWS Certificate Managerで作成したSSL証明書が選択できると思うのでそれを選択

Screenshot from Gyazo


  • 01~03までを入力したら「Create Distribution」ボタンをクリック
  • その後生成された「Domain Name」(dから始まるやつ)のURLをコピー
    Screenshot from Gyazo
  • コピーしたURLが見れる状態になってるかを確認
  • アクセスできるのを確認したらRoute53に戻る

Route53

  • 左メニューより「Hosted Zones」を選択、ダッシュボードに購入したドメイン名あるのでクリック
  • 「Create Record Set」ボタンをクリック

Screenshot from Gyazo


  • Nameは空でOK
  • TypeはA
  • AliasはYesをチェック
    • Alias Targetに先程コピーしたURLを貼る
  • 「Save Record Set」クリックで追加

Screenshot from Gyazo


Github Page

  • GitHub Pagesのリポジトリに移動
  • 「Settings」タブより設定ページに移動

Screenshot from Gyazo


GitHub Pages

  • 「Custom domain」箇所に購入したドメインを入力、Save

    • DNSの浸透がまだだとはじかれるかもなので、10分くらい待つのとか、CloudFrontのStatusがDeployedになっているかなど確認した上でやる

Screenshot from Gyazo


反映を確認

:tada::tada::tada:

Screenshot from Gyazo


感想

  • AWS、自分で1から触るのは始めてなのでDNS浸透なり証明書が無効だったりと色々ありしんどかった。
  • ただここまでやっておけばある程度動かせる下地ができる感じなのでやっておいてよかった
  • ドメイン買うのももっと安くやる方法もあるだろうけど、AWSサービス間で設定するなら全部まとめてやるのが分かりやすいかなと思ったのでこの手法で良かったと思う

参考

続きを読む