20190307のAWSに関する記事は11件です。

プログラミング学習記録19〜突っ走る力〜

今日やったこと

  • Udemyの「Web開発入門完全攻略コース - プログラミングをはじめて学び創れる人へ!未経験から現場で使える開発スキルを習得!」のセクション12の139~150
  • セクション13の151~194

以下、パートごとに書いたメモです。

セクション12AWS Cloud9による開発環境構築

139.イントロダクション-AWS Cloud9による開発環境構築-

AWS Cloud9を使うとwebアプリケーションの開発がwebブラウザでできるようになります。
1年間無料で利用できます。

※ローカルPC上に環境構築して運用する方法もあります。

AWS Cloud9利用に必要なものは、

  • メールアドレス
  • クレジットカード
  • ユーザー認証用の電話番号

です。

実行環境はGoogle chromeで行います。

140.AWSの無料利用枠について

具体的に結論としては、
新規アカウント作成から12ヶ月。月間750時間まで無料利用枠で利用可能。

1年間の無料期間が終わってからは、(ドル円相場にもよるが)1ヶ月に90時間あたりだいたい210円くらいかかるみたいです。安いですね。

詳細は以下のページで確認してください。
AWS クラウド無料利用枠 | AWS(https://aws.amazon.com/jp/free/)

よくある質問 - AWS クラウド無料利用枠 | AWS(https://aws.amazon.com/jp/free/faqs/)

141.AWS利用時の注意事項!!必ず確認してください!!

アカウント情報の管理は厳重にしましょう。

以下のような被害も実際に出てきています↓
『AWSで不正アクセスを受けたので、そのときの対応を記録しておく(返金されました)』
https://qiita.com/kojiro_ueda/items/503d24b313a3a80b8ecc

あと、知識がない状態でAWSのいろいろなサービスを利用するのは、セキュリティ面や費用の面で危険だということです。

知識をつけてから、わかるものから少しづつ手をつけていきましょう。

142.AWSアカウント作成

AWSアカウント作成についてです。

以下のページに具体的な流れが書かれています。
AWS アカウント作成の流れ | AWS(https://aws.amazon.com/jp/register-flow/)

143.IAMの設定

AWS Identity and Access Management (IAM) は、ユーザーに対して AWS へのアクセスを安全に制御するための仕組みです。

AWS Identity and Access Management (IAM - ユーザのアクセスを安全に制御)| AWS(https://aws.amazon.com/jp/iam/) より引用

この講座ではIAMユーザーとしての利用で進めていくようです。

144.無料利用枠の使用のアラートの受信設定

AWSの不正な請求を防ぐためにあらかじめ行っておくべき設定です。

145.Cloud9のセットアップ

IAMユーザーでCloud9のセットアップを行いました。

これでIDE(統合開発環境)の準備ができました。

146.Cloud9の画面説明

linuxコマンド
$ ruby -v
でインストールされているrubyのバージョンを確認しました。

147.補足:AWS Cloud9のテキストエディタの設定について

AWS Cloud9の設定に関する補足資料です。
AWS Cloud9のテキストエディタの設定について
(https://programmingnavi.com/1690/)

Tabキーでスペース2個作れるようにするのと、不可視文字を表示する設定です。

148.新・Rubyのバージョン管理1

複数の開発案件を抱えていると、複数のrubyのバージョンを扱うことがあります。

なので、複数のrubyのバージョンを管理する方法を学びましょう、という話です。

Rubyのバージョン管理ソフトウェアはいくつかありますが、この講座ではrvmを使って進んでいきます。

Cloud9にインストールされているrvmのバージョンを確認しました。

$ rvm help

でrvmのヘルプを出すことができ、コマンドを調べることができます。

149.Rubyのバージョン管理2

鍵のインストールについてです。

150.Rubyのバージョン管理3

Rubyの最新バージョンは2.6.0ですが、動画に合わせてrvmで2.5.0をインストールし、デフォルトに指定しました。

このパートで実際に入力したコマンドです↓

$ rvm list
でインストールされているrubyのバージョンが確認できます。

$ rvm install 2.◯.◯
で指定したバージョンのrubyがインストールできます。

$ rvm use rubyのバージョン
でインストールされているrubyの中から使いたいバージョンを選ぶことができます。

$ rvm remove rubyのバージョン
で指定したバージョンのrubyをアンインストールできます。

$ ram —default use rubyのバージョン
でインストールされているrubyの中から指定したいものをデフォルトに指定することができます。

セクション12AWS Cloud9による開発環境構築 全体の感想

Cloud9についてより詳しくなれました。

Cloud9を使うのは初めてではないのですが、複数のバージョンを管理する方法等は知らなかったので、知れてよかったです。

とりあえず開発環境構築まで来れて一安心という感じですね。

いよいよ次のセクションではRubyに入ります。

楽しみです。

ということで、気を引き締めて次のセクションに進みたいと思います。


セクション13Ruby入門

151.イントロダクション-Ruby入門-

このセクションの概要。

152.Rubyとは

Rubyはプログラミング言語でruby on railsはフレームワーク。

詳しい情報は公式HPで確認できます。
Rubyとは
https://www.ruby-lang.org/ja/about/)

153.動作確認環境について


この講座ではAWS Cloud9でRubyのバージョンは2.5.0で行います。

154.はじめてのRubyプログラミング

Rubyを動かす方法はirb(対話型評価環境)を使う方法とファイルに保存したプログラムを実行する方法の2つがあります。

このパートでは両方の方法を試してみました。

Irbはコマンド
$ irb
で起動します。

元の画面に戻るときは
exit
です。

ファイルに保存したプログラムを実行する方法ではProgateのコマンドラインでやったコマンドを使いました。

kinu:~/environment/ruby_projects $ pwd
/home/ec2-user/environment/ruby_projects
kinu:~/environment/ruby_projects $ ruby hello.rb
Hello World!

Rubyのファイルは実行したいファイルの親ディレクトリに移動してから$ ruby 〇〇.rb で実行します。

155.コメント

Atomと同じようにCloud9でもcommandキー+/キーでコメントアウトします。

156.ローカル変数

price1=100や_price=100のような変数は原則使わないようにしましょう。

price_costのように_で区切るのは使われますが、priceCostのような書き方はあまり使いません。

あと、Rubyの予約語として指定されているものは変数名に使えません。

Ruby 予約語

157.定数

定数は全て大文字で書くことが多いです。

TAX=1.08
TAX_RATE=1.08

定数への代入は一度きり。

158.リテラル

Rubyのプログラムの中に直接記述できる値のことをリテラルと言います。

数字や文字列、配列、ハッシュはリテラルです。

159.オブジェクト指向プログラミング言語イントロ

オブジェクトとは、データや処理の集まりのことです。

今は言葉をざっくり知っていればいいそうです。

クラス、インスタンス、メソッドについてのざっと学びました。

160.数値(Numeric)

基本的な計算方法と数値を扱うメソッドのついての動画です。

161.文字列(String)

文字列を途中で改行したい場合は、\nを間に入れてダブルクオーテーションで囲む必要があります。

特殊文字や式展開を行うときは、ダブルクオーテーション。それ以外はシングルクオーテーション、という使い分がオススメらしいです。

162.空白文字について

出力結果は変わらないが、10 + 1 - 3 のように空白を入れると見やすくなるので、空白を入れて書きましょう。

163.演算子による値の比較

2つの値の大小や同じかどうかを調べる方法についてです。
関係が成り立つ場合は真(true)、成り立たない場合は偽(false)が返ってきます。

例えば、
puts 1<2
と書いたら、trueが返ってきます。

164.演算子の優先順位

どの順番で計算されるのか?という話です。

詳しくはこちらでご確認ください。
演算子の優先順位(https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html)

165.数値と文字列は暗黙的に変換されない

原則、数値と文字列をつなげることはできないので、.to_iや.to_f、.to_sを使って変換する必要があります。

166.インクリメントとデクリメント

インクリメントとは、値に1を足すことです。

デクリメントとは、値から1を引くことです。

Rubyには、JavaScriptでいうところの++、—はありません。

なので、インクリメントはn=n+1、n+=1のように、デクリメントはn=n-1、n-=1のように表現します。

167.真偽値

Rubyの真偽値のルール
・falseまたはnilであれば偽(false)
・それ以外は全て真(true)

その他真偽値に関係するメソッドにも軽く触れました。

168.条件分岐if

点数によって異なる評価を示すプログラムと動物の種類によって、ターミナルに出力する鳴き方を変えるプログラムを作りました。

169.条件分岐 unless

unlessは条件式がfalseの時に実行したい処理を書きます。

unlessにelsifに相当するものはないので、無理に使う必要はありません。

n=1
unless n.zero?
  puts 0ではありません’
end

を実行すると「0ではありません」が出力される。

170.条件分岐 case

複数の条件を指定する場合は、elsifを何個も使うよりもcaseを使った方がわかりやすくなります。

誕生石から、誕生月を出力するプログラムをcaseを使って作りました。

stone = 'ruby'
case stone
when 'ruby'
  puts '7月'
when 'peridot'
  puts '8月'
when 'sapphire'
  puts '9月'
else
  puts 'データが登録されていません'
end

171.演習:条件分岐

年齢によってテーマパークの入場料を出し分けてターミナルに出力するプログラムを作る演習です。

これは簡単でした。

172.演習回答:条件分岐

模範回答と同じでした。

age = 5
if age >= 12
  puts "5000円"
elsif age >=6
  puts "2500円"
else
  puts "1000円"
end

173.メソッド

メソッドは複数の処理をまとめて、扱いやすくしたものです。

Progateでは戻り値にreturnを使っていたのですが、この講座ではreturnを使っていません。

returnを使わなくても、大丈夫みたいです。

174.演習:FizzBuzz

有名な問題ですね。
会社の採用面接で問われることもあるそうです。

なんとかクリアできてよかったです。

175.演習回答:FizzBuzz

ポイントは先に15で割り切れる数の処理を書くことですね。

def fizz_buzz(n)
  if n%15==0
    'FizzBuzz'
  elsif n%3==0
    'Fizz'
  elsif n%5==0
    'Buzz'
  else
    n.to_s
  end
end
puts fizz_buzz(1)
puts fizz_buzz(2)
puts fizz_buzz(3)
puts fizz_buzz(4)
puts fizz_buzz(5)
puts fizz_buzz(6)
puts fizz_buzz(7)
puts fizz_buzz(8)
puts fizz_buzz(9)
puts fizz_buzz(10)
puts fizz_buzz(11)
puts fizz_buzz(12)
puts fizz_buzz(13)
puts fizz_buzz(14)
puts fizz_buzz(15)

3でも5でも割り切れない数字は文字列に変えて出力してください、ということで、n.to_sにしてます。

参考

  • to_i→文字列を数字に変えるメソッド
  • to_s→数字を文字列に変えるメソッド

176.puts,print,p

putsは改行されてnulになりますが、printは改行されずにnulが出ます。

Pメソッドはデバック用のメソッドです。

177.配列

配列の基本と配列に関する様々なメソッドについて学習しました。

具体的に、どの場面でどのメソッドを使うかはわからないので、さらっと流して次に進みます。

(0..25).to_a
で0から25の数字を含んだ配列を作ることができます。

178.ハッシュ

連想配列とも呼ばれるものです。

each文の書き方がProgateでやったものとは違っていましたが、基本的な考え方に大きな違いは’ないので、このまま突き進みます。

179.繰り返し処理

繰り返し処理の概要。

180.繰り返し処理 each, for

原則、for文は書かないそうです。

配列とハッシュそれぞれでeach文を書いてみました↓

numbers = [1,2,3,4,5]
numbers.each do |number|
  puts number
end


scores = {nakamura:90,sato:80,suzuki:70}
scores.each do |name,score|
  puts "#{name},#{score}"
end

181.繰り返し処理 times

配列を使わずに指定した回数繰り返したい時に使います。

5.times do
  puts 'hello'
end

5.times do |i|
  puts "#{i}.hello"
end

この時、iは1からではなく、0から始まります。

182.繰り返し処理while

指定した条件が真である限り繰り返す処理です。

条件を指定せずに無限ループにならないように注意しましょう。

183.繰り返し処理 upto,downto

Uptoは数値を1ずつ増やしながら何かしらの処理をしたい時に使い、downtoは1ずつ減らしながら何かしらの処理をしたい時に使います。

184.繰り返し処理 step

指定した数字から指定した数字まで指定した数字ずつ増えていく処理をしたい時に使います。

構文は、開始式.step(上限値、一度に上限する大きさ)

185.繰り返し処理 loop, break, next

Loopはあえて無限ループを作りたい時に使います。

Breakで指定したところで中断させることができます。

Nextを使うと、同じブロック内のnext以降の処理が行われずに次の繰り返しが行われます。

186.クラス

クラスは設計図のようなもので、インスタンスは実体と考えることもできます。

用意されているクラスもたくさんあるのですが、自分でクラスを作る方法を学びました。

Progateではinitializedメソッドの中のインスタンス変数はself.name=nameのように記述していたのですが、この講座では@name=nameのように記述していました。

違いはありますが、基本的な考え方は一緒ですね。

class User

  def initialize(name)
    puts 'initialize!!'
    @name = name
  end

  def hello
    puts "Hello! I am #{@name}."
  end
end

emma = User.new('Emma')
emma.hello

olivia = User.new('Olivia')
olivia.hello

187.アクセサ

attr_accessorなどのアクセサについてです。

インスタンス変数の値を読み書きするメソッドのことをアクセサメソッドと言います。

アクセサメソッドには読み取り専用のもの、書き込み専用のものもあります。

具体的な使用場面についてはまだよくわかっていませんが、切った貼ったができる便利なものだというニュアンスはわかった気がします。

188.訂正:クラスメソッド、クラス変数

189のスペルミスのお詫びです。

189.クラスメソッド、クラス変数

クラスメソッドは、インスタンスを生成せずにクラスから直接呼ぶことができるメソッドです。

クラス変数は、クラス自体に値を保持することができる変数です。

190.クラスの継承

継承とは、親クラスを受け継いで使うことです。

継承を使うことで、共通部分を繰り返し書く必要がなくなるので、楽にコーディングできますね。

子クラスの方でオーバーライド(上書き)すると子クラスの方が優先されます。

191.メソッドのアクセス権

メソッドのアクセスできる条件を指定することができます。

メソッドのアクセス権には3つの種類があります。

Public→クラスの外部からでも自由に呼び出せる(デフォルト)

Private→クラスの内部でのみ使えます

Protected→これはあまり使われないそうです。

メソッドの上にprivateと書くだけでprivate化できます。

192.モジュール

モジュールはクラスのようにメソッドや定数をまとめられるものです。

クラスのようにインスタンスを作ることはできませんが、関連するメソッドなどをまとめてグループ化したい時に手軽に使えるため、便利です。

193:例外

実務では例外が発生した時の処理を記述しておくことが大事だそうです。

194.Rubyのコーディングルール

プロジェクトメンバーと一緒にコーディングするときに参考にする共通のルールです。

The Ruby Style Guide (日本語)(https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md)

RuboCop(https://github.com/bbatsov/rubocop)

セクション13 Ruby入門 全体の感想

パソコンのバッテリー残量の関係でかなり急ぎ足で終わらせました。

まだまだ理解できたいないところだらけですが、Progateをやっていたこともあり、理解できる部分も多くありました。

ひとまず完走することを第一に考え、このまま突き進みます。

きっと2回、3回と繰り返し触れていけば簡単になるはず!!!



あと残り87パートになりました。

このまま突っ走ります。

ということで、引き続き明日からもプログラミング学習頑張ります。

おわり

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

知識0からAWS構築までの流れ

はじめに

まずはじめにAWSとは一つのサーバーのことではありません!

これは真面目に自分がはじめにそう思っていたので言っておきます。

AWSとはアマゾンウェブサービスです。つまり、何かWEBアプリや開発を行う際に必要なドメインやらサーバーやら色々なサービスを提供しているサービスなのです。

AWSを使うということは、これら多種多様なサービスを自身の開発したいモノに合わせて効率よく組み合わせていくことなのです。

今回はAWSを使ってホームページを作成して、そのホームページにwebアプリケーションを掲載するために必要な環境(インフラ)を構築していきます。

目次
1_AWSインフラとは
 1_全体像
 2_メリット・デメリット
2_環境設定
 1_アカウント登録
 2_IAM Identity and Access Management(ユーザー作成・権限付与)
 3_Route53 (ドメイン取得)
3_動的コンテンツ処理
 1_VPC Virtual Private Cloud(仮想ネットワーク構築)
 2_EC2 Elastic Compute Cloud(webアプリケーションサーバー)
 3_ELB Elastic Load Balancing(AZが複数ある場合)
 4_RDS Relational Database Service(データベースサーバー)
4_静的コンテンツ処理
 1_S3 Simple Storage Service(Webサーバー)
 2_CloudFornt
5_もっと効率的に使うために
 1_CLI Command line interface(AWSをコマンドラインで操作するもの)
 2_Elastic Beanstalk
 3_Cloud9

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

AWSで簡易なSFTPサーバー構築 - SFTPサーバー設定

ec2-userでSSHログイン

rootユーザに変更

$ sudo su -

ユーザー作成

# useradd ユーザー名

rootユーザーからexit

# exit

作成したユーザーに変更

$ sudo su 作成したユーザー名

作成したユーザーのホームディレクトリに移動

$ cd /home/作成したユーザー名

.sshディレクトリ作成

$ mkdir .ssh

.sshディレクトリのパーミッション(権限)を700に変更

$ chmod 700 .ssh

.sshの直下にauthorized_keysファイル作成

$ touch .ssh/authorized_keys

authorized_keysファイルのパーミッションを600に変更

$ chmod 600 .ssh/authorized_keys

秘密鍵公開鍵の準備

Puttygenで公開鍵のスクリーンをドラッグしてコピー

authorized_keysに公開鍵を貼り付け

cat >> .ssh/authorized_keys

入力モードになるので、(Puttyの場合)Shift + insertボタン押下
Enter
:q + Enter
でプロンプトに戻る

別のPuttyセッションを立上、作成したユーザー名で作成した秘密鍵でログインできることを確認

sftpコマンドでのみ接続を許可させる

authorized_keysの先頭に下記の記載を追加し、改行を入れる。
/home/[user_dir]/.ssh/authorized_keys
command="internal-sftp"

あとはこちらの記事を参考にできました。ありがとうございます。

https://qiita.com/rjge/items/221727f010f63be07ff4

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

AWS DeepRacer(実機)の初期設定をしてみた

AWS DeepRacerについて

AWS DeepRacer
re:Invent2018で発表された、強化学習により駆動する1/18スケールの完全自走型レーシングカーです。
ワークショップに参加し実機を入手できたので触ってみました。
備忘録も兼ねて、初期設定〜テスト走行まで書いてみたいと思います。

ちなみに、
実機の発売日はUSでは2019/4/15となっているようです。
AWS DeepRacer – Fully autonomous 1/18th scale race car for developers

また、AWSのサービスの方は現在プレビューの申込み受付中となっています。

マニュアル

公式ページからセットアップ方法についてのPDFファイルがダウンロードできます。
この他、チュートリアルのマニュアル等も用意されています。

初期設定

公式のPDFの手順に沿って設定していきます。
※各設定手順の説明画像はPDFにあるので省略します。

内容物

省略します。

他に必要なもの

  • PC等(USBポートを備えた、インターネット接続可能なもの)
  • USBフラッシュドライブ
  • Wi-Fiネットワーク
  • AWSアカウント

DeepRacerの組み立て

車体用とコンピュータ用の2種類バッテリーを取り付けます。
車体のボディを外した状態から始めます。

車体用バッテリー

車体横にある4本のピンを外して車体を持ち上げ、赤いコネクタを接続します。
バッテリーからは赤いコネクタと白いコネクタの2本が出ていますが、白い方は充電用です。
コネクタを接続したら車体に載せてストラップで固定し、車体を戻して再度ピンで留めます。

コンピュータ用バッテリー

USB-CのASUS製モバイルバッテリーです。容量なんと13600mAh
車体上部のスペースに載せ、ストラップで固定します。車体にはまだ接続しません。
車体に載せる際は、接続の都合上バッテリーのUSB-Cコネクタが右後ろ側に来るように配置します。

DeepRacerとの接続

Wi-Fiネットワークを通してDeepRacerとPCを接続します。
DeepRacerをネットワークに接続 → DeepRacer側のIPアドレス取得 → PCからDeepRacerに接続という流れになります。

コンピュータ部分の電源を入れる

車体左側にあるUSB-Cポートに付属のACアダプタを接続し、コンセントから給電される状態にします。
車体右側にある電源ポタンを押します。LEDが緑→青に点灯すればOKです。
(緑から青に変わるまで少し時間がかかりました)

Wi-Fiの設定

Wi-Fiの認証用設定ファイルをPC側でダウンロードします。
ここに接続したいネットワークのSSIDとパスワードを書き込みます。

wifi-creds.txt
###################################################################################
#                                 AWS DeepRacer                                   #
# File name: wifi-creds.txt                                                       #
#                                                                                 #
# To connect the device to Wi-Fi, type your Wi-Fi SSID name and password          #
# (case sensitive) in the corresponding fields below.                             #
# For example:                                                                    #
#      ssid: 'Your-WiFi 100'                                                      #
#      password: 'Passwd1234'                                                     #
#                                                                                 #
# Then follow the instructions on https://aws.amazon.com/startyourengines to      #
# finish the setup process.                                                       #
#                                                                                 #
# WARNING:                                                                        #
#                                                                                 #
# 1. Please make sure the Wi-Fi that the device connects to for the first time    #
# has Internet connection. If not, it will impact the software update and any     #
# subsequent Wi-Fi connections.                                                   #
#                                                                                 #
# 2. Do NOT change the file name or the field name of 'ssid' and 'password',      #
# which are all case sensitive.                                                   #
#                                                                                 #
# 3. Do NOT replace the default single quote signs (''), which are plain text and #
# may not be recognized by the device after editing.                              #
#                                                                                 #
#                                                                                 #
# If the USB drive was plugged into the device before, a list of available Wi-Fi  #
# networks will be automatically generated below, you can simply uncomment the    #
# one you want to connect to by removing the pound sign.                          #
#                                                                                 #
# If you have validated the Wi-Fi credentials but still find the Wi-Fi LED does   #
# not turn to solid blue, try rebooting the device by pressing the 'RESET' button #
# and then plugging in the USB drive again after the power LED turns blue.        #
#                                                                                 #
###################################################################################

# Provide your SSID and password below
ssid: hogehoge
password: fugafuga

※SSIDとパスワードを''で括るとうまく認識されませんでした。

USBフラッシュドライブのルートディレクトリにwifi-creds.txt(ファイル名変更不可)を保存し、DeepRacer機体後部にあるUSBポートに接続します。
設定情報が読み込まれ、WiFiネットワークへの接続がDeepRacer側で行われます。
車体右側のWiFiマークのLEDが青く点灯したら接続OKです。
接続に失敗した場合はLEDが赤く点灯します。

DeepRacer側のネットワーク情報を取得

接続に成功したら一度USBフラッシュドライブを取り外します。そのまま引っこ抜いて大丈夫です。
PC側に接続すると、DeepRacer側のネットワーク状態等が書かれたファイルdevice-status.txtがルートディレクトリに保存されています。

device-status.txt
Hostname: amss-xxxx
Timestamp: 03/01/19 00:00:00
Successfully connected to 'hogehoge':
Device 'mlan0' successfully activated with '12345678-1234-1234-1234-123456789012'.
Connected to WiFi network: hogehoge
Active connections:
  mlan0: 192.168.1.100

DeepRacerに192.168.1.100というIPが割り振られたことが分かります。

DeepRacerに接続

device-status.txtから取得したIPをPCからブラウザに入力しアクセスします。
自己証明書の警告が出ますがそのままアクセスします。
ソフトウェアアップデートの画面が出るので適宜アップデートを行います。

初期設定完了

これで初期設定は完了です。
テスト走行ではバッテリーから給電する必要があるので一度電源を切ります。

コンピュータ部分の電源を切る

車体右側の電源ボタン長押し(5秒程度)でOFFになります。

走らせてみる

電源を入れる

ACアダプタを外し、付属のUSB-Cケーブルでコンピュータ用のバッテリーを接続します。
バッテリーとコンピュータ部分の電源をONにし、Wi-Fiが接続完了になるのを待ちます。
※初期設定が完了していればUSBフラシュドライブを接続する必要はありません。

車体部分の電源を入れる

ホイール4輪の向きを正面に合わせます。
左前輪付近にある車体側の電源スイッチをONにします。

DeepRacerに接続

先程取得したDeepRacerのIPをPC等のブラウザに入力しアクセスします。
ログイン画面が表示され、パスワードの入力を要求されます。パスワードは車体の裏に記載されています。
ログインすると下のような画面になります。左側には車載のカメラの映像が表示されます。
autonomous.png
ManualモードとAutonomousモードが選択でき、上の画面はAutonomousモードになります。

Manualモード

Manualモードに切り替えると実コースがなくても走行させることができます。
画面右側の領域をクリックorタップしドラッグすることでDeepRacerを手動で操縦することができます。
manual.png
思ったよりもかなり速く走ります。
スロットルの最大を50%にしてもコントロールが難しいです。
軽い気持ちで机上で走らせようとすると大変なことになるかもしれません。。

これでDeepRacerを走行させることができました。

Autonomousモード

Autonomousモードでは作成したモデルを実機にロードして走行させることができます。
こちらが本来のDeepRacerの走らせ方になります。
実コースが無いのでここでの説明は省略します。

問題発生…

私が持っているDeepRacer、なぜか後ろ向きに走ります。
ManualモードのUIでは下向きにドラッグで前進していたので違和感を感じていたのですが、試しにAutonomousモードにしてみたところ、勢い良く後ろ向きに走り出しました。
バッテリーを逆に接続してしまったかと思いましたが、コネクタの形状的に+-は間違いようがないのでそもそも配線が逆になっている疑惑。。

配線の繋ぎ直しで解決

ネットで画像検索してみたところ、いくつか配線まで写っている画像が出てきました。
手元の実機では太い導線が下の画像のように →黒、 と繋がっていますが、
画像検索で出てきたものは →黒 と配線されていました。
やはり間違っている。。
cable.png

ということで、結束バンドをちょん切って配線を繋ぎ直したところ無事前向きに走るようになりました。

まとめ

DeepRacer(実機)の初期設定を行い、(初期不良を修理し)走行させることができました。

2019年は世界各地のAWS SummitでAWS DeepRacerリーグが開催予定で、入賞者はre:Invent2019で開催されるAWS DeepRacer チャンピオンカップへの出場権が与えられるそうです。

車体にはmicroSDポートやHDMIポート、未使用のUSBポートもあるので今後の拡張なども期待できそうです。

実コースどこかにないかなぁ。。

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

AWSで簡易なSFTPサーバー構築 - 初期設定

AWSに簡易なSFTPサーバーを立てようとして何度も失敗したので、正しい手順を記録化する話

EC2インスタンスを立てる

立てる過程でKey pair作成

AWSコンソールで、秘密鍵をダウンロード

ローカルマシンにPuttyとPuttygenをインストール

PuttygenでConversionメニューからImport Key. ダウンロードした秘密鍵ファイル.pemを選択。Save private keyで、open-ssh形式の秘密鍵ファイル.ppkを保存

Puttyにセッション作成

AWSコンソールにて対象インスタンスに接続ボタンを押すと表示されるパブリックDNSが接続先DNS
Authに上で作ったOpen SSH形式の秘密鍵.ppkを設定

Open押下でSSHログイン

初期はec2-userであり、rootではない

yum アップデート

$ sudo yum update -y

gitをインストール

'''
$ sudo yum -y install git
'''

Python3をインストール

$ sudo yum install python3

Pyenvのインストール

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

Pathを通す

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

コマンドが通るか確認

$ pyenv -v

必要な依存関係のインストール

$ sudo yum install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel -y

python3.7の場合は以下も必要

sudo yum install libffi-devel

pythonのインストール

pyenv install 3.7.1

バージョンの切替

$ pyenv global 3.7.1
$ pyenv rehash

確認

$ python --version

3.7.1になっていれば成功

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

今度詰めていきたいところ(覚書)

今後詰めていくとこと 優先順位
IAMポリシー
IAM JSON ポリシーエレメントのリファレンス

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

CloudWatch Event + LambdaでBeanstalk環境がデプロイされたらURLをRoute53のレコードに追加するようにする

やりたいこと

BeanstalkのURLは<beanstalk環境名>.<ハッシュ>.<リージョン>.elasticbeanstalk.com
のようになっていて、デプロイのたびにURLが変わります

これを保有する適当なドメイン名にたいして
Route53のホステッドゾーンで名前解決することが出来ます
参考URL: https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customdomains.html

これをデプロイの度に手で書き換えるのは面倒なので
CloudWatch Event + Lambdaで自動化したというのが今回のエントリです

1. CloudWatch Eventの設定

AWSコンソール > CloudWatch > イベント > ルール > ルールの作成 でルール作成画面をひらく
スクリーンショット 2019-03-07 15.19.57.png

赤枠の編集ボタンを押して、JSONの編集画面を開きます
次のJSONをコピペします

 {
   "source": [
     "aws.elasticbeanstalk"
   ],
   "detail-type": [
     "AWS API Call via CloudTrail"
   ],
   "detail": {
     "eventSource": [
       "elasticbeanstalk.amazonaws.com"
     ],
     "eventName": [
       "CreateEnvironment"
     ]
   }
 }

ElastciBeanstalk APIのCreateEnvironmentが着たら発火しますというものです

CloudWatch Eventのターゲットには次の手順で作成するLambdaを指定します

2. Lambda関数をつくる

2-1. BeanstalkのURL取得

 def lambda_handler(event, context):
     eb_environment_name = event['detail']['requestParameters']['environmentName']

    # beanstalk環境のデプロイが遅いためcnameが設定されるまでリトライ
    client_eb = boto3.client('elasticbeanstalk')
    for i in range(0, CONNECTION_RETRY):
        try:
            response_eb = client_eb.describe_environments(
                EnvironmentNames=[
                    eb_environment_name
                ]
            )
            eb_environment_cname = response_eb['Environments'][0]['CNAME']
        except Exception as e:
            print("error:{e} retry:{i}/{max}".format(e=e, i=i, max=CONNECTION_RETRY))
            sleep(20)
        else:
            break

まずはRoute53のエイリアスレコードに設定するためのBeanstalk環境のURLを取得します

CreanteEnvironmentを検知してLambdaが走るのですが
Beanstalk環境の構築が始まってから、URLが設定されるまでラグがあるので
すぐさま取得しに行くと、怒られることがあります
ので、20秒おきにCONNECTION_RETRY分繰り返す処理をいれています

2-2. Route53にレコードを追加

次に、取得したURLをRoute53のホステッドゾーンに追加します

HOSTEDZONE_ID = 'xxxxxxxxxxx' #ホステッドゾーンのidを設定
EB_HOSTEDZONE_ID = 'Z1R25G3KIG2GBW' #東京リージョンのbeanstalkで共通で使われるホステッドゾーンのID

update_domain_name = eb_environment_name + '.example.local.'
client = boto3.client('route53')

try:
    response = client.change_resource_record_sets(
        HostedZoneId = HOSTEDZONE_ID,
        ChangeBatch = {
            'Changes': [
                {
                    'Action': 'UPSERT',
                    'ResourceRecordSet': {
                        'Name': update_domain_name,
                        'Type': 'A',
                        'AliasTarget': {
                            'DNSName': eb_environment_cname,
                            'HostedZoneId': EB_HOSTEDZONE_ID,
                            'EvaluateTargetHealth': False
                        }

                    }

                }
            ]

        }
    )
except ClientError as e:
    response = e

<beanstalk環境名>.example.comに先程取得したbeanstalk環境のURLをエイリアスレコードとして設定します

EB_HOSTEDZONE_ID は各リージョンのBeanstalk環境が共有でつかっているらしいホステッドゾーンID
参考URL: https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html#elasticbeanstalk_region

2-3. 完成したLambda関数

import json
import boto3
from botocore.exceptions import ClientError
from time import sleep


def lambda_handler(event, context):
    HOSTEDZONE_ID = 'xxxxxxxxxxx'
    EB_HOSTEDZONE_ID = 'Z1R25G3KIG2GBW'
    CONNECTION_RETRY = 3

    eb_environment_name = event['detail']['requestParameters']['environmentName']

    client_eb = boto3.client('elasticbeanstalk')
    for i in range(0, CONNECTION_RETRY):
        try:
            response_eb = client_eb.describe_environments(
                EnvironmentNames=[
                    eb_environment_name
                ]
            )
            eb_environment_cname = response_eb['Environments'][0]['CNAME']
        except Exception as e:
            print("error:{e} retry:{i}/{max}".format(e=e, i=i, max=CONNECTION_RETRY))
            sleep(20)
        else:
            break

    update_domain_name = eb_environment_name + '.example.local.'
    client = boto3.client('route53')

    try:
        response = client.change_resource_record_sets(
            HostedZoneId = HOSTEDZONE_ID,
            ChangeBatch = {
                'Changes': [
                    {
                        'Action': 'UPSERT',
                        'ResourceRecordSet': {
                            'Name': update_domain_name,
                            'Type': 'A',
                            'AliasTarget': {
                                'DNSName': eb_environment_cname,
                                'HostedZoneId': EB_HOSTEDZONE_ID,
                                'EvaluateTargetHealth': False
                            }

                        }

                    }
                ]

            }
        )
    except ClientError as e:
        response = e

あとはこれをさきほどのCloudWatchEventのターゲットにすればOK

雑記

たまにbeanstalkのURLが
環境名.ハッシュ値.ap-northeast-1.elasticbeanstalk.comとならず
環境名.ap-northeast-1.elasticbeanstalk.com
ハッシュ値のないURLが付与されるのを確認しているのですが
なんなのでしょうか

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

AWS Powershell TagSpecificationパラメータの書き方

はじめに

公式ドキュメントにはTagSpecificationの書き方が載っていなくて困った。
ググっても出てこないし。

せっかく同時にタグ付与できるのだから作成後にNew-EC2Tagで付けるのはちょっとイケてないですよね

以下サンプル

書き方はどのコマンドレットでも同じで、
Tagを付けるコマンドレットによってResourceTypeを適宜変更する必要があります。

New-EC2VolumeでTagSpecification

複数行版

$TagSpecification = @{
  ResourceType = "Volume";
  Tags         = @(
    @{Key = "hogehoge"; value = "foo"},
    @{Key = "piyopiyo"; Value = "bar"}
  );
}
New-EC2Volume -SnapshotId "snap-xxxxxxxxxxxxxxxxx" -AvailabilityZone "us-east-1f" -TagSpecification $TagSpecification

ワンライナー

New-EC2Volume -SnapshotId "snap-xxxxxxxxxxxxxxxxx" -AvailabilityZone "us-east-1f" -TagSpecification @{ResourceType = "Volume"; Tags = @(@{Key = "hogehoge"; value = "foo"}, @{Key = "piyopiyo"; Value = "bar"}); }

New-EC2SnapshotでTagSpecification

複数行版

$TagSpecification = @{
  ResourceType = "Snapshot";
  Tags         = @(
    @{Key = "hogehoge"; value = "foo"},
    @{Key = "piyopiyo"; Value = "bar"}
  );
}
New-EC2Snapshot -VolumeId "vol-xxxxxxxxxxxxxxxxxx" -TagSpecification $TagSpecification

ワンライナー

New-EC2Snapshot -VolumeId "vol-xxxxxxxxxxxxxxxxxx" -TagSpecification @{ResourceType = "Snapshot"; Tags = @(@{Key = "hogehoge"; value = "foo"}, @{Key = "piyopiyo"; Value = "bar"}); }

使用可能なResourceTypeの一覧

このFields - Nameです。
https://docs.aws.amazon.com/sdkfornet/v3/apidocs/index.html?page=EC2/TEC2TagSpecification.html&tocid=Amazon_EC2_Model_TagSpecification

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

GitLabをAWS上で動かす(2/3)

前回の続きです。

GitLabをAWS上で動かす(1/3)
☞ GitLabをAWS上で動かす(2/3)
GitLabをAWS上で動かす(3/3)

IPv4パブリックIPを設定

ElasticIPを設定

スクリーンショット 2019-03-07 8.44.53.png
作ったインスタンスを選択して右クリック(もしくはアクションから)IPアドレス管理を選択。

スクリーンショット 2019-03-07 8.47.12.png

「ElasticIPを割り当てます」をクリック

スクリーンショット 2019-03-07 8.49.37.png

新しいアドレス割当の画面に遷移するので右下「割り当て」ボタンをクリック

スクリーンショット 2019-03-07 8.50.48.png

成功した場合は問題なく、そのまま「閉じる」ボタンをクリックしてもらって大丈夫ですが、失敗したときは下のようなエラー画面がでます。

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3231383837392f64336235636232302d363862312d656335622d303961302d3233313633616531376237362e706e67.png

私が遭遇したエラーはリージョンあたりのElasticIPの割り当て数が上限に達したとのエラーでした。
その場合は、Amazon EC2 Elastic IP アドレスリクエストフォームから問い合わせて上限を上げてもらいましょう。

上記のエラーを対策したときの記事: AWSでEC2インスタンス作成してElasticIPを割り当てようとしたら怒られた話

ElasticIPの確認

スクリーンショット 2019-03-07 8.57.25.png

ElasticIP一覧に追加されています。
何に使用しているかわかりやすいように適宜名前をつけてあげましょう。

アドレスの関連付け

スクリーンショット 2019-03-07 9.01.04.png

雑に名前をつけたら今度は関連付けをします。
選択して右クリック(またはアクション)から「アドレスの関連付け」を選択

アドレスの関連付けの画面に遷移しますので、画像のように前回作ったインスタンスを選択
スクリーンショット 2019-03-07 9.04.49.png
プライベートIPも選択しましょう。

そして右下の「関連付け」をクリック

スクリーンショット 2019-03-07 9.07.00.png

これで作成したインスタンスとの関連付けができました。

ssh接続確認

IPv4パブリックIPでssh接続

スクリーンショット 2019-03-07 9.08.38.png

インスタンスに戻って確認すると先程割り当てたElasticIPがIPv4パブリックIPに表示されています。(確認終了

ターミナルでssh接続して接続されることを確認!
スクリーンショット 2019-03-07 9.12.53.png


今回は以上です。
次回はGitLabをインストールするところから

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

API Gatewayが繋がらねぇ...

はじめに

普段、主にフロントエンドを触っているのですが、繋がらなかったり、予想外の挙動をしたりと頻繁にパニクるので備忘録的にまとめます。
他にもこんなハマりポイントがあったよみたいな話お待ちしております:runner:

computer_error_bluescreen.png

1. Missing Authentication Token...???

事象

認証なしに設定している、あるいはAuthenticationトークンをヘッダーに詰めていて適切にリクエストしているつもりなのに一生これが返ってくる

原因

APIのデプロイをしていませんでした
初っ端からしょうもないミスで申し訳ないんですが、本当によくやるので。。
リソースに変更を加えたらデプロイをしましょう。
スクリーンショット 2019-03-06 23.34.50.png


2. No 'Access-Control-Allow-Origin' header is present on the requested resource.

事象

通信に失敗して、インスペクタをみたら何やら赤文字で標題のようなメッセージが表示されている

原因

CORSの設定が適切ではなかった。

CORSは、Cross-Origin Resource Sharingの略です。
現在のブラウザでは、クロスサイトスクリプティングを防止するために、特定の条件の時を除き(単純リクエストと呼ばれます。参考:オリジン間リソース共有 (CORS))、プリフライトリクエストというものを実際のリクエスト前に行い、そのレスポンスに応じてHTMLを取得したサーバ以外からデータを取得することを拒否するようになっています。

なので、API Gatewayを使う場合CORSを有効化し、適切に設定してあげる必要があります。
つまり今回のメッセージは、許容されないヘッダーがリクエストに含まれており、エラーが発生したということを示しているということですね。

主なHTTPレスポンスヘッダーは下記のようになります。

HTTPヘッダー名 説明
Access-Control-Allow-Headers 実際のリクエストで許容するヘッダーを指定する
Access-Control-Allow-Methods 実際のリクエストで許容するHTTPメソッドを指定する
Access-Control-Allow-Origin リクエストを許容するオリジンを指定する

例えば、こんな感じ。
スクリーンショット 2019-03-07 0.00.43.png

CORSの有効化を行った後でもOPTIONSメソッドの統合レスポンスにて設定できます
設定したらデプロイしてね:expressionless:


3. エラーレスポンスがすベてCORSエラーになっている

事象

エラーが返ってきてるのはわかるんだけど、CORSで弾かれて詳細が全くわからない。。

原因

API Gatewayでは、統合レスポンスに何らかの原因で到達しなかった場合、ゲートウェイレスポンスというものを返却しますが、こちらのCORS設定が行われていませんでした。

スクリーンショット 2019-03-07 0.07.59.png
こんな感じで、レスポンスヘッダーをよしなに設定してあげるとうまく行くかと思います:ok_hand:


繋がって、ちゃんとエラーさえ返って来れば一安心です。

こちらにゲートウェイレスポンスの詳細が乗っています。
個人的には、エンドポイントの指定を間違えてAPI Configuration Errorが返ってくることとかよくありました。

ところで...

ステージの設定で、Cloud Watch Logsにログを出力することが可能です。
スクリーンショット 2019-03-07 0.14.57.png

それでは、素敵なAPI Gatewayライフを!

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

API Gatewayに繋がらねぇ...

はじめに

普段、主にフロントエンドを触っているのですが、繋がらなかったり、予想外の挙動をしたりと頻繁にパニクるので備忘録的にまとめます。
他にもこんなハマりポイントがあったよみたいな話お待ちしております:runner:

computer_error_bluescreen.png

1. Missing Authentication Token...???

事象

認証なしに設定している、あるいはAuthenticationトークンをヘッダーに詰めていて適切にリクエストしているつもりなのに一生これが返ってくる

原因

APIのデプロイをしていませんでした
初っ端からしょうもないミスで申し訳ないんですが、本当によくやるので。。
リソースに変更を加えたらデプロイをしましょう。
スクリーンショット 2019-03-06 23.34.50.png


2. No 'Access-Control-Allow-Origin' header is present on the requested resource.

事象

通信に失敗して、インスペクタをみたら何やら赤文字で標題のようなメッセージが表示されている

原因

CORSの設定が適切ではなかった。

CORSは、Cross-Origin Resource Sharingの略です。
現在のブラウザでは、クロスサイトスクリプティングを防止するために、特定の条件の時を除き(単純リクエストと呼ばれます。参考:オリジン間リソース共有 (CORS))、プリフライトリクエストというものを実際のリクエスト前に行い、そのレスポンスに応じてHTMLを取得したサーバ以外からデータを取得することを拒否するようになっています。

なので、API Gatewayを使う場合CORSを有効化し、適切に設定してあげる必要があります。
つまり今回のメッセージは、許容されないヘッダーがリクエストに含まれており、エラーが発生したということを示しているということですね。

主なHTTPレスポンスヘッダーは下記のようになります。

HTTPヘッダー名 説明
Access-Control-Allow-Headers 実際のリクエストで許容するヘッダーを指定する
Access-Control-Allow-Methods 実際のリクエストで許容するHTTPメソッドを指定する
Access-Control-Allow-Origin リクエストを許容するオリジンを指定する

例えば、こんな感じ。
スクリーンショット 2019-03-07 0.00.43.png

CORSの有効化を行った後でもOPTIONSメソッドの統合レスポンスにて設定できます
設定したらデプロイしてね:expressionless:


3. エラーレスポンスがすベてCORSエラーになっている

事象

エラーが返ってきてるのはわかるんだけど、CORSで弾かれて詳細が全くわからない。。

原因

API Gatewayでは、統合レスポンスに何らかの原因で到達しなかった場合、ゲートウェイレスポンスというものを返却しますが、こちらのCORS設定が行われていませんでした。

スクリーンショット 2019-03-07 0.07.59.png
こんな感じで、レスポンスヘッダーをよしなに設定してあげるとうまく行くかと思います:ok_hand:


繋がって、ちゃんとエラーさえ返って来れば一安心です。

こちらにゲートウェイレスポンスの詳細が乗っています。
個人的には、エンドポイントの指定を間違えてAPI Configuration Errorが返ってくることとかよくありました。

ところで...

ステージの設定で、Cloud Watch Logsにログを出力することが可能です。
スクリーンショット 2019-03-07 0.14.57.png

それでは、素敵なAPI Gatewayライフを!

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