- 投稿日:2019-07-11T21:49:39+09:00
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.無事PHPも動いてますね。
じゃあ早速mariadbでも……ん?<RDSに無料枠あるってよ!
これだ!
というわけでRDS使います。
作りました。
セキュリティグループをちょいちょいっといじって……
# 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を使うという目的は果たせたと思います。今回はEC2とRDSという狭い範囲のみで行いました。
触り程度は覚えられたかなと思うので、後は他のサービスも確認ししつつ、
実践的な場面を想定した環境の構築もやっていきたいと思います。なるべく無料枠でできる限り……
ありがとうございました。
- 投稿日:2019-07-11T20:39:50+09:00
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でプロファイル使っているときはここで入れておく完了!
参考文献
- AWS Systems Manager セッションマネージャーでSSH・SCPできるようになりました | DevelopersIO
- Windows に AWS CLI をインストールする - AWS Command Line Interface
- (オプション) AWS CLI 用の Session Manager Plugin をインストールする - AWS Systems Manager
- Step 7: (Optional) Enable SSH Session Manager Sessions - AWS Systems Manager
- 料金 - AWS Systems Manager | AWS
- 特定 EC2 インスタンスには、SSM セッションログインさせたくないんや | DevelopersIO
- Proxy下のWindows10でOpenSSHする - Qiita
補足
接続に使う秘密鍵は接続先対象EC2に設定しているそのもの
呼び方はSession Manager for SSHとかでよいのだろうか?端末とAWS間の通信方法
StreamUrlとして以下がAWS CLIのコマンド応答として返却されているためWebSocket(wss)でつながっている。
wss://ssmmessages.ap-northeast-1.amazonaws.com/v1/data-channel/【IAMユーザー名を含むランダム列】?role=publish_subscribeAWS CLIをその他の場所にインストールしていた場合にAWSコマンドの場所を調べる
where aws
- 投稿日:2019-07-11T20:36:45+09:00
AWSを使ってみる③
作成したインスタンスの確認
画面下部に詳細が色々書かれてるので確認しましょう。(画像ではカットしてます)
TeraTermでアクセス
早速ユーザと秘密鍵ファイルを指定して接ぞk……ん?
Teraterm.exePlease login as the user "centos" rather than the user "root".rootでログインすんなって言われました。
そりゃそうだよね。改めてcentosユーザでログイン
無事にログインできましたね。
初期設定
ここまでくれば後は簡単ですね。
ささっと初期の設定の確認と修正をしていきましょう。作業的には下記の通りぐらいですね。
- 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が違いました。
なんでやーと思って作業ログがてら取ってたスクリーンショットを見たところインスタンス作成時にVPCを正しく指定してませんでした。
(・ω<) てへぺろ
みんなはちゃんと指差し確認しようね!次回環境を作るときは気を付けます。
ElasticIPでグローバルIP取得し、IPを固定化したところで今回はここまで
次回はApacheとPHPとmysql導入
AWSを使ってみる④
- 投稿日:2019-07-11T20:18:17+09:00
今度はあんまりゴツくない!?「わりとゴツいKubernetesハンズオン」そのあとに
1月半ほど前、社内勉強会のおすそ分けとして、わりとゴツいKubernetesハンズオンの記事を書きました。
おかげさまでご好評いただき、今では1500を超えるいいねをいただきました。ありがとうございます。今回の話とは全然関係ないですが、こちらも頑張って書いているので興味あれば見てやってください。
(マイナーなタグしか付けられなかったせいか、view数がとても少なくて悲しみに暮れています…?)
QRコード Deep Dive ーデータ符号化とか誤り訂正とかー開発環境の構築ができるようになろう!
さて、みなさまKubernetesについては完全理解しましたでしょうか?
主要な要素の説明はしているので、完全理解フェーズにたどり着くのも夢ではないと思います。自信と理解度の関係を図にしました。#完全に理解した pic.twitter.com/SA638Vy9UH
— 廻転楕円体 (@kaitendaentai) 2018年10月17日ただ、ハンズオンの中では、既存のDockerイメージしか使っていません。
Kubernetesを使ってオリジナルのアプリケーションを構築するには、
Dockerを交えた開発環境の構築という、もうひと山を超えねばなりません。ここで、前回のハンズオンの目標を見返してみてください。
- 構築・運用ができるような気分になる
できるようになるとは言ってない…!(どーん
ということで、前回入れようと思ったけど
力尽きたゴツくなりすぎると思ってやめておいた、
開発環境の構築について、またハンズオン形式でお伝えしようと思います!ちなみに、本記事は福岡のKubernetes勉強会「ふくばねてす node-2」での発表資料をQiita用にコンバートしたものです。
発表資料 : https://speakerdeck.com/ktam1219/waritogotuikuberneteshanzuon-sofalseatoniやりたいこと
ローカル開発環境
まずはローカルでの開発環境を作らないことには始まりません。
大まかな開発フローは以下の繰り返しになります。
1. コードを編集
2. Dockerイメージをbuild
3. ローカルのKubernetesクラスターにデプロイ
CI/CD環境
本番環境にリリースする際の作業はさらに手順が増えます。
1. コードを編集
2. GitにPush
3. Dockerイメージをbuild
4. コンテナレジストリにDockerイメージをPush
5. Kubernetesクラスターにデプロイ
手作業でやろうとすると大変なので、CircleCIなどを使って自動化したいですね。
以上が今回やりたいことなんですが、
なんだか一気にめんどくさい気持ちになってきましたね。でも、簡単にできるんです。
そう、Skaffoldならね!Skaffold
Skaffoldは、Google謹製のKubernetesの開発支援ツールです。
クラスタにアプリケーションをデプロイするまでの 一連の作業を(ローカル/リモート問わず)自動化してくれます。
- Dockerイメージのbuild
- Dockerイメージの構造テスト
- Dockerイメージへのタグ付け
- コンテナレジストリにDockerイメージをPush
- KubernetesクラスタにDeploy
先ほど挙げたやりたいことに加え、テストやタグ付けまで…!
また、各フェーズは独立していて、プラグイン的にお好みでやり方を選択できます。
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 legacyPCの負担を下げるためちょっと調整 & 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 EOTSkaffoldのインストール & セットアップ
以下のURLを参考にインストールを行います。
https://skaffold.dev/docs/getting-started/#installing-skaffoldmacであればHomebrewで入ります。
$ brew install skaffoldSkaffoldの設定ファイルを作成します。
skaffold.yamlapiVersion: 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 にアクセスすると画面が出てきます。
ファイルの変更検知機能を試してみるために、おもむろに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ブラウザをリロードしてみるとちゃんと変更が反映されていることが確認できます。
最後に、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.70313407sskaffold 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.763257066sSkaffoldでテストもしてみる
Skaffoldのテストは、container-structure-testを使います。
その名の通り、コンテナイメージの構造をテストするものです。できることは、
- イメージ内のコマンドの出力をチェック
- ファイルシステムのメタデータと内容を検証
- etc...
今回は、
skaffold-example-frontend
のファイル存在チェックをしてみましょう。
その他のテスト項目については
https://github.com/GoogleContainerTools/container-structure-test/blob/master/README.md を参照してください。structure-test/frontend.yamlschemaVersion: 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: trueskaffoldの設定ファイルにテストの設定を追記しましょう。
skaffold.yamlapiVersion: 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を無効化してお片付けをしましょう。
SkaffoldをCI/CD向けに使ってみよう
完成版はこちらにあります。
https://github.com/Kta-M/skaffold_exampleGitHubのリポジトリを作成
みんなできるだろうから割愛します。
DockerHubのリポジトリを作成
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.yamlapiVersion: 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リポジトリを登録しましょう。
変数名 値 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
また、orbを使えと言われてるけど今回は無視します。
orbはバージョン2.1でしか使えないけど、2.1はまだローカルでの動作確認ができないようなので…。とてもつらい。CircleCIのconfigを作成
以下のようになります。
name
を見ていけば何をしているのかだいたい分かるかと思います。
本来は、もろもろインストールしたDockerイメージを作ってからやるべきなんでしょうけど、
分かりやすくするためインストールもcircleciで行っています。circleci/config.ymlversion: 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: - buildGitHubにPush
この状態でもろもろをGitHubにPushしてあげると…
CircleCI上でskaffold run --profile prd
が実行され、もろもろの処理が走ります。$ 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 7sELBのドメインを確認してアクセスすると、guestbookアプリが動いているのが確認できると思います!
まとめ
- 「わりとゴツいやつ」から一歩進んで、Kubernetesを使った開発の具体的なイメージが掴めたのであれば幸いです?
- ただ、我々はKubernetes沼に足を踏み入れたばかり
- 今回紹介しきれなかった用語、エコシステムなどまだ膨大に…
- 俺たちの真の戦いはこれからだ!
- 投稿日:2019-07-11T19:18:01+09:00
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からしたらコストが嵩んでたまったものじゃないと思われます。
- 投稿日:2019-07-11T18:15:34+09:00
AWSを使ってみる②
インスタンス作成まで
AWSの勉強レポートです。
早速やっていきましょう。AMIの選択
EC2を使用を推したら出てきました。
とりあえずリージョンは東京に変更します。
AMIを選択していきましょう。
よく聞くAmazon Linux AMIは今回は使わず、CentOS7の無料枠を使います。インスタンスの詳細設定
早速知らない言葉がいくつか出てきました。
一個ずつ調べていきます。一言メモを残しますが、間違っている可能性大なので気付き次第、後日修正します。
- Auto Scaling グループ:インスタンスの負荷によってインスタンス数を自動的に増減してくれる機能
- VPC:仮想ネットワークのこと。VPCって単語AWS以外でも使うんかな?使わなそう
- プレイスメントグループ:同じAZにあるインスタンスを論理的にグループ化して通信をよくする。クラスタとかレプリケーションするときに使いそう。
- Amazon CloudWatch:AWSのサービスを監視できるらしい。
- テナンシー:多分テナントのこと。ベアメタルクラウドみたいに専用物理も用意できる。
- Amazon Elastic Inference:EC2とかのインスタンスにGPUをつけて高速化を図る。
- T2/T3 無制限:CPUクレジットの枯渇を心配する必要がなくなる。
というわけで
さっくりと設定してきました。
- VPC&Subnet:わかりやすいよう新規作成しました。
- PlacementGroup:インスタンスを増やすつもりはありませんが、念のため新規作成・追加しました。Spreadを選ぶとインスタンスを個別のハードウェアに分けてくれるんですって。
- 削除保護の有効化:当然有効ストレージの追加
無料枠だと30GBまでのブロックストレージが使える模様。
30GB全部使っちゃいましょう。
折角なのでHDD暗号化もかけましょう。
EC2インスタンスの削除と同時にEBSを削除できるように合わせて削除もチェックしちゃいましょう。タグの追加
タグはとりあえず名前だけでつけましょう。
セキュリティグループの設定
OpenStackと同じ考えていいのかな?
とりあえずさっくり作りましょう。
とここでソースのプルダウンメニューの「マイIP」を選択すれば自分のグローバルIPを設定してくれました。
すごーくありがたいですね。インスタンス作成の確認
無事無料枠に収め、インスタンスの作成を終えました。
キーペアを設定し、次回は起動から初期設定
AWSを使ってみる③へ
- 投稿日:2019-07-11T18:15:12+09:00
AWSを使ってみる①
今日から始めるAWS学習
今更ながらAWSを勉強してきます。
それのレポートを兼ねて書いていきます。動機と勉強方法と目標
- 動機:AWSの知識が必要だ!
- 方法:とりあえず使ってみる
- 目標:LAMP環境作ってアクセスできるところまで確認
使うもの
- Linuxの知識(CentOS7)
- AWSアカウント
- クラウドの知識
- やる気
AWSに関する知識
- 5年ぐらい前にインスタンスを一個つくったっきり
次回から詳細書いていきます。
AWSを使ってみる②
- 投稿日:2019-07-11T17:41:53+09:00
〜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みたいなイメージです。
(個人的に、東京リージョン=東京都内という意味ではとっていないし、むしろ都内だけならあまりばらけないはず)
★超ざっくり!笑で、VPCをアーキテクチャ図で表現するとこうなります。
上にインターネットがあり、AWSCloud全体がまず存在。
その中の東京リージョンがあり、今回はこのリージョン内にVPCを作成。
そして東京リージョンはAZ(DC群)が3つあるためこういった記載となりました。サブネットの活用
EC2等のリソースは、サブネットといわれる、VPCをさらに分割したNW内に作成するイメージです。
サブネットの主な用途は
・Webサーバーを配置するパブリックサブネット、DB等VPC内のリソースからのみアクセスするプライベートサブネットに分けたトラフィックの制御
・耐障害性を考慮した設計にするため、2つのAZを使った冗長化構成(LBなど)
などの使い方が挙げられます。
そのため、例えば先ほどの「耐障害性を考慮した設計にするため、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を選択すると、こんな画面になるかと思います。
この画面はVPC一覧で、選択したVPCの情報が下に出力されます。
「VPCの作成」から始めましょう。
ここでは、VPCに以下のIP範囲を割り当てます。
10.0.0.0/16IPv6やテナンシー需要ないのでそのままで問題ないです。
ちなみにテナンシーはハードウェア専有という贅沢なやつです。サブネット作成手順
次に、サブネットの作成を行います。
先ほどと同様、VPCの画面、左のタブ内に「サブネット」があるので
こんな画面が開かれるのを確認してください。
「サブネットの作成」から始めます。
今回はEC2を1つ置ければよいので以下のようなIP範囲で適当に設定します。
10.0.1.0/24先ほどのVPC内に作成するため、IP範囲に注意。 ※ここでおかしいIP入れるとちゃんとエラー表示されます。
また、AZの選択肢が1つしかないのでお察しかと思いますが、
注意点として、サブネットはAZを2つ跨いだりすることができません。現在こんな状態ですねー
★PublicSubnetとありますが、実際はまだインターネットとつながっていません。Security Group作成
次に、EC2のためのファイアウォールを設定します。
SGは、EC2インスタンスに割り当てる仮想ファイアウォールです。
オンプレミスでは直接OS上のfirewalldなどで設定していたと思いますが、AWSでは基本的にはSGで管理します。
もちろん実際のところすべてのセキュリティをSGのみで全てカバーしているわけではないですが。その辺の話は追々別記事にて。今回インターネットからEC2へのアクセスは、SSHアクセス、Webアクセスが最低限必要なので
ポート22,80,443(一応)を開けます。
開ける相手は今は自己IPのみ指定しましょう。(確認せずともワンボタンで可)SG設定手順
SGはサービス「EC2」内、左タブにあります。こんな画面。
設定内容は以下のようになります。
ソースが送信元なので、マイIPを選択すると現在のIPが指定されます。
使用するVPCを指定しましょう。 ※説明欄もわかりやすいものを記載しましょう。
「作成」で完了。
入ってきた通信の、帰りの制御はどうするの?という疑問があるかもしれませんが、SGはステートフルです。
VPC のセキュリティグループ - AWSドキュメント
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_SecurityGroups.htmlセキュリティグループはステートフルです。インスタンスからリクエストを送信する場合、そのリクエストのレスポンストラフィックは、インバウンドセキュリティグループルールにかかわらず、流れることができます。許可されたインバウンドトラフィックに対する応答(戻りのトラフィック)は、アウトバウンドルールにかかわらずアウト側に対し通過することができます。
※逆に、ステートレスでの通信制御要件がある場合は、ネットワークACLという別の設定を併用します。
線がいっぱいあってわかりずらいよー
という声もあるかもしれませんが、アーキテクチャ図は基本必要最低限の物を表記すればいいので、
今回みたいにTokyo Regionの線をわざわざ書いたりする必要もあまりないと思います。え?図が見づらい?
それは作者のセンスですねネットワークと繋げるために
ではどうやって、これから作成するEC2からインターネットに繋げられるようにするのか。
気を付けるのは以下の点です。(初めての際に混乱しやすい)①インターネットゲートウェイ(IGW) = VPCをインターネットと繋げるため。
リソースの作成
・IGWを作成する。リソースのアタッチ
・IGWはVPCにアタッチする。
これで、VPC自体は仮想ルーターによりインターネットと接続可能となる②ルートテーブル = サブネットをインターネットと繋げるため。
リソースの作成
・ルートテーブルの作成する。
リソースのアタッチ
・サブネットのルーティング設定変更をする。
これでVPC内の、ルーティングしたサブネット内のリソースはインターネットへ接続可能となる③VPCで名前解決できるようにする
設定変更のみ
④サブネット内リソースへのIPv4割り当て設定
設定変更のみ
大丈夫です、そんな時間かかりません。
①インターネットゲートウェイ
先ほど記載した通り、デフォルトではインターネット外に出られないため、インターネットゲートウェイ(IGW)を作成します。
IGW作成
サービス「VPC」内の左タブに「インターネットゲートウェイ」があります。
「インターネットゲートウェイの作成」から作成。
名前つけて終わり。
確認します。
VPCにIGWをアタッチ
その画面から、作成したIGWを選択した状態で、「アクション」から「VPCにアタッチ」を選択。
先ほどのVPCを選び、「アタッチ」で完了。
「状態」がattachedに変わり、
「アタッチ済みVPC ID」の箇所にアタッチ先のVPCがあることを確認。
②ルートテーブル
サブネットにルート設定します。
AWSの場合、基本的にルーティングはOS上で行うことなくAWSマネジメントコンソールやCLIで以下のように行うことが多いかと思います。ルートテーブル作成
サービス「VPC」から、同じ要領でルートテーブルを開きます。
「ルートテーブルを作成」から、VPCを選択して名前指定。
「作成」で終わり。
ルーティング設定
どんどん行きましょう。
作成したルートテーブルを選択して「ルート」タブを選択するとこんな画面が。
ここではまず、すべての通信をIGWを通すという大前提を記載します。
「ルートの編集」で設定をします。送信先:0.0.0.0/0(すべて)
ターゲット(宛先):先程作成したIGW ※作成済みのIGWを選択できます。
「ルートの保存」をしましょう。
出来ていますね。次に、「サブネットの関連付け」をします。
タブを開くと、こんな感じの画面になっているので「サブネットの関連付けの編集」を選択。
先程のサブネットを選択して「保存」です。
確認しましょう。
関連付けが出来ているので、あとはちょっとした設定のみです。③VPCで名前解決できるようにする
VPC一覧画面から、
VPCを選択した状態で、「DNSホスト名の編集」を選択します。
有効化にチェックを入れて保存をします。
これは、アクセスする際にIPアドレス以外に
ec2-{public-ipv4-address}.compute-1.amazonaws.comのようなアドレスが使用可能となります。④自動割り当てIP設定の変更
サブネット内で起動されるリソースにIPv4アドレスが割り当てられるように設定変更します。
作成したサブネットを選択して、「アクション」を選択して…
「自動割り当てIP設定の変更」を選択。チェックを入れて保存しましょう。
これで、EC2を構築するための最低限のネットワークリソースはできました。EC2インスタンスの作成
いよいよEC2を作成します。
作成した際のイメージはこうなります。
難しいことは考えず、必要最低限の考慮はしていきましょう。ここから具体的に料金が絡むのでそちらも触れながら。
では、サービス「EC2」を開いて、「インスタンス」を選択します。
「インスタンスを作成」を選択。
AMIを選ぶ画面です。
AmazonLinux、RHEL、CentOS、WindowsServerなどなど色々ありますが
今回はAmazonLinux2を選びます。
Amazonが用意したCentOSベースのOSです。次にインスタンスタイプを選びます。
これはAmazonが用意したスペックのテンプレートの様なものですね。(見ての通りのスペック群)
それぞれ料金が大きく変わるので、こちらを参照してください。Amazon EC2 料金表
https://aws.amazon.com/jp/ec2/pricing/on-demand/尚、今回はデフォルトで選択されている「t2.micro」をオンデマンドで使用しますが、
時間あたりの料金は無料利用枠なしだと0.0152USD=¥1.64です。(2019/7/11 ¥108/$)
無料利用枠に関してはこちらを参照くださいー動作確認程度なので先程のインスタンスタイプでいきますね。
次に、詳細設定ですが、今回最低限変更が必要なのは以下の3つ。
ネットワーク:作成したVPCを選択します。 ※VPCを東京リージョンに作成したなら東京リージョンでEC2を作成しましょう。
サブネット:作成したサブネットを選択します。
自動割り当てパブリックIP:インターネット経由でアクセスが必要なので有効にしましょう。以下は、参考程度にライトな説明です。
起動インスタンス:同じものを同時にいくつ作るか
購入のオプション:切れるの面倒なのでスポットインスタンスにはしない? ※調べましょう
シャットダウン動作:インスタンスを停止したら消える昨日はいらないので、「停止可能」にする
削除保護の有効化:間違ってGUIで消しちゃった、は怖いので、インスタンスを消す際はワンプロセス挟む様に設定出来ます。
モニタリング:デフォルトの5分で今回は問題ないのでそのまま(CloudWatchを見てみよう!)
テナンシー:以前記載しましたが、ハードウェア占有の話です。次に、ストレージ(EBS)の設定です。
デフォルトの設定値でもんんだいないのでそのまま進みます。
SSDがデフォルト。プロビジョンドにするほどの用途は無いです。
EC2にタグをつけます。
「Name」というキーに「ec2-div-1」と値をつけておきました。
例えばEC2一覧の画面で一意にわかるといいですよね。
今までの設定の確認をします。
「起動」を選択すると、最後にキーペアの選択(作成)画面となります。
既存だとこの画面ですが、新しく作成するキーペアの名前を決めて、必ずダウンロードしましょう。
注意書きにもありますが、キーペアがないとSSHアクセスも出来ません。
これでEC2作成完了。
EC2一覧で確認ができます。
(instanceIDを画面から選択した場合)
始めは「インスタンスの状態」が黄色だったりもしますが、「running」に変わり
「ステータスチェック」の初期化〜が完了すればSSHでアクセスしてOKです。SSHする際やWebアクセスする際は
インスタンスに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」にアクセスしてみます。
無事確認ができたら、完了です!お疲れさまでした。補足:アーキテクチャ図
今回登場したコイツですが、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構成の作成や、〇〇やってみたぜ!をアップしていきます。
よろしくお願いします!
- 投稿日:2019-07-11T16:56:41+09:00
【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使ってね」との記述があったので、その通りに追加。
Gemfilegroup :test do gem 'capybara', '~> 2.15.4' gem 'poltergeist', '~> 1.15.0' gem 'launchy', '~> 2.4.3' endspec/support/capybara.rbrequire '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いざテスト実行
成功!
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
- 投稿日:2019-07-11T16:56:41+09:00
【Everyday Rails 6章 JavaScriptテスト】AWS Cloud9でChromeエラーが出たときの対処法
追記(2019/07/12)
【2019年7月版・動画付き】Cloud9上でEveryday Railsの
js: true
付きのフィーチャスペックを実行する手順以下の記事を投稿した翌日、翻訳者の伊藤さんより超迅速に対処方法の記事が公開されました!!
ありがとうございますはじめに
『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使ってね」との記述があったので、その通りに追加。
Gemfilegroup :test do gem 'capybara', '~> 2.15.4' gem 'poltergeist', '~> 1.15.0' gem 'launchy', '~> 2.4.3' endspec/support/capybara.rbrequire '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いざテスト実行
成功!
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
- 投稿日:2019-07-11T16:43:23+09:00
AWS EC2で写真投稿機能を追加する方法
gem レシピ
Gemfile.#image gem 'rmagick' gem 'paperclip' #AWS gem 'aws-sdk'
$ bundle install
でインストール!!データベースを用意していく
$ rails g paperclip [テーブル名] [カラム名] $ rake db:migrateview
・投稿ボタンを任意の場所に設置。
hoge.html.erb<%= form.file_field :picture %>.
・投稿後の写真を表示したい所に設置していく。
hogehoge.html.erb<%= image_tag game.picture.url(:thumb) %>model
モデル内に追加するコード
hoge.rbhas_attached_file :picture, styles: {medium: "300x300>",thumb: "100x100>"} do_not_validate_attachment_file_type :picturecontroller
privateの関数内のパラメーター(hoge_params)に、
写真の([:カラム名])
を追加しておく。完
- 投稿日:2019-07-11T16:43:23+09:00
+ AWS EC2で RubyonRail写真投稿機能を追加する
gem レシピ
Gemfile.#image gem 'rmagick' gem 'paperclip' #AWS gem 'aws-sdk'
$ bundle install
でインストール!!データベースを用意していく
$ rails g paperclip [テーブル名] [カラム名] $ rake db:migrateview
・投稿ボタンを任意の場所に設置。
hoge.html.erb<%= form.file_field :picture %>.
・投稿後の写真を表示したい所に設置していく。
hogehoge.html.erb<%= image_tag game.picture.url(:thumb) %>model
モデル内に追加するコード
hoge.rbhas_attached_file :picture, styles: {medium: "300x300>",thumb: "100x100>"} do_not_validate_attachment_file_type :picturecontroller
privateの関数内のパラメーター(hoge_params)に、
写真の([:カラム名])
を追加しておく。完
- 投稿日:2019-07-11T14:51:13+09:00
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週間集中して勉強すれば取れる最後に
この記事がこれから受験される方に少しでもお役に立てば幸いです。
最後まで読んで頂きありがとうございました。
- 投稿日:2019-07-11T14:27:16+09:00
Cloudfront -> API Gateway -> Lambdaの構成でアクセス元のHostをLambdaで取得する
なぜ必要?
XXX.example.com
のXXX
部分によって挙動を変える、つまりサブドメインをパラメータにしたかった。普通に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番台エラーが返ってきてしまいます。。。ちょっと手こずったので解決方法を残しておきます。
解決の大まかな流れ
- Cloudfrontに来たHOSTをAPI Gateway側に流す
- 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です。めでたしめでたし。
- 投稿日:2019-07-11T11:50:13+09:00
コンテナど素人が、EC2からECSにシステムリプレースした話
LTの発表用に、gitpitchのスライドでまとめてみました。
スライド
https://gitpitch.com/matsuda-hiroki/slide?p=20190701_replace_EC2_to_ECS
反省点
gitpitchでの画像表示が崩れてしまう
qiitaへのスライド埋め込みがわからない