SakuraWi - BLog

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

【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円/年のドメインを購入しました。

Aレコード

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

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

ワードプレスの初期設定

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

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

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

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

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

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

日本語にする

settings -> language

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

settings(設定) -> UTC+9

メールアドレスの設定

自分のものに設定

タイトルの設定

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

Google Analytics設定

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

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

テーマをインストール

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

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

参考

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

【JavaScript】Promiseって何かを知らない。

自分なりの理解メモ

JSでは、処理の順番が書いた順番に担保されない、という問題がある。

下記記事からコードをお借りしました。 https://qiita.com/YoshikiNakamura/items/732ded26c85a7f771a27

処理を待って欲しいが待ってくれない

個人的にすごく理解しやすかった例がこれ。

console.log(1);
setTimeout(function(){console.log(2)}, 1000);
console.log(3);

処理のイメージとしては、 1, 2, 3の順番に出力して欲しい、と思いながら書くケースが多いと思う。

実際に、そういう書き方をしてしまう。

この例だと、さすがにしないっしょって思うかもしれないが、chrome拡張の chrome.tabs.sendMessage( }, function(response){ なんかを使っているとあるあるだと思う。

上記のような場合を処理を待たせて順番に処理するようにできる

Promiseを利用すると順番を担保、処理を待ってから次の処理に移らせることができる。

なので、処理をまってから実行させたい場合などは以下。

関数に切り出して、 return new Promise()させておいて、

test().then( () => {})と書いていく方法もあり。

    new Promise(function(resolve, reject) {
      chrome.tabs.sendMessage(tab.id, { target: "test" }, function(response){
        ... // 条件分岐で成功、失敗など。
        if (成功) {
          resolve();
        } else {
          reject();
        }
      }).then(() => {
         次の処理
      })

うまく動いたかどうか?

処理の順番を追うには、 console.logを適所に仕込んで追ってみるとよかったり。

ref

https://qiita.com/ysk_1031/items/888a84cb259cec4e0625

http://www.tohoho-web.com/ex/promise.html

【AWS lambda】環境変数を利用して実行環境によって処理を切り替える方法

AWS lambdaで開発をしていると、localと本番環境の時に処理だったりpathを切り替えたい時があると思います。

例) layerを利用していて本番の時は /opt配下をみたい

環境変数を利用する

結論から書くと、環境変数に ENVIRONMENT: production などを追加して処理を切り替えるメソッドを追加しました。

ちょっとこれがベストプラクティスではない気がしますが、思いついた限りでまずは動かしたいので、こちらで対応します。

Rubyのcodeのイメージは以下です。

def path
  ENV['ENVIRONMENT'] == 'production' ? '/opt/bin' : 'bin/'
end

ドキュメントはこちら。 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-envvars.html