Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

Heroku Add-onsのSendGridトラブルシューティング

Twitterでよく「HerokuからSendGridが使えなくて困っている」というのを見かけるので、実際どんな感じなのか試してみました。

Herokuのコマンドと画面でそれぞれ10回ぐらいSendGrid Add-onsを試したところ、8割は成功で
・メールが送信できる
・宛先にも届く
という結果でした。

残り2割は以下の1と2でした。私は再現できませんでしたが、3に該当するケースもあるようです。

  1. SendGridにログインできない
  2. SendGridにログインできる。APIキーを作れてメールの送信はできるが宛先に届かない。一度ログアウトするとログインできなくなる
  3. SendGridにログインできる。APIキーを作成できる、メールの送信はできるが宛先に届かない。ダッシュボード上に「Your account has been suspended. Please contact Support to regain access. 」のエラーがでる。

なんでいきなり使えないの?と不満に思われる方も多いと思いますが、SendGridではスパムメール対策のためにアカウントを次の状態にすることがあります。

・Suspension...送信リクエストは受け付けるがメールは送信されない状態
・Ban...アカウントが凍結してまったく使えない状態

Heroku経由だと誰でも簡単にアカウントが作成できてしまうため、作成後に一定の確率で上記の状態にしているように見えます。(私の推測です)

今回の記事では、1〜3の問題を解決する方法と、Heroku以外のアカウントを使って回避する方法を紹介します。

SendGridにログインできない(1のケース)

確認したこと

Add-onsを追加後、通常はHerokuのOverviewまたはResourcesからSendGridにログインできます。

OverviewからSendGridのダッシュボード表示image
OverviewからSendGridのダッシュボード表示

ResourcesメニューからSendGridのダッシュボード表示

成功するとSendGridのダッシュボードが表示されます。

ログインに成功した場合:SendGridのダッシュボード
ログインに成功した場合:SendGridのダッシュボード

1のケースでログインできないときは「sendgrid.comへのアクセスが拒否されました」と表示されます。(キャプチャはGoogle Chromeです)一瞬、ネットワークが切れたのかと思いました。

sendgrid.comへのアクセスが拒否されました
ログインに失敗した場合:sendgrid.comへのアクセスが拒否されました

クリックした後の認証が何らか失敗しているだけなのかな?と思って、ユーザ名とパスワードを調べてログイン画面で試しましたがダメでした。

ちなみにユーザ名とパスワードは以下で確認できます。

コマンドの場合

heroku config:get SENDGRID_USERNAME -a herokusendgrid(アプリ名)
heroku config:get SENDGRID_PASSWORD -a herokusendgrid(アプリ名)

画面の場合

「Settings」で「Reveal Config Vars」ボタンを押すと表示されます。

SendGridのログイン情報の確認方法(画面)
SendGridのログイン情報の確認方法(画面)


解決方法

ログインできないので、どうしようもないです。一番早いのはアプリごとまるっと削除して作り直すことでした。

ちなみにアプリごと再作成するのではなくAdd-onsのみの再作成でいけないか試したのですが、ダメでした。これをやると次のエラーになります。


Item could not be created:
An error was encountered when contacting the add-on partner to create sendgrid:starter: Error Provisioning User - User status - banned

エラーメッセージを見るとアカウントがbanされた状態に当たり、Add-onsだけを再作成しても変わらないようです。

SendGridにログインできてAPIキーは作成できるがメールは送れない。一度ログアウトするとログインできなくなる。(2のケース)

一見問題がないように見えるため、個人的にはこのケースが一番厄介だと思いました。

確認したこと

1と異なりSendGridにログインができたら、以下の記事を参考にAPIリファレンスのTry it out機能を使ってメールを送信します。

SendGrid 新人成長記 第二回 Web APIを使ってメールを送ってみた | SendGridブログ

応答コードは2xxで成功しているのに、メールが届かない(迷惑メールフォルダ含め)場合はActivity画面をチェックしてください。Activity画面で以下のように何もイベントが発生していない場合は、今回のケースに該当している可能性が高いです。

f:id:kikutaro777:20200413005449p:plain

