20190711のAWSに関する記事は15件です。

AWSを使ってみる④

サクっとapacheとPHPをインストール

最低限の環境を入れるだけなのでどんどん省いていきます。


# yum install httpd php

省略!

Installed:
  httpd.x86_64 0:2.4.6-89.el7.centos
 php.x86_64 0:5.4.16-46.el7

Dependency Installed:
  apr.x86_64 0:1.4.8-3.el7_4.1       apr-util.x86_64 0:1.5.2-6.el7       centos-logos.noarch 0:70.0.6-3.el7.centos       httpd-tools.x86_64 0:2.4.6-89.el7.centos       libzip.x86_64 0:0.10.1-8.el7       mailcap.noarch 0:2.1.41-2.el7       php-cli.x86_64 0:5.4.16-46.el7       php-common.x86_64 0:5.4.16-46.el7

Complete!
[root@web01 ~]# 

OSとカーネルのバージョンは今回はあげません。
どんどん省略していきましょう。

テストページを置いて動作確認

/var/www/html/index.php
<html>
 <head>
  <title>testpage php</title>
 </head>
 <body>
 <?php echo '<p>Hello World</p>'; ?>
 </body>
</html>

apacheを起動

# systemctl start httpd
# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2019-07-11 11:59:49 UTC; 2s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 4271 (httpd)
   Status: "Processing requests..."
   CGroup: /system.slice/httpd.service
           tq4271 /usr/sbin/httpd -DFOREGROUND
           tq4272 /usr/sbin/httpd -DFOREGROUND
           tq4273 /usr/sbin/httpd -DFOREGROUND
           tq4274 /usr/sbin/httpd -DFOREGROUND
           tq4275 /usr/sbin/httpd -DFOREGROUND
           mq4276 /usr/sbin/httpd -DFOREGROUND

Jul 11 11:59:49 web01 systemd[1]: Starting The Apache HTTP Server...
Jul 11 11:59:49 web01 systemd[1]: Started The Apache HTTP Server.

接続確認します。
aws_dlna_000025.JPG

無事PHPも動いてますね。
じゃあ早速mariadbでも……ん?

<RDSに無料枠あるってよ!

これだ!

というわけでRDS使います。

aws_dlna_000033.JPG

作りました。

セキュリティグループをちょいちょいっといじって……

# mysql -h xxxxxxxxxxxx -u xxxx -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.22-log Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show database
    -> ;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'database' at line 1
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| dbinstalle         |
| innodb             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

はい、無事EC2インスタンスからRDSインスタンスに接続できることを確認しました!

AWSのRDSについて

色々RDSの仕様や設定を眺めていたところ、AWSのRDSではスペックを簡単に変更できるようですね。

aws_dlna_000034.JPG

もし実務で負荷が上がっても簡単に切り替えられるのはすごくいいですねぇ……
覚えておきましょう。

最後に

今回は非常にシンプルな環境の構築を目標としつつ
とりあえずAWSを使うという目的は果たせたと思います。

今回はEC2とRDSという狭い範囲のみで行いました。
触り程度は覚えられたかなと思うので、後は他のサービスも確認ししつつ、
実践的な場面を想定した環境の構築もやっていきたいと思います。

なるべく無料枠でできる限り……

ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SSM Session ManagerのSSHをWindowsで使う方法

SSM Session Managerで待望のSSHが使える様になりましたね! めでたい!
しかし、公式マニュアルにはどうやらLinuxやMacでの設定方法しか書いてないので、Windowsでも簡単に使う方法を検証しました。
料金も無料だし、アクセス先制限もできるしもう使うしか無いですね!!

前提条件

  • windows 10
  • EC2インスタンスはSSMが使える様エージェント、ロール設定済み

インストール

たったの3ステップ!
1. AWS CLIインストール
公式にあるとおりインストーラーをダウンロードしてきてインストールする。

https://s3.amazonaws.com/aws-cli/AWSCLISetup.exe

2. Session Manager Pluginインストール
公式にあるとおりインストーラーをダウンロードしてきてインストールする。

https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows /SessionManagerPluginSetup.exe

3. SSHの設定を追加する。
Windowsの場合、C:\Users\【UserName】\.ssh\configに以下を追加、もしくは追記する。

config
    # SSH over Session Manager
    host i-* mi-*
        ProxyCommand C:\Program Files\Amazon\AWSCLI\bin\aws.exe ssm start-session 【--profile あれば】 --target %h --document-name AWS-StartSSHSession --parameters "portNumber=%p"

オリジナルとの違いはsh -cが無くなってawsがフルパス、portNumberのシングルクォーテーションからダブルクォーテーションへ変更

AWS CLIでプロファイル使っているときはここで入れておく

完了!

参考文献

補足

接続に使う秘密鍵は接続先対象EC2に設定しているそのもの
呼び方はSession Manager for SSHとかでよいのだろうか?

端末とAWS間の通信方法

StreamUrlとして以下がAWS CLIのコマンド応答として返却されているためWebSocket(wss)でつながっている。

wss://ssmmessages.ap-northeast-1.amazonaws.com/v1/data-channel/【IAMユーザー名を含むランダム列】?role=publish_subscribe

AWS CLIをその他の場所にインストールしていた場合にAWSコマンドの場所を調べる

where aws
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSを使ってみる③

作成したインスタンスの確認

aws_dlna_000018.JPG
うん、ある!

画面下部に詳細が色々書かれてるので確認しましょう。(画像ではカットしてます)

TeraTermでアクセス

早速ユーザと秘密鍵ファイルを指定して接ぞk……ん?

Teraterm.exe
Please login as the user "centos" rather than the user "root".

rootでログインすんなって言われました。
そりゃそうだよね。

改めてcentosユーザでログイン

aws_dlna_000020.JPG

無事にログインできましたね。

初期設定

ここまでくれば後は簡単ですね。
ささっと初期の設定の確認と修正をしていきましょう。

作業的には下記の通りぐらいですね。
- rootパスワード設定
- 個人ユーザの作成
- sshの設定確認
- 起動プロセスの確認
- プロセスの確認
- cloud-initの設定確認

よーし特に問題ない。apacheいれ……ん?

# ip a
 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UP group default qlen 1000
     link/ether 06:7f:b5:4b:44:12 brd ff:ff:ff:ff:ff:ff
     inet 172.31.47.185/20 brd 172.31.47.255 scope global dynamic eth0
        valid_lft 3106sec preferred_lft 3106sec
     inet6 fe80::47f:b5ff:fe4b:4412/64 scope link 
        valid_lft forever preferred_lft forever

なんかIPが想定してたのと違う……

プライベートIPアドレスが想定していたものと違かった

インスタンスの情報を見たところ、作成時に作成したVPCのIDが違いました。
なんでやーと思って作業ログがてら取ってたスクリーンショットを見たところ

aws_dlna_000008.JPG

インスタンス作成時にVPCを正しく指定してませんでした。

(・ω<) てへぺろ
みんなはちゃんと指差し確認しようね!

次回環境を作るときは気を付けます。

ElasticIPでグローバルIP取得し、IPを固定化したところで今回はここまで

次回はApacheとPHPとmysql導入
AWSを使ってみる④

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

今度はあんまりゴツくない!?「わりとゴツいKubernetesハンズオン」そのあとに

1月半ほど前、社内勉強会のおすそ分けとして、わりとゴツいKubernetesハンズオンの記事を書きました。
おかげさまでご好評いただき、今では1500を超えるいいねをいただきました。ありがとうございます。

今回の話とは全然関係ないですが、こちらも頑張って書いているので興味あれば見てやってください。
(マイナーなタグしか付けられなかったせいか、view数がとても少なくて悲しみに暮れています…?)
QRコード Deep Dive ーデータ符号化とか誤り訂正とかー

開発環境の構築ができるようになろう!

さて、みなさまKubernetesについては完全理解しましたでしょうか?
主要な要素の説明はしているので、完全理解フェーズにたどり着くのも夢ではないと思います。

ただ、ハンズオンの中では、既存のDockerイメージしか使っていません。
スクリーンショット 2019-07-01 9.38.35.png

Kubernetesを使ってオリジナルのアプリケーションを構築するには、
Dockerを交えた開発環境の構築という、もうひと山を超えねばなりません。

ここで、前回のハンズオンの目標を見返してみてください。

  • 構築・運用ができるような気分になる

