SakuraWi - BLog

WEBエンジニア。聴いたお話をまとめておく倉庫的な。スタックストックスタック!

localはdockerでMySQLでCircleCIでもRspecを実行する時の注意点

手元のローカルのためのdatabase.ymlとci上で利用するdatabase.ymlは分けたという記事

認識

localで立てたdockerのmysqlと ciでimageで引っ張ってくるmysqlは当然ながら設定が違う。

できるだけ同じようにしておくことが望ましいと思うが、 異なるケースもあるはずなので、それぞれで対応させる必要がある。

手元の環境でrspecを実行する

portの指定やpasswordの指定がある。

docker-compose.ymlの設定をチェックしよう。 portやパスワードを要チェック。

ci

database.yml.ci を用意して、 ciの途中でmvを実行させて上書きする。

run: mv config/database.yml.ci config/database.yml

portなどが異なっているか確認。

      - image: circleci/mysql:5.7
        environment:
          - MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
          - MYSQL_ROOT_HOST: '%'

とかならパスワードはなくてとおる。

test:
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: 'root'
  host: '127.0.0.1'
  database: test_ci

ref

https://qiita.com/AK4747471/items/b2161784065f21cd1645

seed.rbでテーブルの初期化をする 【MySQL】

rails db:seedをした時に毎回テーブルの中身を初期化する処理を書く。

code

ActiveRecord::Base.establish_connection

ActiveRecord::Base.connection.disable_referential_integrity do
  ActiveRecord::Base.connection.tables.each do |table|
    next if table == 'schema_migrations'

    ActiveRecord::Base.connection.execute("TRUNCATE TABLE `#{table}`")
  end
end