一度ログアウトして、もう一度ログインしてみてください。1のケースと同じ画面が出たらアウトです。

解決方法

1の解決方法と同じです。アプリを再作成してください。

「Your account has been suspended. Please contact Support to regain access. 」のエラーが出る(3のケース)

確認したこと

冒頭に書いた通り私は再現できませんでしたが、以下の記事など該当するケースはあるようです。

qiita.com

qiita.com

解決方法

上記の記事のとおり、米国のSendGridに英語で問い合わせると使える状態にしてくれるようです。
*後述しますが、国内代理店の構造計画研究所では対応できないのでご注意ください。

Heroku以外のアカウントを使う方法

ここまでエラーごとの解決方法について触れてきました。これらの問題について、日本でSendGridの代理店をしている構造計画研究所にサポートを求めようとする方もいらっしゃると思いますが、残念ながらHerokuやMicrosoft AzureのSendGridアカウントはサポート対象外なのでご注意ください。

Azure marketplace等のアドオンとしてSendGridを利用していますが、日本語サポートは受けられますか? – サポート

今回紹介した問題を最初から回避したい場合は、構造計画研究所経由でアカウントを作るという選択肢もあります。その場合はHerokuと異なり、アカウントの審査があるので発行されるまでのスピードはHerokuに劣ります。その代わり、発行されたアカウントでは今回の問題に当たることなく使えます。(もちろん悪い送信をして、SendGridから止められることはあります。あくまでアカウント取得した直後に使えない状態となることはない、という意味です)

MicroProfile Starterで作ったWebをHerokuで動かすとError R10 (Boot timeout)エラーになるのを解決する

Spring InitializrのようにMicroProfileのプロジェクトを作れるMicroProfile Starterについて先日ブログを書きました。

kikutaro777.hatenablog.com

このStareterで作ったWebアプリをHeroku上で動かしたいなと思ったのですが、デプロイしてサーバ起動後にError R10 (Boot timeout)エラーとなりました。

解決方法