できるようになるとは言ってない…!(どーん

ということで、前回入れようと思ったけど力尽きたゴツくなりすぎると思ってやめておいた、
開発環境の構築について、またハンズオン形式でお伝えしようと思います!

ちなみに、本記事は福岡のKubernetes勉強会「ふくばねてす node-2」での発表資料をQiita用にコンバートしたものです。
発表資料 : https://speakerdeck.com/ktam1219/waritogotuikuberneteshanzuon-sofalseatoni

やりたいこと

ローカル開発環境

まずはローカルでの開発環境を作らないことには始まりません。
大まかな開発フローは以下の繰り返しになります。
1. コードを編集
2. Dockerイメージをbuild
3. ローカルのKubernetesクラスターにデプロイ
スクリーンショット 2019-07-01 9.39.50.png

CI/CD環境

本番環境にリリースする際の作業はさらに手順が増えます。
1. コードを編集
2. GitにPush
3. Dockerイメージをbuild
4. コンテナレジストリにDockerイメージをPush
5. Kubernetesクラスターにデプロイ
スクリーンショット 2019-07-01 9.40.08.png

手作業でやろうとすると大変なので、CircleCIなどを使って自動化したいですね。

以上が今回やりたいことなんですが、
なんだか一気にめんどくさい気持ちになってきましたね。

でも、簡単にできるんです。
そう、Skaffoldならね!

Skaffold

Skaffoldは、Google謹製のKubernetesの開発支援ツールです。
クラスタにアプリケーションをデプロイするまでの
一連の作業を(ローカル/リモート問わず)自動化してくれます。

  • Dockerイメージのbuild
  • Dockerイメージの構造テスト
  • Dockerイメージへのタグ付け
  • コンテナレジストリにDockerイメージをPush
  • KubernetesクラスタにDeploy

先ほど挙げたやりたいことに加え、テストやタグ付けまで…!

また、各フェーズは独立していて、プラグイン的にお好みでやり方を選択できます。
architecture.png

Skaffoldをローカル開発で使ってみよう

ローカルのKubernetes環境を準備する

前回のハンズオンを参考に、下準備の部分まで終わらせます。
https://qiita.com/Kta-M/items/ce475c0063d3d3f36d5d#kubernetes%E3%82%92%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86

サンプルアプリケーションを準備する

前回と同様、kubernetes/examplesのguestbookアプリを使いましょう。

$ git clone git@github.com:kubernetes/examples.git
$ mkdir skaffold_example
$ cp -R examples/guestbook/* skaffold_example
$ cd skaffold_example

不要なファイルを削除しておきます。

$ rm -rf all-in-one
$ rm -rf legacy

PCの負担を下げるためちょっと調整 & Dockerイメージの取得先を変更します。

$ vi examples/guestbook/frontend-deployment.yaml
10行目   replicas: 3 <- これを1に変更
19行目   image: gcr.io/google-samples/gb-frontend:v4 <- これを ${dockerhubのユーザー名}/skaffold-example-frontendに変更

$ vi examples/guestbook/redis-slave-deployment.yaml
11行目   replicas: 2 <- これを1に変更
21行目   image: gcr.io/google_samples/gb-redisslave:v1 <- これを ${dockerhubのユーザー名}/skaffold-example-redis-slaveに変更

ingressのマニフェストファイルを作成します。

$ cat << 'EOT' >./guestbook-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: guestbook-ingress
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: frontend
          servicePort: 80
EOT

Skaffoldのインストール & セットアップ

以下のURLを参考にインストールを行います。
https://skaffold.dev/docs/getting-started/#installing-skaffold

macであればHomebrewで入ります。

$ brew install skaffold

Skaffoldの設定ファイルを作成します。

skaffold.yaml
apiVersion: skaffold/v1beta11
kind: Config

# Dockerイメージのビルドに関する設定
build:
  artifacts:
  # ビルドするイメージ
  - image: ${dockerhubのユーザー名}/skaffold-example-frontend
    context: php-redis                                            # ソースファイルがあるパスの指定
  - image: ${dockerhubのユーザー名}/skaffold-example-redis-slave
    context: redis-slave
  local:                                                          # ローカルでイメージをビルドするときの設定
    push: false                                                   # ビルドしたイメージをpushするか

# デプロイに関する設定
deploy:
  kubectl:
     # デプロイ対象のマニフェストファイルの指定
    manifests:
    - frontend-*.yaml
    - redis-master-*.yaml
    - redis-slave-*.yaml
    - guestbook-ingress.yaml

設定ファイルのその他の項目については、以下を参照してください。いろいろできます。
https://skaffold.dev/docs/references/yaml/

skaffold dev

さて、ここで以下のコマンドを実行してみましょう。

$ skaffold dev

開発用のコマンドです。
実行後、Dockerイメージのビルド、Kubernetsクラスターへのデプロイをおこないます。
その後はファイルの変更を監視して、変更があるたびにビルド、デプロイを繰り返します。
また、ファイル変更監視中は、各Podのログも流してくれます。いたれりつくせり。

Generating tags...
 - mohri1219/skaffold-example-frontend -> mohri1219/skaffold-example-frontend:76a6cd0-dirty
 - mohri1219/skaffold-example-redis-slave -> mohri1219/skaffold-example-redis-slave:76a6cd0
Tags generated in 49.700092ms
Starting build...
Found [docker-for-desktop] context, using local docker daemon.
Building [mohri1219/skaffold-example-frontend]...
Sending build context to Docker daemon   7.68kB
Step 1/8 : FROM php:5-apache
 ---> 24c791995c1e

(中略)

Starting deploy...
kubectl client version: 1.14
deployment.apps/frontend created
service/frontend created
ingress.extensions/guestbook-ingress created
deployment.apps/redis-master created
service/redis-master created
deployment.apps/redis-slave created
service/redis-slave created

(中略)

Watching for changes every 1s...
[frontend-7df8f8b7f8-mscxk php-redis] AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.1.1.154. Set the 'ServerName' directive globally to suppress this message

前回のハンズオン同様、http://localhost にアクセスすると画面が出てきます。
スクリーンショット 2019-07-01 15.30.49.png

ファイルの変更検知機能を試してみるために、おもむろにhtmlファイルを書き換えてみます。

php-redis/index.html
<h2>Guestbook!!</h2>   <!- "!!"を追加してみる -->

すると、ちゃんと変更を検知してDockerイメージのビルドを始めてくれます!

Generating tags...
 - mohri1219/skaffold-example-frontend -> mohri1219/skaffold-example-frontend:76a6cd0-dirty
Tags generated in 62.953504ms
Starting build...
Found [docker-for-desktop] context, using local docker daemon.
Building [mohri1219/skaffold-example-frontend]...
Sending build context to Docker daemon   7.68kB
Step 1/8 : FROM php:5-apache
 ---> 24c791995c1e
Step 2/8 : RUN pear channel-discover pear.nrk.io
 ---> Using cache
 ---> bd9823d8109d
Step 3/8 : RUN pear install nrk/Predis
 ---> Using cache
 ---> 390dd33a211f

ブラウザをリロードしてみるとちゃんと変更が反映されていることが確認できます。
スクリーンショット 2019-07-01 15.30.57.png

最後に、Ctrl+Cで終了してみましょう
すると、DockerイメージやKubernetesクラスター内の各種リソースを削除してくれます!

Pruning images...
untagged image mohri1219/skaffold-example-frontend:3eba4d84484d6648b4a0907db8f472e5df4439d9ba4ca012a5b96f95af4dd09b
untagged image mohri1219/skaffold-example-frontend:c4971ec-dirty
untagged image mohri1219/skaffold-example-frontend@sha256:c2f8eb06b6a9d0624c1f8ea6cba4dfaefa450f11d99c90a209617618b0687730
deleted image sha256:3eba4d84484d6648b4a0907db8f472e5df4439d9ba4ca012a5b96f95af4dd09b
deleted image sha256:42794d3d5de90049ae108429e1536b747b145918b9972edd62e958b58b09c1ec
WARN[0290] builder cleanup: pruning images: Error response from daemon: conflict: unable to delete 48d1ae3a57c7 (cannot be forced) - image is being used by running container 0b0107ee518b
Cleaning up...
deployment.apps "frontend" deleted
service "frontend" deleted
ingress.extensions "guestbook-ingress" deleted
deployment.apps "redis-master" deleted
service "redis-master" deleted
deployment.apps "redis-slave" deleted
service "redis-slave" deleted
Cleanup complete in 3.70313407s

skaffold run

さて、次は以下のコマンドを実行してみましょう。

$ skaffold run

これは単発のデプロイコマンドで、Dockerイメージのビルド、Kubernetsクラスターへのデプロイをおこなって終了します。
終了後も各種リソースはKubernetesクラスター内に残り続けます。

Generating tags...
 - mohri1219/skaffold-example-frontend -> mohri1219/skaffold-example-frontend:76a6cd0-dirty
 - mohri1219/skaffold-example-redis-slave -> mohri1219/skaffold-example-redis-slave:76a6cd0
Tags generated in 48.802686ms
Starting build...
Found [docker-for-desktop] context, using local docker daemon.
Building [mohri1219/skaffold-example-frontend]...
Sending build context to Docker daemon   7.68kB
Step 1/8 : FROM php:5-apache
 ---> 24c791995c1e

(中略)

Starting deploy...
kubectl client version: 1.14
deployment.apps/frontend created
service/frontend created
ingress.extensions/guestbook-ingress created
deployment.apps/redis-master created
service/redis-master created
deployment.apps/redis-slave created
service/redis-slave created
Deploy complete in 1.763257066s

Skaffoldでテストもしてみる

Skaffoldのテストは、container-structure-testを使います。
その名の通り、コンテナイメージの構造をテストするものです。

できることは、

  • イメージ内のコマンドの出力をチェック
  • ファイルシステムのメタデータと内容を検証
  • etc...

今回は、skaffold-example-frontendのファイル存在チェックをしてみましょう。
その他のテスト項目については
https://github.com/GoogleContainerTools/container-structure-test/blob/master/README.md を参照してください。

structure-test/frontend.yaml
schemaVersion: 2.0.0

# 各種ファイルの存在確認
fileExistenceTests:
  - name: 'php file'
    path: '/var/www/html/guestbook.php'
    shouldExist: true
  - name: 'js file'
    path: '/var/www/html/controllers.js'
    shouldExist: true
  - name: 'html file'
    path: '/var/www/html/index.html'
    shouldExist: true

skaffoldの設定ファイルにテストの設定を追記しましょう。

skaffold.yaml
apiVersion: skaffold/v1beta11
kind: Config

build:
  (略)

# テストの設定
test:
  test:
  - image: ${dockerhubのユーザー名}/skaffold-example-frontend
    structureTests:
      - ./structure-test/frontend.yaml

deploy:
  (略)

skaffold runを実行すると、以下のようにログが出てきます。
もちろん、テストが失敗するとデプロイはされません。

$  skaffold run

(中略)

Starting test...

======================================
====== Test file: frontend.yaml ======
======================================
=== RUN: File Existence Test: php file
--- PASS

=== RUN: File Existence Test: js file
--- PASS

=== RUN: File Existence Test: html file
--- PASS


=======================================
=============== RESULTS ===============
=======================================
Passes:      3
Failures:    0
Total tests: 3

PASS
Test complete in 1.455478421s

お片付け

ローカルの開発環境についてはここまで。開発が進められるイメージは持てましたか?

Docker for DesktopのKubernetesを無効化してお片付けをしましょう。
68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f33393536352f39373362343665662d636637652d616437352d623734352d6332666363653339353838652e706e67.png

SkaffoldをCI/CD向けに使ってみよう

完成版はこちらにあります。
https://github.com/Kta-M/skaffold_example

GitHubのリポジトリを作成

みんなできるだろうから割愛します。

DockerHubのリポジトリを作成

DockerHubも画面からリポジトリが作れます。
screencapture-cloud-docker-u-mohri1219-repository-create-2019-06-29-07_08_27.png

EKSでクラスタを作成

前回のハンズオンでやったやつです。
相変わらず立てるのに15分ぐらいかかります。とてもつらい。

$ eksctl create cluster \
  --name eksctl-handson \
  --region ap-northeast-1 \
  --nodes 3 \
  --nodes-min 3 \
  --nodes-max 3 \
  --node-type t2.medium \
  --ssh-public-key <キーペア名>

ap-northeast-1bが選択できる古いAWSアカウントはAZ指定行なってください。

Skaffoldの設定ファイルを調整

先ほどまでローカルでskaffoldを使ってきましたが、本番環境にデプロイする際は以下の点を変えたいです。

  • DockerイメージをコンテナレジストリにPushする
  • ingressのマニフェストファイルは使わない

こういった、状況に応じて挙動を切り替えるための仕組みとして、profileという機能があります。
実行時にprofileを与えると、それに応じた設定をオーバーライドしてくれる機能です。

skaffold.yaml
apiVersion: skaffold/v1beta11
kind: Config

(中略)

# 以下を追加
profiles:
- name: prd
  build:
    local:
      push: true                    # ビルドしたイメージをコンテナレジストリにPushする
  deploy:
    kubectl:
      manifests:                    # ingressのファイルを除外
      - frontend-*.yaml
      - redis-master-*.yaml
      - redis-slave-*.yaml

以下のようにprdのprofileを追記しましょう。
こうすることで、 skaffold run --profile prdとすればprdの設定でオーバーライドしてくれるようになります。

CircleCIの設定

CirlceCIにログインし、GitHubリポジトリを登録しましょう。
スクリーンショット 2019-06-29 6.47.58.png
screencapture-circleci-setup-project-gh-Kta-M-skaffold-example-2019-06-29-06_48_44.png

プロジェクト環境変数を設定します。
screencapture-circleci-gh-Kta-M-skaffold-example-edit-2019-06-30-17_48_07.png

変数名
AWS_DEFAULT_REGION ap-northeast-1
CUSTER_NAME eksctl-handson
DOCKER_HUB_USR DockerHubのユーザー名
DOCKER_HUB_PSW DockerHubのパスワードをbase64エンコードしたもの

EKSにデプロイするため、AWSの認証情報を設定します。
ここで、EKSクラスタを立てるのに使ったIAMユーザーと同じものを設定しなければならないことに注意してください。
KubernetesのRBACとIAMが紐付いてしまうので。
参考: https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/managing-auth.html
screencapture-circleci-gh-Kta-M-skaffold-example-edit-2019-06-30-17_58_50.png

また、orbを使えと言われてるけど今回は無視します。
orbはバージョン2.1でしか使えないけど、2.1はまだローカルでの動作確認ができないようなので…。とてもつらい。

CircleCIのconfigを作成

以下のようになります。nameを見ていけば何をしているのかだいたい分かるかと思います。
本来は、もろもろインストールしたDockerイメージを作ってからやるべきなんでしょうけど、
分かりやすくするためインストールもcircleciで行っています。

circleci/config.yml
version: 2
jobs:
  build:
    docker:
      - image: docker:18.09
    steps:
    - run:
        name: set shell and install tools
        command: |
          set -x; \
          apk add --no-cache --virtual .fetch-deps curl git python py-pip less groff

    - checkout
    - setup_remote_docker

    - run:
        name: install kubectl
        command: |
          curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/linux/amd64/kubectl && \
          chmod +x ./kubectl && \
          mv ./kubectl /usr/local/bin/kubectl

    - run:
        name: install container-structure-test
        command: |
          curl -LO https://storage.googleapis.com/container-structure-test/latest/container-structure-test-linux-amd64 && \
          chmod +x container-structure-test-linux-amd64 && \
          mv container-structure-test-linux-amd64 /usr/local/bin/container-structure-test

    - run:
        name: install aws cli
        command: pip install awscli

    - run:
        name: install aws-iam-authenticator
        command: |
          curl -o aws-iam-authenticator https://amazon-eks.s3-us-west-2.amazonaws.com/1.12.7/2019-03-27/bin/linux/amd64/aws-iam-authenticator && \
          chmod +x ./aws-iam-authenticator && \
          mv ./aws-iam-authenticator /usr/local/bin

    - run:
        name: setup kubeconfig
        command: aws eks update-kubeconfig --name $CLUSTER_NAME

    - run:
        name: login to dockerhub
        command: echo $DOCKER_HUB_PSW | base64 -d | docker login -u $DOCKER_HUB_USR --password-stdin

    - run:
        name: install skaffold
        command: |
          curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/v0.32.0/skaffold-linux-amd64 && \
          chmod +x skaffold && \
          mv skaffold /usr/local/bin

    - run:
        name: skaffold run
        command: skaffold run --profile prd

workflows:
  version: 2
  workflow:
    jobs:
    - build

GitHubにPush

この状態でもろもろをGitHubにPushしてあげると…
CircleCI上でskaffold run --profile prdが実行され、もろもろの処理が走ります。

screencapture-circleci-gh-Kta-M-skaffold-example-10-2019-07-01-06_02_44.png

$ kubectl get svc
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP                               PORT(S)        AGE
service/frontend       LoadBalancer   10.100.61.11     xxxxxx.ap-northeast-1.elb.amazonaws.com   80:31673/TCP   8s
service/kubernetes     ClusterIP      10.100.0.1       <none>                                    443/TCP        23m
service/redis-master   ClusterIP      10.100.137.217   <none>                                    6379/TCP       7s
service/redis-slave    ClusterIP      10.100.217.57    <none>                                    6379/TCP       7s

ELBのドメインを確認してアクセスすると、guestbookアプリが動いているのが確認できると思います!

まとめ

  • 「わりとゴツいやつ」から一歩進んで、Kubernetesを使った開発の具体的なイメージが掴めたのであれば幸いです?
  • ただ、我々はKubernetes沼に足を踏み入れたばかり
    • 今回紹介しきれなかった用語、エコシステムなどまだ膨大に…
  • 俺たちの真の戦いはこれからだ!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CloudWatch Logs Insightsで、存在するはずのLogGroupへのリクエストで Log group 'XXX' does not exist for account ID 'ZZZ' と返ってくる

tl;dr

公式ドキュメントの記述の通り、2018年11月5日以降にLogEventが発生したLogGroupしか検出できないようです。

抜粋:

CloudWatch Logs Insights では、2018 年 11 月 5 日以降に CloudWatch Logs に送信されたログデータを検索できます。

なんでこんな仕様なんだろう...?

完全に推測ですが、LogEventの作成時にDBの索引化の処理が走っているのではないでしょうか?
で、それが開始したのが2018年 11月 5日なのではないかと。
たしかに、もう2度と見られないログにまでindexを作成するのは、AWSからしたらコストが嵩んでたまったものじゃないと思われます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSを使ってみる②

インスタンス作成まで

AWSの勉強レポートです。
早速やっていきましょう。

AMIの選択

EC2を使用を推したら出てきました。
とりあえずリージョンは東京に変更します。
AMIを選択していきましょう。

aws_dlna_000003.JPG
わぁいたくさぁん!

aws_dlna_000005.JPG
よく聞くAmazon Linux AMIは今回は使わず、CentOS7の無料枠を使います。

インスタンスの詳細設定

aws_dlna_000008.JPG

早速知らない言葉がいくつか出てきました。
一個ずつ調べていきます。一言メモを残しますが、間違っている可能性大なので気付き次第、後日修正します。

  1. Auto Scaling グループ:インスタンスの負荷によってインスタンス数を自動的に増減してくれる機能
  2. VPC:仮想ネットワークのこと。VPCって単語AWS以外でも使うんかな?使わなそう
  3. プレイスメントグループ:同じAZにあるインスタンスを論理的にグループ化して通信をよくする。クラスタとかレプリケーションするときに使いそう。
  4. Amazon CloudWatch:AWSのサービスを監視できるらしい。
  5. テナンシー:多分テナントのこと。ベアメタルクラウドみたいに専用物理も用意できる。
  6. Amazon Elastic Inference:EC2とかのインスタンスにGPUをつけて高速化を図る。
  7. T2/T3 無制限:CPUクレジットの枯渇を心配する必要がなくなる。

というわけで
さっくりと設定してきました。
- VPC&Subnet:わかりやすいよう新規作成しました。
- PlacementGroup:インスタンスを増やすつもりはありませんが、念のため新規作成・追加しました。Spreadを選ぶとインスタンスを個別のハードウェアに分けてくれるんですって。
- 削除保護の有効化:当然有効

ストレージの追加

aws_dlna_000009.JPG
無料枠だと30GBまでのブロックストレージが使える模様。
30GB全部使っちゃいましょう。
折角なのでHDD暗号化もかけましょう。
EC2インスタンスの削除と同時にEBSを削除できるように合わせて削除もチェックしちゃいましょう。

タグの追加

タグはとりあえず名前だけでつけましょう。

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

OpenStackと同じ考えていいのかな?
とりあえずさっくり作りましょう。
aws_dlna_000012.JPG

とここでソースのプルダウンメニューの「マイIP」を選択すれば自分のグローバルIPを設定してくれました。
すごーくありがたいですね。

インスタンス作成の確認

aws_dlna_000013.JPG

無事無料枠に収め、インスタンスの作成を終えました。
キーペアを設定し、次回は起動から初期設定
AWSを使ってみる③へ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSを使ってみる①

今日から始めるAWS学習

今更ながらAWSを勉強してきます。
それのレポートを兼ねて書いていきます。

動機と勉強方法と目標

  • 動機:AWSの知識が必要だ!
  • 方法:とりあえず使ってみる
  • 目標:LAMP環境作ってアクセスできるところまで確認

使うもの

  • Linuxの知識(CentOS7)
  • AWSアカウント
  • クラウドの知識
  • やる気

AWSに関する知識

  • 5年ぐらい前にインスタンスを一個つくったっきり

次回から詳細書いていきます。
AWSを使ってみる②

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

〜AWS基礎〜 EC2にひとまずWebサーバー(Apache)を用意するまでのプロセス

この記事

ようやくまともな記事を書き始めます。
AWSアーキテクトに力を入れているshinonです。

本記事は、AWSブランクを埋めつつ色々作っていた物の一部を使って
VPC+EC2を使用した基本的なサーバー構築を始めたい人向けとなっています。

初めてだと
あれ?サブネットってどこ?
ルートテーブルって何を記載するの?
作成したのにEC2とネット繋がらない・・・

等のトラブルが発生することもあるので
そんな方の参考になれば幸いです。

故に、本記事はAWS初心者向けです。
冗長構成など考慮したパターン等はまた別途記事にします。

VPC

VPCの作成
AWSアカウントを作成するとデフォルトのVPCが存在します。
サブネットも2つ用意されているかと思いますが、
これだと自分で環境がいまいちわからないかもしれないので
今回はパパっと作成しちゃいます。

リージョンとVPC

VPCをどこのリージョンに作るのかを選びます。
バージニア(米国)やパリなど色々ありますが、
特別な用途はないので、構築/アクセスする拠点から遅延の少ない、自国エリア(東京リージョン)に作成します。

「東京リージョンにVPCを作成する」ということは、東京リージョンにある3つのデータセンター群の中に論理的に独立したネットワークを作成するということになります。
(DCは本当はもっとあると思いますが、とりあえず複数の群があって論理的には3つ)

これらのAZはそれぞれ物理的に離れて数キロ以上離れて存在するため、
例えば(適当な場所)東京リージョンでは立川AZ、川崎AZ、松戸AZみたいなイメージです。
(個人的に、東京リージョン=東京都内という意味ではとっていないし、むしろ都内だけならあまりばらけないはず)
スクリーンショット 2019-07-04 15.18.47.png
★超ざっくり!笑

で、VPCをアーキテクチャ図で表現するとこうなります。

AWS First.jpg
★この図の作成に関しては記事の一番下に記載しています!

上にインターネットがあり、AWSCloud全体がまず存在。
その中の東京リージョンがあり、今回はこのリージョン内にVPCを作成。
そして東京リージョンはAZ(DC群)が3つあるためこういった記載となりました。

サブネットの活用

EC2等のリソースは、サブネットといわれる、VPCをさらに分割したNW内に作成するイメージです。
サブネットの主な用途は
・Webサーバーを配置するパブリックサブネット、DB等VPC内のリソースからのみアクセスするプライベートサブネットに分けたトラフィックの制御
・耐障害性を考慮した設計にするため、2つのAZを使った冗長化構成(LBなど)
などの使い方が挙げられます。

AWS Second.jpg
そのため、例えば先ほどの「耐障害性を考慮した設計にするため、2つのAZを使った冗長化構成」の際は、 AZを複数使い、別サブネットを用意します。
★この辺の作成例はまた今度書きます

VPC作成手順

VPCはAWSのサービスですが、VPC(プライベートクラウド)の中にリソースを作るため、勿論IPの指定が必要です。

始めに、VPCに割り当てるローカルIPの範囲を指定します。
AWS VPCで使用可能な範囲は以下の通り。
・10.0.0.0 - 10.255.255.255 (10/8 プレフィックス)
・172.16.0.0 - 172.31.255.255 (172.16/12 プレフィックス)
・192.168.0.0 - 192.168.255.255 (192.168/16 プレフィックス)
VPC とサブネットのサイズ設定 - AWS VPC ユーザーガイド > VPCとサブネット

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Subnets.html

アカウントは作成されていますか?
最低限MFAは有効にしましょうね。。

IAMユーザはVPC、EC2の作成ができるユーザあるいはロールで行います。
では、AWSマネジメントコンソールを開きます。

上部「サービス」一覧内からVPCを選択すると、こんな画面になるかと思います。
VPCselect.png

この画面はVPC一覧で、選択したVPCの情報が下に出力されます。
vpc_createde.png
「VPCの作成」から始めましょう。
ここでは、VPCに以下のIP範囲を割り当てます。
10.0.0.0/16

IPv6やテナンシー需要ないのでそのままで問題ないです。
ちなみにテナンシーはハードウェア専有という贅沢なやつです。

作成を押したらVPCが出来上がりました
vpc_p.png

VPC一覧に戻ると新たに出来上がっているのが確認できます。
vpc_check.png

サブネット作成手順

次に、サブネットの作成を行います。

先ほどと同様、VPCの画面、左のタブ内に「サブネット」があるので
こんな画面が開かれるのを確認してください。
subnet.png

「サブネットの作成」から始めます。
今回はEC2を1つ置ければよいので以下のようなIP範囲で適当に設定します。
10.0.1.0/24

先ほどのVPC内に作成するため、IP範囲に注意。 ※ここでおかしいIP入れるとちゃんとエラー表示されます。

また、AZの選択肢が1つしかないのでお察しかと思いますが、
注意点として、サブネットはAZを2つ跨いだりすることができません。

subnet_namingcreate.png

では、作成します。
subnet_ed.png

現在こんな状態ですねー
名称未設定ファイルのコピー.jpg
★PublicSubnetとありますが、実際はまだインターネットとつながっていません。

Security Group作成

次に、EC2のためのファイアウォールを設定します。
SGは、EC2インスタンスに割り当てる仮想ファイアウォールです。
オンプレミスでは直接OS上のfirewalldなどで設定していたと思いますが、AWSでは基本的にはSGで管理します。
もちろん実際のところすべてのセキュリティをSGのみで全てカバーしているわけではないですが。その辺の話は追々別記事にて。

今回インターネットからEC2へのアクセスは、SSHアクセス、Webアクセスが最低限必要なので
ポート22,80,443(一応)を開けます。
開ける相手は今は自己IPのみ指定しましょう。(確認せずともワンボタンで可)

SG設定手順

SGはサービス「EC2」内、左タブにあります。こんな画面。

SG1.png

設定内容は以下のようになります。
ソースが送信元なので、マイIPを選択すると現在のIPが指定されます。
使用するVPCを指定しましょう。 ※説明欄もわかりやすいものを記載しましょう。
SGcreate.png

「作成」で完了。

入ってきた通信の、帰りの制御はどうするの?という疑問があるかもしれませんが、SGはステートフルです。

VPC のセキュリティグループ - AWSドキュメント
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_SecurityGroups.html

セキュリティグループはステートフルです。インスタンスからリクエストを送信する場合、そのリクエストのレスポンストラフィックは、インバウンドセキュリティグループルールにかかわらず、流れることができます。許可されたインバウンドトラフィックに対する応答(戻りのトラフィック)は、アウトバウンドルールにかかわらずアウト側に対し通過することができます。

※逆に、ステートレスでの通信制御要件がある場合は、ネットワークACLという別の設定を併用します。

ちなみにここまででこんな感じです。
名称未設定ファイルのコピー (1).jpg

線がいっぱいあってわかりずらいよー
という声もあるかもしれませんが、アーキテクチャ図は基本必要最低限の物を表記すればいいので、
今回みたいにTokyo Regionの線をわざわざ書いたりする必要もあまりないと思います。

え?図が見づらい?
それは作者のセンスですね

ネットワークと繋げるために

ではどうやって、これから作成するEC2からインターネットに繋げられるようにするのか。
気を付けるのは以下の点です。(初めての際に混乱しやすい)

①インターネットゲートウェイ(IGW) = VPCをインターネットと繋げるため。

リソースの作成
・IGWを作成する。

リソースのアタッチ
・IGWはVPCにアタッチする。
これで、VPC自体は仮想ルーターによりインターネットと接続可能となる

②ルートテーブル = サブネットをインターネットと繋げるため。

リソースの作成
・ルートテーブルの作成する。
リソースのアタッチ
・サブネットのルーティング設定変更をする。
これでVPC内の、ルーティングしたサブネット内のリソースはインターネットへ接続可能となる

③VPCで名前解決できるようにする

設定変更のみ

④サブネット内リソースへのIPv4割り当て設定

設定変更のみ

大丈夫です、そんな時間かかりません。

①インターネットゲートウェイ

先ほど記載した通り、デフォルトではインターネット外に出られないため、インターネットゲートウェイ(IGW)を作成します。

IGW作成

サービス「VPC」内の左タブに「インターネットゲートウェイ」があります。
igw.png
「インターネットゲートウェイの作成」から作成。
FireShot Capture 011 - インターネットゲートウェイの作成 - VPC Management Console_ - ap-northeast-1.console.aws.amazon.com.png
名前つけて終わり。
IGW-createed.png
確認します。
igw_b.png

VPCにIGWをアタッチ

その画面から、作成したIGWを選択した状態で、「アクション」から「VPCにアタッチ」を選択。
igw_attach.png

先ほどのVPCを選び、「アタッチ」で完了。

「状態」がattachedに変わり、
「アタッチ済みVPC ID」の箇所にアタッチ先のVPCがあることを確認。
igw_attached.png

これでVPC自体はインターネットに接続済。
名称未設定ファイルのコピー (2).jpg

②ルートテーブル

サブネットにルート設定します。
AWSの場合、基本的にルーティングはOS上で行うことなくAWSマネジメントコンソールやCLIで以下のように行うことが多いかと思います。

ルートテーブル作成

サービス「VPC」から、同じ要領でルートテーブルを開きます。FireShot Capture 046 - 自動割り当て IP 設定の変更 - VPC Management Console_ - ap-northeast-1.console.aws.amazon.com.png

rtb.png
「ルートテーブルを作成」から、VPCを選択して名前指定。
rtb_create.png
「作成」で終わり。
rtb_created.png

ルーティング設定

どんどん行きましょう。
作成したルートテーブルを選択して「ルート」タブを選択するとこんな画面が。
rtb_set1.png
ここではまず、すべての通信をIGWを通すという大前提を記載します。
「ルートの編集」で設定をします。

送信先:0.0.0.0/0(すべて)
ターゲット(宛先):先程作成したIGW ※作成済みのIGWを選択できます。
rtb_set1_.png
「ルートの保存」をしましょう。
rtb_set1_chk.png
出来ていますね。

次に、「サブネットの関連付け」をします。
タブを開くと、こんな感じの画面になっているので「サブネットの関連付けの編集」を選択。
rtb_sb.png
先程のサブネットを選択して「保存」です。
rtb_sb1.png
確認しましょう。
rtb_subck.png
関連付けが出来ているので、あとはちょっとした設定のみです。

③VPCで名前解決できるようにする

VPC一覧画面から、
VPCを選択した状態で、「DNSホスト名の編集」を選択します。
vpc_nameset.png
有効化にチェックを入れて保存をします。
vpe_named.png

これは、アクセスする際にIPアドレス以外に
ec2-{public-ipv4-address}.compute-1.amazonaws.comのようなアドレスが使用可能となります。

④自動割り当てIP設定の変更

サブネット内で起動されるリソースにIPv4アドレスが割り当てられるように設定変更します。
作成したサブネットを選択して、「アクション」を選択して…
subnet_throuth.png
「自動割り当てIP設定の変更」を選択。

FireShot Capture 046 - 自動割り当て IP 設定の変更 - VPC Management Console_ - ap-northeast-1.console.aws.amazon.com.png

チェックを入れて保存しましょう。
これで、EC2を構築するための最低限のネットワークリソースはできました。

EC2インスタンスの作成

いよいよEC2を作成します。
作成した際のイメージはこうなります。
名称未設定ファイルのコピー (3).jpg
難しいことは考えず、必要最低限の考慮はしていきましょう。

ここから具体的に料金が絡むのでそちらも触れながら。

では、サービス「EC2」を開いて、「インスタンス」を選択します。
ec2_dash.png
「インスタンスを作成」を選択。
FireShot Capture 032 - インスタンスウィザードを起動 - EC2 Management Console_ - ap-northeast-1.console.aws.amazon.com.png
AMIを選ぶ画面です。
AmazonLinux、RHEL、CentOS、WindowsServerなどなど色々ありますが
今回はAmazonLinux2を選びます。
Amazonが用意したCentOSベースのOSです。

次にインスタンスタイプを選びます。
FireShot Capture 051 - インスタンスウィザードを起動 - EC2 Management Console_ - ap-northeast-1.console.aws.amazon.com.png
これはAmazonが用意したスペックのテンプレートの様なものですね。(見ての通りのスペック群)
それぞれ料金が大きく変わるので、こちらを参照してください。

Amazon EC2 料金表
https://aws.amazon.com/jp/ec2/pricing/on-demand/

尚、今回はデフォルトで選択されている「t2.micro」をオンデマンドで使用しますが、
時間あたりの料金は無料利用枠なしだと0.0152USD=¥1.64です。(2019/7/11 ¥108/$)
無料利用枠に関してはこちらを参照くださいー

AWS 無料利用枠
https://aws.amazon.com/jp/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc

動作確認程度なので先程のインスタンスタイプでいきますね。

次に、詳細設定ですが、今回最低限変更が必要なのは以下の3つ。
ネットワーク:作成したVPCを選択します。 ※VPCを東京リージョンに作成したなら東京リージョンでEC2を作成しましょう。
サブネット:作成したサブネットを選択します。
自動割り当てパブリックIP:インターネット経由でアクセスが必要なので有効にしましょう。

以下は、参考程度にライトな説明です。
起動インスタンス:同じものを同時にいくつ作るか
購入のオプション:切れるの面倒なのでスポットインスタンスにはしない? ※調べましょう
シャットダウン動作:インスタンスを停止したら消える昨日はいらないので、「停止可能」にする
削除保護の有効化:間違ってGUIで消しちゃった、は怖いので、インスタンスを消す際はワンプロセス挟む様に設定出来ます。
モニタリング:デフォルトの5分で今回は問題ないのでそのまま(CloudWatchを見てみよう!)
テナンシー:以前記載しましたが、ハードウェア占有の話です。

ec2_create1.png
ec2_create2.png

次に、ストレージ(EBS)の設定です。
デフォルトの設定値でもんんだいないのでそのまま進みます。
SSDがデフォルト。プロビジョンドにするほどの用途は無いです。
ec2_create3.png

EC2にタグをつけます。
「Name」というキーに「ec2-div-1」と値をつけておきました。
例えばEC2一覧の画面で一意にわかるといいですよね。
FireShot Capture 038 - インスタンスウィザードを起動 - EC2 Management Console_ - ap-northeast-1.console.aws.amazon.com.png

次にSGです。先程作成したSGを選びましょう。
ec2_create4.png

今までの設定の確認をします。
ec2_create5.png
「起動」を選択すると、最後にキーペアの選択(作成)画面となります。
既存だとこの画面ですが、新しく作成するキーペアの名前を決めて、必ずダウンロードしましょう。
注意書きにもありますが、キーペアがないとSSHアクセスも出来ません。
スクリーンショット 2019-07-11 16.48.33.png

これでEC2作成完了。
ec2-created.png
EC2一覧で確認ができます。
(instanceIDを画面から選択した場合)
ec2_chk.png

始めは「インスタンスの状態」が黄色だったりもしますが、「running」に変わり
「ステータスチェック」の初期化〜が完了すればSSHでアクセスしてOKです。

SSHする際やWebアクセスする際は

ec2-comp.png
「パブリックDNS(IPv4)」を使用します。

インスタンスにSSHアクセス

キーペアの権限

Macユーザの方やLinuxの方は、ターミナルから先程ダウンロードしたキーペアの権限を
sudo chmod 400 {キーペアファイル}
などで変更しましょう。

SSHアクセス

Windowsの場合はteratermがシンプルで使いやすいのでオススメです。
ユーザネームをec2-userに指定、キーペアを指定してアクセスすれば問題ありません。
尚、Amazon Linux系はデフォルトですべてこのユーザネームの指定が必要です。

初アクセスの際は、デフォルトのユーザec2-userにより、公開鍵認証します。
一応ですが、SSHはこんな感じのコマンドでどうぞ
ssh -i {キーペア指定} ec2-user@ec2-{ipv4}.ap-northeast-1.compute.amazonaws.com

アクセス時にこんなメッセージが出ればOKです。
```

   __|  __|_  )
   _|  (     /   Amazon Linux 2 AMI
  ___|\___|___|
https://aws.amazon.com/amazon-linux-2/
No packages needed for security; 6 packages available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-1-11 ~]$ 

まずはソフトウェアパッケージのアップデートをします。
[ec2-user ~]$ sudo yum update -y

Webサーバー入れてみてテスト

Apache入れて、公開できたか確認してみましょう。

Apache入れます。
sudo yum install -y httpd

Apache起動させます。
sudo systemctl start httpd

Apache起動確認して、active(running)であることを確認します。
sudo systemctl start httpd

ブラウザで、先程SSHアクセスでも使用した「ec2-{ipv4}.ap-northeast-1.compute.amazonaws.com」にアクセスしてみます。
apache.png
無事確認ができたら、完了です!お疲れさまでした。

補足:アーキテクチャ図

今回登場したコイツですが、draw.ioという無料で使える図作成ルールを使いました。
実は、AWS公式サイトでも記載していますが、新しいアイコンたちも配布されています。
(下の方にdraw.ioが!)
https://aws.amazon.com/jp/architecture/icons/
↓2018以降のバージョンはこちら
https://about.draw.io/new-aws-icons-2018/
知らなかった!という方がいらっしゃれば、よかったら使ってみてくださいー

まとめ

以上がVPC作成〜EC2のWebサーバー疎通確認までとなります。

振り返りながら作成したので、わかりづらい点、これは違うよがあったらぜひご教示ください。。m(_ _)m
ちょいちょい修正します。

今後また、よくあるAWS構成の作成や、〇〇やってみたぜ!をアップしていきます。
よろしくお願いします!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Everyday Rails 6章】AWS Cloud9でヘッドレスドライバ使用時のエラー対処

Cloud9だとChromeエラーで詰まったので、PhantomJSを使うことにした

『Everyday Rails -RSpecによるRailsテスト入門』の第6章「フィーチャスペックで UI をテストする」をAWSのCloud9を使って進めていたところ、「JavaScript を使った操作をテストする」付近からChrome周りのエラーが出てしまいテストが通らなくなった。

エラー内容としては以下の記事のものを一通り確認。
AWS Cloud9でCapybara+Selenium+Chrome設定時のエラーとその対処法について[ Everyday Rails 6章 ]

上記の対応を試すが、通らない。。。

書籍を読み進めたら「Chrome使えなかったらPhantomJS使ってね」との記述があったので、その通りに追加。

Gemfile
group :test do
  gem 'capybara', '~> 2.15.4'
  gem 'poltergeist', '~> 1.15.0'
  gem 'launchy', '~> 2.4.3'
end
spec/support/capybara.rb
require 'capybara/poltergeist'
Capybara.javascript_driver = :poltergeist

実行するとエラー。

Cliver::Dependency::NotFound:
Could not find an executable ["phantomjs"] on your path.

そもそもCloud9にPhantomjsをインストールする必要があった。。。

結論、以下の記事でインストールできました

Install PhantomJS on Amazon Linux
インストール手順
PhantomJSをインストールする(Amazon Linux)
上の記事を日本語で説明してくださっている記事がありました!

実際のターミナル

$ sudo yum install fontconfig freetype freetype-devel fontconfig-devel libstdc++
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main                                                                            | 2.1 kB  00:00:00     
amzn-updates                                                                         | 2.5 kB  00:00:00     
1063 packages excluded due to repository priority protections
Package fontconfig-2.8.0-5.8.amzn1.x86_64 already installed and latest version
Package freetype-2.3.11-15.14.amzn1.x86_64 already installed and latest version
Package libstdc++48-4.8.5-28.142.amzn1.x86_64 already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package fontconfig-devel.x86_64 0:2.8.0-5.8.amzn1 will be installed
---> Package freetype-devel.x86_64 0:2.3.11-15.14.amzn1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

============================================================================================================
 Package                      Arch               Version                        Repository             Size
============================================================================================================
Installing:
 fontconfig-devel             x86_64             2.8.0-5.8.amzn1                amzn-main             210 k
 freetype-devel               x86_64             2.3.11-15.14.amzn1             amzn-main             411 k

Transaction Summary
============================================================================================================
Install  2 Packages

Total download size: 621 k
Installed size: 3.0 M
Is this ok [y/d/N]: y
Downloading packages:
(1/2): fontconfig-devel-2.8.0-5.8.amzn1.x86_64.rpm                                   | 210 kB  00:00:00     
(2/2): freetype-devel-2.3.11-15.14.amzn1.x86_64.rpm                                  | 411 kB  00:00:00     
------------------------------------------------------------------------------------------------------------
Total                                                                       1.1 MB/s | 621 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : freetype-devel-2.3.11-15.14.amzn1.x86_64                                                 1/2 
  Installing : fontconfig-devel-2.8.0-5.8.amzn1.x86_64                                                  2/2 
  Verifying  : fontconfig-devel-2.8.0-5.8.amzn1.x86_64                                                  1/2 
  Verifying  : freetype-devel-2.3.11-15.14.amzn1.x86_64                                                 2/2 

Installed:
  fontconfig-devel.x86_64 0:2.8.0-5.8.amzn1            freetype-devel.x86_64 0:2.3.11-15.14.amzn1           

Complete!
$ wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2
--2019-07-11 06:53:28--  https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2
Resolving bitbucket.org (bitbucket.org)... 18.205.93.2, 18.205.93.0, 18.205.93.1, ...
Connecting to bitbucket.org (bitbucket.org)|18.205.93.2|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://bbuseruploads.s3.amazonaws.com/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2?Signature=1RMK0UmboxwRxkZ2nr12vRCWvQU%3D&Expires=1562829028&AWSAccessKeyId=AKIAIQWXW6WLXMB5QZAQ&versionId=null&response-content-disposition=attachment%3B%20filename%3D%22phantomjs-1.9.8-linux-x86_64.tar.bz2%22 [following]
--2019-07-11 06:53:28--  https://bbuseruploads.s3.amazonaws.com/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2?Signature=1RMK0UmboxwRxkZ2nr12vRCWvQU%3D&Expires=1562829028&AWSAccessKeyId=AKIAIQWXW6WLXMB5QZAQ&versionId=null&response-content-disposition=attachment%3B%20filename%3D%22phantomjs-1.9.8-linux-x86_64.tar.bz2%22
Resolving bbuseruploads.s3.amazonaws.com (bbuseruploads.s3.amazonaws.com)... 52.216.82.32
Connecting to bbuseruploads.s3.amazonaws.com (bbuseruploads.s3.amazonaws.com)|52.216.82.32|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 13163325 (13M) [application/x-tar]
Saving to: ‘phantomjs-1.9.8-linux-x86_64.tar.bz2’

phantomjs-1.9.8-linux-x86_ 100%[========================================>]  12.55M  55.2MB/s    in 0.2s    

2019-07-11 06:53:28 (55.2 MB/s) - ‘phantomjs-1.9.8-linux-x86_64.tar.bz2’ saved [13163325/13163325]
$ sudo mkdir -p /opt/phantomjs
$ bzip2 -d phantomjs-1.9.8-linux-x86_64.tar.bz2
$ sudo tar -xvf phantomjs-1.9.8-linux-x86_64.tar --directory /opt/phantomjs/ --strip-components 1
phantomjs-1.9.8-linux-x86_64/bin/
phantomjs-1.9.8-linux-x86_64/bin/phantomjs
phantomjs-1.9.8-linux-x86_64/examples/
phantomjs-1.9.8-linux-x86_64/examples/scandir.js
phantomjs-1.9.8-linux-x86_64/examples/technews.coffee
phantomjs-1.9.8-linux-x86_64/examples/tweets.js
phantomjs-1.9.8-linux-x86_64/examples/rasterize.coffee
phantomjs-1.9.8-linux-x86_64/examples/pagecallback.js
phantomjs-1.9.8-linux-x86_64/examples/printheaderfooter.js
phantomjs-1.9.8-linux-x86_64/examples/follow.js
phantomjs-1.9.8-linux-x86_64/examples/run-jasmine.coffee
phantomjs-1.9.8-linux-x86_64/examples/module.js
phantomjs-1.9.8-linux-x86_64/examples/waitfor.coffee
phantomjs-1.9.8-linux-x86_64/examples/stdin-stdout-stderr.coffee
phantomjs-1.9.8-linux-x86_64/examples/pizza.js
phantomjs-1.9.8-linux-x86_64/examples/seasonfood.coffee
phantomjs-1.9.8-linux-x86_64/examples/unrandomize.js
phantomjs-1.9.8-linux-x86_64/examples/modernizr.js
phantomjs-1.9.8-linux-x86_64/examples/waitfor.js
phantomjs-1.9.8-linux-x86_64/examples/direction.js
phantomjs-1.9.8-linux-x86_64/examples/arguments.coffee
phantomjs-1.9.8-linux-x86_64/examples/render_multi_url.js
phantomjs-1.9.8-linux-x86_64/examples/run-qunit.js
phantomjs-1.9.8-linux-x86_64/examples/printheaderfooter.coffee
phantomjs-1.9.8-linux-x86_64/examples/ipgeocode.js
phantomjs-1.9.8-linux-x86_64/examples/ipgeocode.coffee
phantomjs-1.9.8-linux-x86_64/examples/version.js
phantomjs-1.9.8-linux-x86_64/examples/movies.js
phantomjs-1.9.8-linux-x86_64/examples/child_process-examples.js
phantomjs-1.9.8-linux-x86_64/examples/loadurlwithoutcss.coffee
phantomjs-1.9.8-linux-x86_64/examples/version.coffee
phantomjs-1.9.8-linux-x86_64/examples/seasonfood.js
phantomjs-1.9.8-linux-x86_64/examples/server.js
phantomjs-1.9.8-linux-x86_64/examples/countdown.js
phantomjs-1.9.8-linux-x86_64/examples/rasterize.js
phantomjs-1.9.8-linux-x86_64/examples/injectme.js
phantomjs-1.9.8-linux-x86_64/examples/run-jasmine.js
phantomjs-1.9.8-linux-x86_64/examples/post.js
phantomjs-1.9.8-linux-x86_64/examples/imagebin.coffee
phantomjs-1.9.8-linux-x86_64/examples/pizza.coffee
phantomjs-1.9.8-linux-x86_64/examples/hello.coffee
phantomjs-1.9.8-linux-x86_64/examples/features.js
phantomjs-1.9.8-linux-x86_64/examples/movies.coffee
phantomjs-1.9.8-linux-x86_64/examples/tweets.coffee
phantomjs-1.9.8-linux-x86_64/examples/injectme.coffee
phantomjs-1.9.8-linux-x86_64/examples/features.coffee
phantomjs-1.9.8-linux-x86_64/examples/colorwheel.coffee
phantomjs-1.9.8-linux-x86_64/examples/walk_through_frames.js
phantomjs-1.9.8-linux-x86_64/examples/printmargins.coffee
phantomjs-1.9.8-linux-x86_64/examples/printmargins.js
phantomjs-1.9.8-linux-x86_64/examples/scandir.coffee
phantomjs-1.9.8-linux-x86_64/examples/loadspeed.coffee
phantomjs-1.9.8-linux-x86_64/examples/printenv.js
phantomjs-1.9.8-linux-x86_64/examples/serverkeepalive.coffee
phantomjs-1.9.8-linux-x86_64/examples/fibo.coffee
phantomjs-1.9.8-linux-x86_64/examples/echoToFile.coffee
phantomjs-1.9.8-linux-x86_64/examples/netlog.js
phantomjs-1.9.8-linux-x86_64/examples/useragent.coffee
phantomjs-1.9.8-linux-x86_64/examples/child_process-examples.coffee
phantomjs-1.9.8-linux-x86_64/examples/weather.coffee
phantomjs-1.9.8-linux-x86_64/examples/direction.coffee
phantomjs-1.9.8-linux-x86_64/examples/module.coffee
phantomjs-1.9.8-linux-x86_64/examples/printenv.coffee
phantomjs-1.9.8-linux-x86_64/examples/simpleserver.js
phantomjs-1.9.8-linux-x86_64/examples/fibo.js
phantomjs-1.9.8-linux-x86_64/examples/imagebin.js
phantomjs-1.9.8-linux-x86_64/examples/colorwheel.js
phantomjs-1.9.8-linux-x86_64/examples/technews.js
phantomjs-1.9.8-linux-x86_64/examples/hello.js
phantomjs-1.9.8-linux-x86_64/examples/echoToFile.js
phantomjs-1.9.8-linux-x86_64/examples/postserver.coffee
phantomjs-1.9.8-linux-x86_64/examples/page_events.coffee
phantomjs-1.9.8-linux-x86_64/examples/postserver.js
phantomjs-1.9.8-linux-x86_64/examples/weather.js
phantomjs-1.9.8-linux-x86_64/examples/countdown.coffee
phantomjs-1.9.8-linux-x86_64/examples/netsniff.coffee
phantomjs-1.9.8-linux-x86_64/examples/detectsniff.js
phantomjs-1.9.8-linux-x86_64/examples/render_multi_url.coffee
phantomjs-1.9.8-linux-x86_64/examples/useragent.js
phantomjs-1.9.8-linux-x86_64/examples/walk_through_frames.coffee
phantomjs-1.9.8-linux-x86_64/examples/post.coffee
phantomjs-1.9.8-linux-x86_64/examples/arguments.js
phantomjs-1.9.8-linux-x86_64/examples/simpleserver.coffee
phantomjs-1.9.8-linux-x86_64/examples/run-qunit.coffee
phantomjs-1.9.8-linux-x86_64/examples/outputEncoding.coffee
phantomjs-1.9.8-linux-x86_64/examples/phantomwebintro.js
phantomjs-1.9.8-linux-x86_64/examples/follow.coffee
phantomjs-1.9.8-linux-x86_64/examples/loadspeed.js
phantomjs-1.9.8-linux-x86_64/examples/page_events.js
phantomjs-1.9.8-linux-x86_64/examples/loadurlwithoutcss.js
phantomjs-1.9.8-linux-x86_64/examples/sleepsort.js
phantomjs-1.9.8-linux-x86_64/examples/sleepsort.coffee
phantomjs-1.9.8-linux-x86_64/examples/netlog.coffee
phantomjs-1.9.8-linux-x86_64/examples/outputEncoding.js
phantomjs-1.9.8-linux-x86_64/examples/serverkeepalive.js
phantomjs-1.9.8-linux-x86_64/examples/phantomwebintro.coffee
phantomjs-1.9.8-linux-x86_64/examples/server.coffee
phantomjs-1.9.8-linux-x86_64/examples/universe.js
phantomjs-1.9.8-linux-x86_64/examples/pagecallback.coffee
phantomjs-1.9.8-linux-x86_64/examples/stdin-stdout-stderr.js
phantomjs-1.9.8-linux-x86_64/examples/detectsniff.coffee
phantomjs-1.9.8-linux-x86_64/examples/unrandomize.coffee
phantomjs-1.9.8-linux-x86_64/examples/netsniff.js
phantomjs-1.9.8-linux-x86_64/ChangeLog
phantomjs-1.9.8-linux-x86_64/README.md
phantomjs-1.9.8-linux-x86_64/LICENSE.BSD
phantomjs-1.9.8-linux-x86_64/third-party.txt
$  sudo ln -s /opt/phantomjs/bin/phantomjs /usr/bin/phantomjs

いざテスト実行

:tada: 成功! :tada:

tasks_spec.rbの実行
$ bin/rspec spec/features/tasks_spec.rb
Running via Spring preloader in process 20323
/home/ec2-user/.rvm/gems/ruby-2.6.3/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract_adapter.rb:81: warning: deprecated Object#=~ is called on Integer; it always returns nil

Tasks
You're running an old version of PhantomJS, update to >= 2.1.1 for a better experience.
  user toggles a task

Finished in 1.99 seconds (files took 0.30678 seconds to load)
1 example, 0 failures
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Everyday Rails 6章 JavaScriptテスト】AWS Cloud9でChromeエラーが出たときの対処法

追記(2019/07/12)

【2019年7月版・動画付き】Cloud9上でEveryday Railsのjs: true付きのフィーチャスペックを実行する手順

以下の記事を投稿した翌日、翻訳者の伊藤さんより超迅速に対処方法の記事が公開されました!!
ありがとうございます:sob:

はじめに

『Everyday Rails -RSpecによるRailsテスト入門』の第6章「フィーチャスペックで UI をテストする」をCloud9を使って進めていたところ、「JavaScript を使った操作をテストする」付近からChrome周りのエラーが出てしまいテストが通らなくなった。

実行環境

  • Amazon Linux AMI release 2018.03
  • Ruby 2.6.3
  • Chrome 75

エラー内容としては以下の記事のものを一通り確認。
AWS Cloud9でCapybara+Selenium+Chrome設定時のエラーとその対処法について[ Everyday Rails 6章 ]

上記の対応を試すが、通らない。。。

PhantomJSを使うことにした

書籍を読み進めたら「Chrome使えなかったらPhantomJS使ってね」との記述があったので、その通りに追加。

Gemfile
group :test do
  gem 'capybara', '~> 2.15.4'
  gem 'poltergeist', '~> 1.15.0'
  gem 'launchy', '~> 2.4.3'
end
spec/support/capybara.rb
require 'capybara/poltergeist'
Capybara.javascript_driver = :poltergeist

実行するとエラー。

Cliver::Dependency::NotFound:
Could not find an executable ["phantomjs"] on your path.

そもそもCloud9にPhantomjsをインストールする必要があった。。。

結論、以下の記事でインストールできました

Install PhantomJS on Amazon Linux
インストール手順
PhantomJSをインストールする(Amazon Linux)
上の記事を日本語で説明してくださっている記事がありました!

実際のターミナル

$ sudo yum install fontconfig freetype freetype-devel fontconfig-devel libstdc++
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main                                                                            | 2.1 kB  00:00:00     
amzn-updates                                                                         | 2.5 kB  00:00:00     
1063 packages excluded due to repository priority protections
Package fontconfig-2.8.0-5.8.amzn1.x86_64 already installed and latest version
Package freetype-2.3.11-15.14.amzn1.x86_64 already installed and latest version
Package libstdc++48-4.8.5-28.142.amzn1.x86_64 already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package fontconfig-devel.x86_64 0:2.8.0-5.8.amzn1 will be installed
---> Package freetype-devel.x86_64 0:2.3.11-15.14.amzn1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

============================================================================================================
 Package                      Arch               Version                        Repository             Size
============================================================================================================
Installing:
 fontconfig-devel             x86_64             2.8.0-5.8.amzn1                amzn-main             210 k
 freetype-devel               x86_64             2.3.11-15.14.amzn1             amzn-main             411 k

Transaction Summary
============================================================================================================
Install  2 Packages

Total download size: 621 k
Installed size: 3.0 M
Is this ok [y/d/N]: y
Downloading packages:
(1/2): fontconfig-devel-2.8.0-5.8.amzn1.x86_64.rpm                                   | 210 kB  00:00:00     
(2/2): freetype-devel-2.3.11-15.14.amzn1.x86_64.rpm                                  | 411 kB  00:00:00     
------------------------------------------------------------------------------------------------------------
Total                                                                       1.1 MB/s | 621 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : freetype-devel-2.3.11-15.14.amzn1.x86_64                                                 1/2 
  Installing : fontconfig-devel-2.8.0-5.8.amzn1.x86_64                                                  2/2 
  Verifying  : fontconfig-devel-2.8.0-5.8.amzn1.x86_64                                                  1/2 
  Verifying  : freetype-devel-2.3.11-15.14.amzn1.x86_64                                                 2/2 

Installed:
  fontconfig-devel.x86_64 0:2.8.0-5.8.amzn1            freetype-devel.x86_64 0:2.3.11-15.14.amzn1           

Complete!
$ wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2
--2019-07-11 06:53:28--  https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2
Resolving bitbucket.org (bitbucket.org)... 18.205.93.2, 18.205.93.0, 18.205.93.1, ...
Connecting to bitbucket.org (bitbucket.org)|18.205.93.2|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://bbuseruploads.s3.amazonaws.com/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2?Signature=1RMK0UmboxwRxkZ2nr12vRCWvQU%3D&Expires=1562829028&AWSAccessKeyId=AKIAIQWXW6WLXMB5QZAQ&versionId=null&response-content-disposition=attachment%3B%20filename%3D%22phantomjs-1.9.8-linux-x86_64.tar.bz2%22 [following]
--2019-07-11 06:53:28--  https://bbuseruploads.s3.amazonaws.com/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2?Signature=1RMK0UmboxwRxkZ2nr12vRCWvQU%3D&Expires=1562829028&AWSAccessKeyId=AKIAIQWXW6WLXMB5QZAQ&versionId=null&response-content-disposition=attachment%3B%20filename%3D%22phantomjs-1.9.8-linux-x86_64.tar.bz2%22
Resolving bbuseruploads.s3.amazonaws.com (bbuseruploads.s3.amazonaws.com)... 52.216.82.32
Connecting to bbuseruploads.s3.amazonaws.com (bbuseruploads.s3.amazonaws.com)|52.216.82.32|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 13163325 (13M) [application/x-tar]
Saving to: ‘phantomjs-1.9.8-linux-x86_64.tar.bz2’

phantomjs-1.9.8-linux-x86_ 100%[========================================>]  12.55M  55.2MB/s    in 0.2s    

2019-07-11 06:53:28 (55.2 MB/s) - ‘phantomjs-1.9.8-linux-x86_64.tar.bz2’ saved [13163325/13163325]
$ sudo mkdir -p /opt/phantomjs
$ bzip2 -d phantomjs-1.9.8-linux-x86_64.tar.bz2
$ sudo tar -xvf phantomjs-1.9.8-linux-x86_64.tar --directory /opt/phantomjs/ --strip-components 1
phantomjs-1.9.8-linux-x86_64/bin/
phantomjs-1.9.8-linux-x86_64/bin/phantomjs
phantomjs-1.9.8-linux-x86_64/examples/
phantomjs-1.9.8-linux-x86_64/examples/scandir.js
phantomjs-1.9.8-linux-x86_64/examples/technews.coffee
phantomjs-1.9.8-linux-x86_64/examples/tweets.js
phantomjs-1.9.8-linux-x86_64/examples/rasterize.coffee
phantomjs-1.9.8-linux-x86_64/examples/pagecallback.js
phantomjs-1.9.8-linux-x86_64/examples/printheaderfooter.js
phantomjs-1.9.8-linux-x86_64/examples/follow.js
phantomjs-1.9.8-linux-x86_64/examples/run-jasmine.coffee
phantomjs-1.9.8-linux-x86_64/examples/module.js
phantomjs-1.9.8-linux-x86_64/examples/waitfor.coffee
phantomjs-1.9.8-linux-x86_64/examples/stdin-stdout-stderr.coffee
phantomjs-1.9.8-linux-x86_64/examples/pizza.js
phantomjs-1.9.8-linux-x86_64/examples/seasonfood.coffee
phantomjs-1.9.8-linux-x86_64/examples/unrandomize.js
phantomjs-1.9.8-linux-x86_64/examples/modernizr.js
phantomjs-1.9.8-linux-x86_64/examples/waitfor.js
phantomjs-1.9.8-linux-x86_64/examples/direction.js
phantomjs-1.9.8-linux-x86_64/examples/arguments.coffee
phantomjs-1.9.8-linux-x86_64/examples/render_multi_url.js
phantomjs-1.9.8-linux-x86_64/examples/run-qunit.js
phantomjs-1.9.8-linux-x86_64/examples/printheaderfooter.coffee
phantomjs-1.9.8-linux-x86_64/examples/ipgeocode.js
phantomjs-1.9.8-linux-x86_64/examples/ipgeocode.coffee
phantomjs-1.9.8-linux-x86_64/examples/version.js
phantomjs-1.9.8-linux-x86_64/examples/movies.js
phantomjs-1.9.8-linux-x86_64/examples/child_process-examples.js
phantomjs-1.9.8-linux-x86_64/examples/loadurlwithoutcss.coffee
phantomjs-1.9.8-linux-x86_64/examples/version.coffee
phantomjs-1.9.8-linux-x86_64/examples/seasonfood.js
phantomjs-1.9.8-linux-x86_64/examples/server.js
phantomjs-1.9.8-linux-x86_64/examples/countdown.js
phantomjs-1.9.8-linux-x86_64/examples/rasterize.js
phantomjs-1.9.8-linux-x86_64/examples/injectme.js
phantomjs-1.9.8-linux-x86_64/examples/run-jasmine.js
phantomjs-1.9.8-linux-x86_64/examples/post.js
phantomjs-1.9.8-linux-x86_64/examples/imagebin.coffee
phantomjs-1.9.8-linux-x86_64/examples/pizza.coffee
phantomjs-1.9.8-linux-x86_64/examples/hello.coffee
phantomjs-1.9.8-linux-x86_64/examples/features.js
phantomjs-1.9.8-linux-x86_64/examples/movies.coffee
phantomjs-1.9.8-linux-x86_64/examples/tweets.coffee
phantomjs-1.9.8-linux-x86_64/examples/injectme.coffee
phantomjs-1.9.8-linux-x86_64/examples/features.coffee
phantomjs-1.9.8-linux-x86_64/examples/colorwheel.coffee
phantomjs-1.9.8-linux-x86_64/examples/walk_through_frames.js
phantomjs-1.9.8-linux-x86_64/examples/printmargins.coffee
phantomjs-1.9.8-linux-x86_64/examples/printmargins.js
phantomjs-1.9.8-linux-x86_64/examples/scandir.coffee
phantomjs-1.9.8-linux-x86_64/examples/loadspeed.coffee
phantomjs-1.9.8-linux-x86_64/examples/printenv.js
phantomjs-1.9.8-linux-x86_64/examples/serverkeepalive.coffee
phantomjs-1.9.8-linux-x86_64/examples/fibo.coffee
phantomjs-1.9.8-linux-x86_64/examples/echoToFile.coffee
phantomjs-1.9.8-linux-x86_64/examples/netlog.js
phantomjs-1.9.8-linux-x86_64/examples/useragent.coffee
phantomjs-1.9.8-linux-x86_64/examples/child_process-examples.coffee
phantomjs-1.9.8-linux-x86_64/examples/weather.coffee
phantomjs-1.9.8-linux-x86_64/examples/direction.coffee
phantomjs-1.9.8-linux-x86_64/examples/module.coffee
phantomjs-1.9.8-linux-x86_64/examples/printenv.coffee
phantomjs-1.9.8-linux-x86_64/examples/simpleserver.js
phantomjs-1.9.8-linux-x86_64/examples/fibo.js
phantomjs-1.9.8-linux-x86_64/examples/imagebin.js
phantomjs-1.9.8-linux-x86_64/examples/colorwheel.js
phantomjs-1.9.8-linux-x86_64/examples/technews.js
phantomjs-1.9.8-linux-x86_64/examples/hello.js
phantomjs-1.9.8-linux-x86_64/examples/echoToFile.js
phantomjs-1.9.8-linux-x86_64/examples/postserver.coffee
phantomjs-1.9.8-linux-x86_64/examples/page_events.coffee
phantomjs-1.9.8-linux-x86_64/examples/postserver.js
phantomjs-1.9.8-linux-x86_64/examples/weather.js
phantomjs-1.9.8-linux-x86_64/examples/countdown.coffee
phantomjs-1.9.8-linux-x86_64/examples/netsniff.coffee
phantomjs-1.9.8-linux-x86_64/examples/detectsniff.js
phantomjs-1.9.8-linux-x86_64/examples/render_multi_url.coffee
phantomjs-1.9.8-linux-x86_64/examples/useragent.js
phantomjs-1.9.8-linux-x86_64/examples/walk_through_frames.coffee
phantomjs-1.9.8-linux-x86_64/examples/post.coffee
phantomjs-1.9.8-linux-x86_64/examples/arguments.js
phantomjs-1.9.8-linux-x86_64/examples/simpleserver.coffee
phantomjs-1.9.8-linux-x86_64/examples/run-qunit.coffee
phantomjs-1.9.8-linux-x86_64/examples/outputEncoding.coffee
phantomjs-1.9.8-linux-x86_64/examples/phantomwebintro.js
phantomjs-1.9.8-linux-x86_64/examples/follow.coffee
phantomjs-1.9.8-linux-x86_64/examples/loadspeed.js
phantomjs-1.9.8-linux-x86_64/examples/page_events.js
phantomjs-1.9.8-linux-x86_64/examples/loadurlwithoutcss.js
phantomjs-1.9.8-linux-x86_64/examples/sleepsort.js
phantomjs-1.9.8-linux-x86_64/examples/sleepsort.coffee
phantomjs-1.9.8-linux-x86_64/examples/netlog.coffee
phantomjs-1.9.8-linux-x86_64/examples/outputEncoding.js
phantomjs-1.9.8-linux-x86_64/examples/serverkeepalive.js
phantomjs-1.9.8-linux-x86_64/examples/phantomwebintro.coffee
phantomjs-1.9.8-linux-x86_64/examples/server.coffee
phantomjs-1.9.8-linux-x86_64/examples/universe.js
phantomjs-1.9.8-linux-x86_64/examples/pagecallback.coffee
phantomjs-1.9.8-linux-x86_64/examples/stdin-stdout-stderr.js
phantomjs-1.9.8-linux-x86_64/examples/detectsniff.coffee
phantomjs-1.9.8-linux-x86_64/examples/unrandomize.coffee
phantomjs-1.9.8-linux-x86_64/examples/netsniff.js
phantomjs-1.9.8-linux-x86_64/ChangeLog
phantomjs-1.9.8-linux-x86_64/README.md
phantomjs-1.9.8-linux-x86_64/LICENSE.BSD
phantomjs-1.9.8-linux-x86_64/third-party.txt
$  sudo ln -s /opt/phantomjs/bin/phantomjs /usr/bin/phantomjs

いざテスト実行

:tada: 成功! :tada:

tasks_spec.rbの実行
$ bin/rspec spec/features/tasks_spec.rb
Running via Spring preloader in process 20323
/home/ec2-user/.rvm/gems/ruby-2.6.3/gems/activerecord-5.1.1/lib/active_record/connection_adapters/abstract_adapter.rb:81: warning: deprecated Object#=~ is called on Integer; it always returns nil

Tasks
You're running an old version of PhantomJS, update to >= 2.1.1 for a better experience.
  user toggles a task

Finished in 1.99 seconds (files took 0.30678 seconds to load)
1 example, 0 failures
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS EC2で写真投稿機能を追加する方法

gem レシピ

Gemfile.
#image
gem 'rmagick'
gem 'paperclip'

#AWS
gem 'aws-sdk'

$ bundle install でインストール!!

データベースを用意していく

$ rails g paperclip [テーブル名] [カラム名]
$ rake db:migrate

view

・投稿ボタンを任意の場所に設置。

hoge.html.erb
<%= form.file_field :picture %>

.

・投稿後の写真を表示したい所に設置していく。

hogehoge.html.erb
<%= image_tag game.picture.url(:thumb) %>

model

モデル内に追加するコード

hoge.rb
has_attached_file :picture, styles: {medium: "300x300>",thumb: "100x100>"}
    do_not_validate_attachment_file_type :picture

controller

privateの関数内のパラメーター(hoge_params)に、写真の([:カラム名])を追加しておく。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

+ AWS EC2で RubyonRail写真投稿機能を追加する

gem レシピ

Gemfile.
#image
gem 'rmagick'
gem 'paperclip'

#AWS
gem 'aws-sdk'

$ bundle install でインストール!!

データベースを用意していく

$ rails g paperclip [テーブル名] [カラム名]
$ rake db:migrate

view

・投稿ボタンを任意の場所に設置。

hoge.html.erb
<%= form.file_field :picture %>

.

・投稿後の写真を表示したい所に設置していく。

hogehoge.html.erb
<%= image_tag game.picture.url(:thumb) %>

model

モデル内に追加するコード

hoge.rb
has_attached_file :picture, styles: {medium: "300x300>",thumb: "100x100>"}
    do_not_validate_attachment_file_type :picture

controller

privateの関数内のパラメーター(hoge_params)に、写真の([:カラム名])を追加しておく。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS Solutions Architect Associate資格を(ry

10日で取得した話

はじめまして、birdmanと申します。
この名前は住処に昔からある巨大な鳥の絵から取ったもので、UFOに乗った怖い人でも、黒スーツバンドの曲からでもございません。(だからなんだ)

さてQiitaには以前より下書きはちょいちょい書いていましたが、エンジニアとしてレベルを上げる為にちゃんとアウトプットしようと投稿する事にしました。

初回のネタとして、つい先日AWS Solutions Architect Associateを勉強期間10日(2週間)で取得したのでその経験を記します。
この手の投稿は非常に多いですが、イチ経験談として誰かの参考になれば幸いです。

背景

社内SE的な仕事をここのところしていますが、昨今ナレッジの蓄積が特に重要視されており、それを実現するシステムの検討が必要となっていました。

しかしベンダー各社が営業に来て紹介するものは大概イケてなくて高かろう悪かろうばかり。

中々どこもピンと来ず調べていると、自分達のやりたい事がどうやらAWSで一通り実現できそうだぞという事が分かって来て、さらに突っ込んで行くとAWSの持つその可能性に震え「こういうものを待っていた!」と興奮したのでした。(今更感)

しかしAWS、何となく知ってはいたものの実際のところ殆ど知識が無い。
これからガッツリ組み合って行くと覚悟を決めたのでちゃんと学ばねばと思っていたところ、SAA試験の存在を知り、体系的に学べてかつ資格も取得出来るという一石二鳥を狙う事にしました。

自分のITスペック

・基本情報処理技術者資格だけ持ってた
・社内SE7年目(VBAで始まり今はほぼWEB中心)
・元Cプログラマ(経験1年程度)
・AWSは勉強会にちょい顔出し程度、実際手を動かしてはいなかった
・あとは、えーと…

戦略

特にありません。(笑)

普通でした。普通ですみません。

試験を知ったのも割と直前ではありましたが、Qiita各記事を見る限り勉強はまあ2週間あれば何とかなると舐めてかかってました。

・「徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書」を購入し、試験日から逆算してスケジュールを立てて読む。
・全体像を把握しながら各サービスの繋がりを把握する
・模擬試験や問題集を多く解く

この位ですね。正攻法です。

実際やった事

・教科書を読むペースを上げ、予定より早く読み終わる。(2日ほど早まる)
・教科書の付属問題集を解く
・AWS模擬試験を受ける
・WEB問題集「AWS WEB問題集で学習しよう」のゴールドプランを購入し後ろから解く
・土日は子どもと遊ぶか酒飲んでました

AWS模擬試験の結果が7割位だったので本試験はこのレベルじゃまずいとブースト。
WEB問題集の無料問題を解いては調べ、ラスト1日でゴールドプラン購入。1日に4000円は少々躊躇いましたが結果買って良かったです。(時間無くて問題の1割位しか出来なかったけど)

試験当日

・八重洲のピアソンVUE会場で受験。平日朝なのであまり人は多くなく、集中出来ました。(他の試験を受けている人がちらほら)(この会場には受験者を監視するカメラは無かった)
・割と時間余るだろうと思っていましたが結構ギリギリ。この為見直しが殆ど出来ませんでした。難しい問題が比較的多かった様に思います。
・分からない問題も内容をよく読んで選択肢を比較検討すれば答えが浮かんでくるものも。(だから時間がかかった)

結果

ギリ合格。
試験後即分かるのは良いけどWEBに反映されるまでは数日かかったので、試験後に向かったAWS SUMMITのラウンジに入れない…と思ったけど入口の方に説明した所ご理解頂き入れてもらえました。良かった。

勉強時間は1日4~5時間程度×10日。
後日点数を見ると結構ギリギリでしたが、自分の実力がそのギリギリを越えているかどうかを模擬試験結果から感覚的に掴めるかどうかが割と重要かも、と思いました。

まとめ

・テキスト+問題集の正攻法で大丈夫
・わからない問題も知識を総動員すれば何とかなる(かも)
・WEB問題集のゴールド、早目に買って網羅しとけば良かった
・2週間集中して勉強すれば取れる

最後に

この記事がこれから受験される方に少しでもお役に立てば幸いです。
最後まで読んで頂きありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Cloudfront -> API Gateway -> Lambdaの構成でアクセス元のHostをLambdaで取得する

なぜ必要?

XXX.example.comXXX 部分によって挙動を変える、つまりサブドメインをパラメータにしたかった。

普通にCloudfront + API GatewayにしてしまうとHostヘッダはAPI Gatewayのもの(xxxxxxx.execute-api.ap-northeast-1.amazonaws.com)になってしまいます。

これに対し、Cloudfrontに来たHOSTをAPI Gatewayに横流ししてみました。
作業的にはCloudfrontのWhitelist HeadersにHOSTを入れれば解決か?と思ったのですが、これだとAPI Gateway側で証明書検証できず500番台エラーが返ってきてしまいます。。。

ちょっと手こずったので解決方法を残しておきます。

解決の大まかな流れ

  1. Cloudfrontに来たHOSTをAPI Gateway側に流す
  2. HOSTそのままではAPI Gatewayに受け入れてもらえないのでHOSTはAPI Gatewayの値に書き換えつつX-FORWARDED-HOSTにアクセス元のHOSTを載せる

1. Cloudfrontに来たHOSTをAPI Gateway側に流す

CloudfrontのWhitelist Headersに値設定するだけです。
以下の2つを設定してください。

  • HOST
  • X-FORWARDED-HOST(下記スクリプトと矛盾なければヘッダ名は自由です)

2. HOSTそのままではAPI Gatewayに受け入れてもらえないのでHOSTはAPI Gatewayの値に書き換えつつX-FORWARDED-HOSTにアクセス元のHOSTを載せる

Lambda@Edgeを使ってオリジンへのアクセス時にヘッダを書き換えます。

exports.handler = async (event, context, callback) => {
    const request = event.Records[0].cf.request;
    const headers = request.headers;

    // Hostの値をX-Forwarded-Hostに写す
    headers['x-forwarded-host'] = [{ 
        key: 'X-Forwarded-Host', 
        value: headers.host[0].value 
    }];

    // API GatewayのHOSTに書き換え
    headers['host'] = [{ 
        key: 'Host',
        value: 'pcwldf375g.execute-api.ap-northeast-1.amazonaws.com'
    }];

    callback(null, request);
};

このLambdaをCloudfrontのOrigin Request(否Viewer Request!)に設定します。

ここまでできれば受け取り側のLambdaで普通にX-FORWARDED-HOSTヘッダを見ればOKです。めでたしめでたし。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

コンテナど素人が、EC2からECSにシステムリプレースした話

LTの発表用に、gitpitchのスライドでまとめてみました。

スライド

https://gitpitch.com/matsuda-hiroki/slide?p=20190701_replace_EC2_to_ECS

反省点

gitpitchでの画像表示が崩れてしまう

qiitaへのスライド埋め込みがわからない

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む