table周りの処理で `を書くと、予約語にバッティングしているテーブルがあっても削除できる。 sqlの処理としてぶつからない。

sshについて

メモ

ほかからsshもらった場合

localの.ssh配下にわかるように置く。

権限の調整

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/XXX/.ssh/XXX/XXX_id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "XXX": bad permissions
xxx@xxx.xxx.xxx.xx: Permission denied (publickey).

https://umebius.com/dev/permissions-0644-for-xxx-key-are-too-open-%E6%A8%A9%E9%99%90%E3%82%92%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%81%84%E3%81%84%EF%BC%9F/

chmod 600 file

接続

ssh name@xxx.xxx.xxx.xx -p 9999 -i ~/.ssh/xxx/xxx_id_rsa

【AWS lambda】chat botを使ってエラーをslackに通知させる方法

「AWS lambdaが実行中に失敗したら通知させたい!」

なんてことを思っているそこのエンジニアのあなた。

この記事を読めばあっという間に設定することができます。

ということで、今回は新しく追加された AWSchat botを利用して、slackに通知させてみたいと思います。

slackを用意する

ワークスペースがない場合は追加しましょう。

既存のワークスペースがある方は問題ないです。

全体の流れのイメージ

構成はこんな感じですね。

f:id:Saku-Saku:20200516162617p:plain
構成図

lambdaのエラーをcloud watchで検知。

SNSに投げて、それをchat botが拾って指定したチャンネルで通知。

Amazon SNSでトピックを作成

まずはSNSのトピックを作成します。

f:id:Saku-Saku:20200516163003j:plain

適当にわかる名前であとはデフォルトのままでOKです。

暗号化については暗号化するとうまく動作しなかった?ので、 暗号化の無効化のままでやってます。

chat botを作成、連携

chat botを利用開始します。

AWS サービスからchat botを探すか、ググりましょう。

開始するとチャットクライアントを選択するので、slackを選びます。

するといつもの権限リクエストの画面に。

ワークスペースを選んで連携します。

たったこれだけでOK!

chat botの設定をする

f:id:Saku-Saku:20200516163349j:plain

chat botで設定をします。

f:id:Saku-Saku:20200516164006p:plain
設定の注意点

下記、項目ごとに説明します。

Amazon CloudWatch Logs にログを発行する

Amazon CloudWatch Logs にログを発行する

これにチェック入れるとlogを残してくれるみたいです。

チャンネル

slackの通知するチャンネルを選びます。

privateでも可能。

privateだと、

/invite @aws

のコマンドで招待しておく必要がありそうです。

アクセス許可

既存のIAMは基本的にないと思うので、テンプレートを使用してIAMロールの作成で良いと思います。

ようは、「通知のアクセス許可」がついていればOKです。

通知

ここで先ほど作成したSNSトピックを選択します。

regionを選択すると、さっきつくったトピックが選べるはずです。

SNSトピックでサブスクリプションを選ぶ

この後に、再度トピックの設定画面へ。

するとchat botの設定をするといったflashが上部にでているのでクリック。

f:id:Saku-Saku:20200516164542j:plain

上記のように設定されていればOKだと思います。

cloud wathのアラーム設定

アラームの設定を追加していきます。

f:id:Saku-Saku:20200516164700j:plain

メトリクスは検知するスコープみたいなものです。 何の状態を検知するの?って感じ。

f:id:Saku-Saku:20200516164813j:plain

今回はlambdaなのでこれを選びます。

lambda -> 関数別 -> 関数名(メトリクス名:エラー)

で選ぶとよいです。

1つ選択したらメトリクスの選択をクリック。

f:id:Saku-Saku:20200516165042j:plain

条件はエラーが一個でも起きたら、というふうに設定してみました。

呼び出し回数でも設定できますね。

異常な回数のlambdaが発火されたら通知としておくと、請求が怖くないかもです。

で、最後に通知先の設定です。

f:id:Saku-Saku:20200516165350j:plain

さきほど作ったSNSがあるので、既存のSNSトピックの選択から、名前が候補にでてくるので選びます。

これで準備OKです!

確認する

lambdaの関数でテストなどでエラーを発生させると無事、slackに通知させることができます。

チェックができればあとはそのままで問題なしです。

参考

http://blog.serverworks.co.jp/tech/2020/04/26/aws-chatbot-now-generally-available/

【Amazon Lightsail】wordpressを公開!最初にする設定【GoogleDmainsを利用】

Amazon Lightsailを利用して、wordpressをインストール。

サイトを立ち上げます。

Amazon LightsailはEC2の超簡易版って思ってもらったらOK。

Amazon Lightsailを利用する

ちなみにメリットとしては、超簡単に始められる。 料金が安いプランが3.5$/月

AWSなので、バックアップのスナップショットも簡単にとれるし、サーバの強化も簡単。

デメリットとしては、エンジニアじゃないとわかりにくかったりすることがあるかも?くらい。

個人的に普通のサーバより安いし、良いと思っている。

やってみないとわからねーだろ、というのもあり。

https://aws.amazon.com/jp/lightsail/

導入

公式ドキュメントで十分です。

鬼わかりやすいです。

https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/getting-started-with-wordpress-and-lightsail

https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/amazon-lightsail-using-lets-encrypt-certificates-with-wordpress

ドメインの取得

お名前.comの利用と迷いましたが、安心安全のgoogleのサービスである、google dmainsを使ってみました。

.jpなどのドメインはカバーしていないようですが、値段も明確だし、なによりもUIが使いやすい&わかりやすい。

使い方はググらずともわかります。

1400円/年のドメインを購入しました。

静的IPアドレスを取得する

インスタンスに静的IPをアタッチする

bitnamiのpass (WordPressのログインのため)

cat bitnami_application_password

Aレコード

サブドメに @, 転送先には、候補がでてくるので、そちらを選択

プラグイン導入 -> SSL有効化する

ワードプレスの初期設定

Amazon Lightsailの設定も完了し、SSLでの接続、証明書の取得などの初期設定を完了。

そのあと、ワードプレス自体の設定を進めます。

これだけはやっとけ、的なものを片っ端からやっていきます。

これについてはひたすらググって設定の繰り返し。

ワードプレスも初見なので、知見がないです。

はてなブログSEOのノウハウはあるので、その辺を活かせるようにしていきます。

日本語にする

settings -> language

タイムゾーンを日本にする

settings(設定) -> UTC+9

メールアドレスの設定

自分のものに設定

タイトルの設定

サイト名は大切なので、結構検討してから入力。

Google Analytics設定

All In One SEO Packを導入して、IDだけを貼り付ける場所があるので、そこに貼り付け。

scriptタグは貼らなくてもOK。

2021/6/3 できなくなった? lnsight的なプラグインGoogleアカウント連携しないとだめになったかも

テーマをインストール

zipのものをアップロードする必要あり。

cocoonあたりが無料でおすすめのようです。

binamiを消す

sudo /opt/bitnami/apps/wordpress/bnconfig --disable_banner 1

パーマネントリンクの設定をする

url決定のために非常に重要

/%postname%

ドメインDNS設定がlightsailの3つの制限を超えた場合

ホストゾーンを追加する

レコードでIPのマッピングをつくる

https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/amazon-lightsail-using-route-53-to-point-a-domain-to-an-instance

参考

https://bazubu.com/wp-initial-settings-22899.html

【Ruby】Seleniumで要素を除外して取得する方法

Seleniumを利用していると取得したくない要素も取得してしまってうまく動作しないことがあると思います。

除外するメソッドは用意されていないみたいです。

Ruby on Railsを書いているひとであれば、 .notとかしたくなると思います。 jQueryでも.notでclassが指定できたりしますよね。

Seleniumを利用している際は、
結論から書くと引き算すればOKです。

要素の引き算をする

all = driver.find_elements(:css, '.all-count')
exclude_element = driver.find_elements(:css, '.sub')
resulet = all - exclude_element

とすればresultの中身は除外したものだけになります。

ドキュメント

https://www.selenium.dev/documentation/ja/webdriver/web_element/

【Google SpreadSheet】WebAPIにしてGETした時のリダイレクトへの対応【Ruby】

GoogleSpreadsheet(スプレッドシート)をWeb APIにして公開、RubyでGETしようとするとリダイレクトさせないとエラーになってしまいます。

302 Moved Temporarily が返ってきてしまいます。

これに対応します。

GoogleSpreadsheetのAPIのredirectに対応する方法

結論から書くと、rubyで以下のように書くことでredirect先のjsonなどのデータを返してくれます。

responseが302だった場合にその先に再度getする、という処理です。

google_uri = URI.parse(GOOGLE_SP_URL)
response = Net::HTTP.get_response(google_uri)
if response.code == "302"
  response = Net::HTTP.get_response(URI.parse(response.header['location']))
end
result = JSON.parse(response.body)

なぜスプレッドシートはリダイレクト先にデータを置くのか?

この理由については公式ドキュメントにも書かれています。
セキュリティ面を考慮してのことのようですね。

For security reasons, content returned by the Content service isn't served from script.google.com, but instead redirected to a one-time URL at script.googleusercontent.com. This means that if you use the Content service to return data to another application, you must ensure that the HTTP client is configured to follow redirects. For example, in the cURL command line utility, add the flag -L. Check the documentation for your HTTP client for more information on how to enable this behavior.

ワンタイムURLで取得させるようにしているみたいです。

https://developers.google.com/apps-script/guides/content#redirects