localhostを0.0.0.0に書き換えるで解決しました(^^;

色々調べたところ最終的に以下のページにたどり着きました。

stackoverflow.com

上記の中にコメントがあるのですが、localhostの定義を0.0.0.0にすると動くとのことです。さっそくproject-defaults.ymlを開いて、以下の修正をしました。

# A project defaults for use with MP-JWT auth-method that include additional role mapping
swarm:
  bind:
 #address: localhost
 address: 0.0.0.0

これでデプロイしたらエラーは発生せず、画面にアクセスできました。

MicroProfile Starterのサンプル
MicroProfile Starterのサンプル

めでたしめでたし。

しかしなぜこうしなければならないのか…。node.jsの例ですが、Herokuの公式でもlocalhostじゃなくて0.0.0.0にしてね、というのがありましたが、理由がイマイチわかっていないです…。

help.heroku.com


Herokuにアップするためにやったことは次のとおりです。

Procfileの追加

以下内容のProcfileを追加しました。

web: java $JAVA_OPTS -Dswarm.http.port=$PORT -jar target/microprofilesample-thorntail.jar

ポートの指定方法は、HerokuのページにちゃんとThorntailの例がありました。素晴らしい。

Setting the HTTP Port for Java Applications | Heroku Dev Center

これでデプロイしたところThrontail is Readyになったあと、しばらくするとCrashしました。エラーは次の内容です。あとは冒頭の「解決方法」を参照してください。

 Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 90 seconds of launch

サンプルコード

今回試したサンプルコードは以下にあります。といってもコードはMicroProfile Starterそのままです(^^;

github.com

LINE Messaging APIで「若様bot」を作ってみました

なんだか今日は乃木坂46関連で色々とニュースが流れていて(ひめたん17th活動停止、まなったん写真集、文春砲…)大変な日です。

そんなニュースを横目に、コツコツとbotを作ってました。まだ開発途中なのですが、紹介ページも作ってみたので公開してみます(^^;

wakasamabot.sakamichi46.com

上記ページにもLINEで友だち追加するQRコードなどありますが、ここにも


f:id:kikutaro777:20170128222526p:plain:w200

LINEの友だち追加

このbotは、私が大好きな乃木坂46の若月佑美さんのAIと会話できるbotです。主には

  • 「若様」と話しかけるとブログなどの情報リンクを返してくれる
  • 「こんばんは」と話しかけると「こんばんわかつき~」と若ちゃん挨拶を返してくれる
  • 「写真」「画像」など話かけると若ちゃんの写真をランダムに送ってくれる


f:id:kikutaro777:20170125001539p:plain:w350

と、非常に俺得なbotとなっております。とはいえ当初目的は、若ちゃんの素晴らしさをもっと広めたい!という所ですので、もう少し一般的に楽しめる機能も少ないですが入れています。

  • 普通にトークできる機能(現状、文脈は取れないです)
  • 若ちゃんがやってるラジオ「エバンジェリストスクール」の「略語コーナー」再演


f:id:kikutaro777:20170125001600p:plain:w350

このブログみてくれる方は情報系学生さんやエンジニアの方が多いと思いますが、例えば「IBM」って何の略語かわかりますか(^^)?私はわかりませんでしたw ラジオでそういうやりとりをするコーナーがあるんですが、普段IT業界にいてもハっとさせられることが多いです。エバンジェリストスクール、略してエバスクに興味もった方は以下読んでみてください~。

kikutaro777.hatenablog.com

技術スタック的には

Bot

  • Heroku
  • Spring Boot
  • Cognitive Services(現状はBing Image Search API,QnA Maker)
  • DoCoMo 雑談対話 API

Web Site

などを利用しています。今後まだ機能拡張する予定で、Cognitive ServicesはもういくつかAPIを利用するつもりです。


現状、アイコンに若月さんの写真を使ってしまっているので、この辺は肖像権の話などありますので、変更していく予定です。せっかくなので、もう少し拡張して「LINE BOT AWARDS」に登録したいなぁと思っており、規約にもちゃんと以下明記されていましたので。

f:id:kikutaro777:20170128223252p:plain

こういうBotってどうしてもアイドルとかアニメなど、身近なネタと絡めたくなるので、こういう所が難しいですね(^^;もし、若ちゃんの似顔絵画像とか描きますよ!という方などいらっしゃったら、お声かけいただけると嬉しいです(>_<)

Spring BootとLINE Messaging APIで作ったLINE BOTをHerokuで動かす

やっと触れましたLINE Messaging API。やばい、なにこれめっちゃ楽しい。

上のは完全に遊びですが、仕事でも真面目に検討してもいいのかもって今更ながら真面目に思い始めました。QRコードから簡単に友だち追加できるので、何かと初速が速いなぁと。とりあえずスマホだけあれば良いわけですし。と当たり前なことを今更言ってしまうぐらい楽しいです。

Javaな方々は公式からThe Messaging API SDK for Javaが出てるので、これで簡単に始められます。

github.com

ドキュメントは以下参照。

LINE API Reference

line-bot-spring-boot moduleもあるのでSpring Bootの勉強がてら始めるのもホントおすすめです(自分は完全にそんな感じ)

GitHubのページにサンプルコードありますが、単純に送ったメッセージをやまびこのようにブーメランするだけなら

package com.example.bot.spring.echo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.linecorp.bot.model.event.Event;
import com.linecorp.bot.model.event.MessageEvent;
import com.linecorp.bot.model.event.message.TextMessageContent;
import com.linecorp.bot.model.message.TextMessage;
import com.linecorp.bot.spring.boot.annotation.EventMapping;
import com.linecorp.bot.spring.boot.annotation.LineMessageHandler;

@SpringBootApplication
@LineMessageHandler
public class EchoApplication {
    public static void main(String[] args) {
        SpringApplication.run(EchoApplication.class, args);
    }

    @EventMapping
    public TextMessage handleTextMessageEvent(MessageEvent<TextMessageContent> event) {
        System.out.println("event: " + event);
        return new TextMessage(event.getMessage().getText());
    }

    @EventMapping
    public void handleDefaultMessageEvent(Event event) {
        System.out.println("event: " + event);
    }
}

で作れます。便利すぎる(^^;

誰でも簡単に、って感じなのだと思いますが、知ってると便利かなと思うことをまとめたいと思います。

クラウドとか使わずローカル環境で動作確認したいとき

当初、なんかサーバとかをクラウドに用意せんと動かせないよなーとか思ってたのですが、去年JJUG CCC 2016 FallでLINEの@tokuhiromさんがLINE BOT ライブコーディングをされていて、ngrokを使う方法を紹介されてました。

Java + spring-boot で書く! LINE BOT ライブコーディング。 · Issue #34 · jjug-ccc/call-for-paper-2016fall · GitHub

ngrokは知っていたので、これ聴いたとき、ぬおおー!その手があったのかって感じでした。(知ってたなら気づけっていう

ngrok.com

ngrok http 8080

と起動すればローカルPCの指定ポートを外部にトンネルしてくれます。

f:id:kikutaro777:20170116222625p:plain

Spring Bootでアプリを起動しておけば、上記ngrokでトンネルされたhttpとhttpsのURLをpublicに使うことできますので、httpsのアドレスをLINE Messaging APIに登録することができます。

f:id:kikutaro777:20170116222900p:plain

httpは以下のように登録できないので、ngrok使ったやり方は非常にお手軽だと思います。証明書もいらないし。

f:id:kikutaro777:20170116222942p:plain

設定まわり URLにcallback

Webhookを登録したとき、Verifyがうまくいかない、と最初ちょっとハマってました。Spring Boot利用したとき、デフォルトでは先ほどのキャプチャにあるように「https://hogehoge.ngrok.io/callback」のような形で「callback」と入れてあげる必要があります。GitHubのConfigurationに、デフォルトが「callback」になっていることが書いてあるのですが最初気づかなくて、ハマってました。

f:id:kikutaro777:20170116224349p:plain

あくまでデフォなので、変えてしまうのもありです。

設定まわり 自動応答メッセージ

ちゃんとドキュメント読めって感じなのですが、最初、WebhookのVerifyが成功してローカルPCにもデータ飛ぶのに、LINEから話かけると常に以下の「メッセージありがとうございます 申し訳ありませんが、このアカウントでは個別のご返信ができないのです 次回の配信をお楽しみに」と出てしまって、わからんーってなってました(^^;

f:id:kikutaro777:20170116223626j:plain

LINE@Managerで「アカウント設定」->「Bot設定」の「詳細設定」->「自動応答メッセージ」を「利用しない」にするだけです。

f:id:kikutaro777:20170116223907p:plain

herokuでhttps

ここまででローカル開発環境で色々遊べるのですが、最後はやっぱり公開してみたい、ということがあると思います。証明書は安いものを取るか、Let's Encryptなど使うか、など選択肢があるかと思いますが、それなりに手間だなぁと。で、探してたらHerokuのAdd-onでFixieを使うと簡単とのこと。

qiita.com

実際に試したらホント簡単でした(^^;

画像や動画、スタンプの認識

最後におまけですが、冒頭に出したサンプルコードはテキストメッセージをやまびこするものでしたが、画像とか動画、スタンプが送られてきた場合、どうフックするのかなーと思ったのですが、@EventMapping使って以下のように定義すれば、そのままフックされました。

@EventMapping
public Message handleStickerMessage(MessageEvent<StickerMessageContent> event) {
    return new TextMessage("スタンプ送信ありがとうございます!");
}
    
@EventMapping
public Message handleImageMessage(MessageEvent<ImageMessageContent> event) {
    return new TextMessage("画像送信ありがとうございます!");
}
    
@EventMapping
public Message handleVideoMessage(MessageEvent<VideoMessageContent> event) {
    return new TextMessage("動画送信ありがとうございます!");
}
    
@EventMapping
public Message handleAudioMessage(MessageEvent<AudioMessageContent> event) {
    return new TextMessage("音声送信ありがとうございます!");
}

@EventMapping
public Message handleFollowEvent(FollowEvent event) {
    return new TextMessage("友達追加ありがとうございます!");
}

Herokuの環境変数利用

LINEのChannelSecretやTokenはコードに埋め込んだり、設定ファイルでGitHubなどにアップするわけにはいかないので、Herokuなどでは環境変数を利用するのが良いかと思います。で、gradleを利用してる場合は

sample-spring-boot-echoのREADMEにあるように
github.com

../gradlew bootRun -Dline.bot.channelToken=YOUR_CHANNEL_TOKEN \
                   -Dline.bot.channelSecret=YOUR_CHANNEL_SECRET

みたいに指定するようです。自分はMaven使ってたのと、application.propertiesを上手く使えないかなぁと思って調べたら

line.bot.channelSecret = ${CHANNEL_SECRET}
line.bot.channelToken = ${CHANNEL_TOKEN}

というように定義することができました。ほえー便利。

ということで、Spring Bootの勉強を楽しみながらするのにもおススメなLINE Messaging APIでした!

すごい面白いのができたらAwardsに出して1000万狙うしかない!(無理

botawards.line.me

JJUGナイトセミナー Javaクラウドプラットフォーム大特集に参加しました!

今日のJJUGナイトセミナーは超豪華でした!仕事を置いてきてでも参加してホント正解(^^)!会社後輩は1人しか来なかった…のですが、ホントもったいないと思う…。

jjug.doorkeeper.jp

発表は以下順番でした。

  1. Heroku
  2. Amazon Web Service
  3. Microsoft Azure
  4. Oracle Java Cloud Service
  5. Cloud Foundry
  6. Google Cloud Platform
  7. OpenShift
  8. IBM Bluemix

当日のつぶやきは既に@yamadamnさんにてまとめられています!

以下、発表者の方のスライドと、過去に自分が触ったときの記事とか合わせて簡単に。

Heroku

Herokuは前にSalesforce Summer(だったかな?)に参加したときに、セッションを聞いて触ってみてました。当時の自分は、Heroku = Ruby on Railsのイメージが凄く強かったのですが、実際に触ってみると、Javaも簡単に動かせて驚いた記憶があります。

今日の発表でも「Spark」に少しだけ触れられてましたが、Sparkのひな形が用意されていて、そこからPayara Microいけるんじゃ?って思った記憶が。

ということで、以前試したHeroku

kikutaro777.hatenablog.com

とPayara Microについて

なお、タイトルにある「12-Factor App」は以下。

12factor.net

日本語訳もあるですね。

12factor.net

AWS

自己紹介の話を聞いてJavaFXの話が聞きたくなりました(^^)w

AWSのBeanstalkは、Docker + GlassFishが使えると聞いて、前に試してました。これも手軽なんですよねー。

kikutaro777.hatenablog.com

他のPaaSに比べて中身の透明性がある(AWSの仕組みで構成されているという意味で)、というのはなるほどーという感じでした。

Azure

OracleでMicrosoftのてらださんがお話をされるという、聞いてる側もまだ何だか不慣れな感じでした(^^;笑

今のMicrosoftはすごくオープン、と強調されてましたが、色んなニュースが続きますよね。

MSがEclipse Foundationに参画したり
www.publickey1.jp

ASP.NETがLinuxで動くとか、先日なんてMS SQL Server on Linuxとか、「は!?」って感じですよね(^^;

jp.techcrunch.com

Azureは自分も一時期いろいろ触ってました。記事としては古いので注意ですが。

kikutaro777.hatenablog.com

Oracle Java Cloud Service

OracleさんのPaaSはまだ触ったことがないのですが、Java Cloud ServiceとApplication Container Serviceの2種類があるとのこと。両方ともFlight Recorderが使える辺りは便利そうですよね。
無料お試しとかあるのかな…。なんとなく気軽に触ってみることができるのか、気になりました。

あと、Java Cloud ServiceはWebLogicだけなのがちょっと残念。GlassFishがあれば…。

Cloud Foundry

Cloud Foundry、よく名前は聞くのですが、全然触ったことないのと、前提知識が薄かったので、今日の@makingさんの発表で勉強になりました!

個人的には「.NETが動く」というのに驚きました。Azure以外でそんなのあるのか!と

3/31にCloud Foundry Tokyo Meetupイベントがあるとのことです!
www.meetup.com

あと、発表者の@makingさんから教えて頂きましたが.NETまわりの仕組みとか聞けるかもです(^^)これはいってみたい。

ハンズオン形式のワークショップもあるそうです。

connpass.com

connpass.com

Google Cloud Platform

やっぱりGoogleの基盤はすごそうだなーと。そして日本にデータセンターという話もホットだったんですね。

www.nikkei.com

OpenShift

Red HatのOpenShiftは、今、自分の中では一番良く利用するPaaSです。発表にもありましたが、無料で使えるPaaSが減ってる中、Java EEのAPサーバ含めて無償枠があるのが嬉しいです。

OpenShift Onlineは現在v2で、v3からはDockerを主軸としたアーキテクチャでガラっと中身を変えたとのこと。

もうすぐv3版のOnlineもでるとのことで、個人的に超たのしみです。

@nekopさんがブログ書かれていました。

nekop.hatenablog.com

OpenShiftを初めて触ったときのエントリもありました(^^;

kikutaro777.hatenablog.com

ちなみに、最近乃木坂46にどハマりしてる自分なのですが、OpenShift上のWildFly + Twitter4Jで以下アプリのっけてます。

Sakamichi46 Collection

作成動機などは以下(^^;;

nogizaka46.hatenablog.jp

脱線しすぎました。

IBM Bluemix

資料はまだでしたが、Blumixも色々面白そうですよね。話題のWatson君とか、IoT関係なども。


ということで、ホントすごく豪華でした!どのPaaSにするか、やっぱり色々触ってみるのがいいですよね(^^)自分の場合は8個中4個は触ったことありますが、少し前なので、それぞれ色々変わってる気がします。触ったことがない中では、やっぱりCloud Foundryが一番気になりました。

触ってみよー。

PayaraMicro on Heroku !

I'm newbie both Payara and Heroku. Though I tried to play with these for preparing my presentation in Japanese GlassFish User Group event.

glassfish.doorkeeper.jp

About one month ago, I participated Japanese Salesforce event. It was called "Salesforce Summer".eventjp.salesforce.com

At the event, I saw Heroku demonstration. This is the reason why I started to use Heroku.After the event, I checked Heroku site and found good Java tutorial. In the tutorial, the sample Java web application used Spark.

I thought that ... if I use Payara Micro, is it possible to deploy Java EE application to Heroku ?

Finally, it could. Here is procedures.

Getting Started with Java on Heroku

Firstly, I started "Getting Started with Java on Heroku". The tutorial is very polite, so it's easy to do.
f:id:kikutaro777:20150914011127j:plain

  • Installing Toolbelt (for Windows on my environment)
  • heroku login

After that, I cloned "java-getting-started" from github.

git clone https://github.com/heroku/java-getting-started.git

And changed directory.

cd java-getting-started

Next

heroku create
git push heroku master
heroku ps:scale web=1
heroku open

Finally I confirmed the deployed page.

f:id:kikutaro777:20150915233153j:plain

These procedures are same as the tutorial.

PayaraMicro on Heroku

I used the same project, it means I used "java-getting-started" project cloned from GitHub.
It's kind of cheat I think. Normally, it had better create as new project.

Firstly, I changed pom.xml.

<dependency>
    <groupId>fish.payara.extras</groupId>
    <artifactId>payara-micro</artifactId>
    <version>4.1.153</version>
    <type>jar</type>
</dependency>

Also, I edited the code like this.

import fish.payara.micro.BootstrapException;
import fish.payara.micro.PayaraMicro;

public class Main {
  public static void main(String[] args) throws BootstrapException {
      PayaraMicro.getInstance()
                .setHttpPort(Integer.parseInt(System.getenv("PORT")))
                .addDeployment("DeployTarget.war")
                .bootStrap();
  }
}

It's very important to call "setHttpPort(Integer.parseInt(System.getenv("PORT")))", because the port of HTTP on Heroku is binded random.

If that helps, I used NetBeans IDE.

f:id:kikutaro777:20150914012105j:plain

After changing code, I copied from WAR file which is target of deploy to this project.
The War was created by Java EE 7, but I used only JSF and CDI.

Finally, I committed the code and "git push heroku master". Everything was done.

Here is my deployed Java EE app with PayaraMicro on Heroku :)
f:id:kikutaro777:20150915233036j:plain

Enjoy!

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村