文系プログラマによるTIPSブログスマートフォン用の表示で見る文系プログラマによるTIPSブログ文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。springbootTwitterGooglePocket全然解らない。私は雰囲気でspring-cloud-starter-awsを使っている・・・・javaやkotlinでorg.springframework.cloud:spring-cloud-starter-awsを使う事がまあまああったりします。これを使うとawsのリージョンを自動取得してくれたり、awsフレンドリーな状態でawsのサービスを扱う事ができるようになります。boot(v1系、v2系のどらでも起きます)build.gradleやpom.xmlにorg.springframework.cloud:spring-cloud-starter-awsを設定しているapplication.ymlにはspring-cloud-starter-awsの設定を何も記述していないエラーを解消した最終的なローカル環境向けのapplication.yml設定いきなり答えを記述すると、EC2以外の環境(ローカル環境等)の場合は、以下になります。ap-northeast-1では、どんなエラーが起きて、どう解決していくかを見ていきます。Nameを自動取得できないよエラーspring-cloud-starter-awsをapplication.ymlの設定無しにそのまま使うと、ローカル環境で以下のエラーが発生します。defined」「stack.config」辺りを見ると何が起きているか解りますね。definedStackTraceからコードを追うと、以下のAssertに引っかかった事が解ります。}順に上から見ていくと、InitializingBeanを継承していて、これはSpring起動時の初期化処理をするもので、更にクラス名が「Auto」と自動で取得をしにいこうとするものであると解ります。続いてフィールドに「amazonCloudFormationClient」「amazonEc2Client」「instanceIdProvider」があります。この変数名から連想される事は、CloudFormationのスタックで使うEC2のインスタンスIDを自動で取得しようとするクラスである、と解ります。instance.いろいろ書いてますが、要は環境がどこであれ、Spring起動時にEC2の情報を自動で収集するからな〜、と言っています。ここで「ローカル環境はEC2じゃないからEC2のインスタンスIDなんて無いんだが」という疑問にぶち当たり、案の定インスタンスIDを取得しようとして100%エラーが発生するわけです。ここで重要なのは、Stack、つまり「CloudFormationが」という部分です。boot(spring-cloud-starter-aws)のCloudFormationの設定で、EC2情報を自動収集しないようにすれば解決しそうです。boot向けの設定に「cloud.aws.stack.auto」が有って初期値は「true」で、自動的にスタック名を収集する設定との事です。これをfalseにすれば自動収集が止まるわけです。application.ymlの設定EC2でない環境でCloudFormationのStack名を収集しないapplication.ymlの設定の仕方EC2でない環境のapplication.ymlが↑この設定にすれば自動収集は止まり、エラーにならなくなります。↑の画像では黄色く警告が出ており、コード補完もできないですが、ちゃんと設定自体は存在して有効になるのでご安心下さい。bootを起動すると、今度は以下のエラーが起きます。available前述同様、対象コードを見てみます。}}EC2のメタデータからインスタンス情報(Region等)を取得しようとするものですね。ローカル環境はEC2でないので、EC2インスタンス情報を取得しようとして100%エラーになるわけです。boot(spring-cloud-starter-aws)のリージョン設定で、EC2情報を自動収集しないようにすれば解決しそうです。初期値は自動収集になっているようです。application.ymlを以下のように設定して起動します。falseこの設定に変更して再起動すると、今度は以下のエラーが出ます。enabled(cloud.aws.region.staticで設定するか、cloud.aws.region.autoで自動設定しろよな)というエラーです。両パラメータには相関があって、自動収集を停止するならばcloud.aws.region.staticを設定しないといけないのです。「static」は「自動収集しないで静的(決め打ち)で設定する」という意味合いですね。ローカル環境なので、以下のようにして、自動収集しないで決め打ちにします。ap-northeast-1これで無事起動します!EC2以外の環境では上記のように自動収集をやめる設定とし、EC2環境の場合は自動収集設定でもよさそうですね。ap-northeast-1これだと、東京リージョンに対応していないAmazonSESの場合、エラーになりそうですよね。(EU-WEST-1).[>https://cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html#_configuring_regions>]「SESは全リージョンに対応してるわけではないから、cloud.aws.region.staticの設定をしても未対応リージョンだとエラーが出るから、別の方法でリージョンを上書きしてくれよな。サンプルとしてaws-config.xmlを使う例が載っています。https://github.com/eugenp/tutorials/blob/master/spring-cloud/spring-cloud-aws/src/main/resources/aws-config.xmlここにSESだけ異なるリージョンを書いてもいいぞー、という事だそうです。実際の開発では、local〜staging環境はオレゴンリージョン、production環境はバージニアリージョン、等と利用環境を分けて、負荷分散やバウンスレートの分けをキッチリする事が多いです。するとaws-config.xmlを環境毎に上書きしないといけないビルド設定が必要になるので、これは嫌です。application.ymlが環境毎に設定を柔軟に変更できる機構があるのですから、それで変更したいですね。AmazonSESのリージョンをソースコード側で変更するいきなりDeprecatedの洗礼を浴びます。amazonSimpleEmailService.setRegionは非推奨なので「AwsClientBuilder.setRegion(String)」を使えとのことです。AwsClientBuilderはabstractクラスであり、実際はAwsClientBuilderを継承しているAmazonSimpleEmailServiceClientBuilderを使えという事になります。github.comで、AmazonSimpleEmailServiceClientBuilderの使い方は公式サイトにズバリそのものがあるので、省略します。docs.aws.amazon.comおまけ:ローカル開発時にML宛にメールを送信したくないんだが!ローカルで開発していて、例えばhtmlメールを実装中だとします。テンプレートエンジンでif文やらfor文やらをゴリゴリ実装していくわけです。他にもtoやccが正常に分岐できているかもテストしたいですよね。するとローカル環境で何度も実際にメール送信してテストしたくなりますね。メール送信先には社内MLが設定される事が多いと思いますが、テストメールが何十通・何百通も送信されると、MLを受信してる人がウザい・全くメールを見なくなる、という事になる可能性があります。バッチで大量のhtmlメールを送信するテストをしたい時等は困ってしまいます。実装をミスって無限ループでSESにメールを送信してしまい、莫大な金額が請求されたりとか。それを回避するため、私はローカル環境の場合はMailCatcher(仮想SMTPサーバ)を利用します。mailcatcher.meMailCatcherは仮想メールサーバなのですが、メールホストをMailCatcherに向けて送信すると、MailCatcherの画面上ではメールの受信フォルダに受信されますが、実際のTO・CC・BCCにメールが送信される事はありません。自分のローカル環境に完全に閉じたメールサーバが構築できるという優れものです。テキストメール・htmlメール・マルチパートメールにも対応しています。これをローカル環境に直接インストールしたくありません。そこでdockerです。bootからMailCatcherに向けてメールが送信できるようにしてみましょう。587:1025port=1080はブラウザで表示する画面用のポート、port=25は一般的なメールサーバのポート、port=465,587はgmailのポート、となります。GETリクエストするとマルチパートメール(テキストメールとhtmlメールが合体したメール)をMailCatcherに送信し、テキスト・htmlの両方が確認でき、メールのソースも確認できる事をGIFアニメにしてみました。TO・CC・BCCに実際にはメールは送信されていません。ここで受信したメールの履歴は、dockerを停止すると全削除されます。Mountすれば永続化もできると思います)ここでは日本語は使っていませんが、ちゃんと日本語も化けずに表示できます。これをローカル環境で用意しておくと、メール送信に関する実装で精神の安定を向上させる事ができます。今回書いたやり方で困るのは、ローカル環境ではSMTPでDockerのMailCatcherに向けて送信したいが、ローカル以外の環境ではSESに送信したい場合、コードの共通化ができるのか?という点です。docs.aws.amazon.com↑このやり方はSMTPプロトコルではなく、SESのAPIで送信します。SMTPで送信する場合はJavaMailSender等を使いますよね。APIだとAmazonSimpleEmailServiceClientBuilderを使い、両者で大分コードが変わります。これを共通化するいい方法があるのかがまだ解っていません。一応AmazonSESもSMTPプロトコルでメール送信する事ができますが、物凄く遅いです。1回のメール送信で2秒くらいかかる程遅いです。あるユースケースとして、メール送信時にユーザーと管理者に異なるメールを同時に送信したい場合があります。その時同期処理で送信すると2秒×2通=4秒もかかります。2通をasync/awaitで非同期送信しても、2秒より速くはなりません。できればSESでSMTPプロトコルは使わず、高速なAPI(AmazonSimpleEmailServiceClientBuilder)を使いたいです。bootで静的リソースにキャッシュ回避のための「?xxx=xxx」を自動追加するできるんだな、これが。pluginはv1.26からJDK1.7が必須になったので注意!皆大好きjenkinsのお話です。週間)昔は業務系SIer、今はベンチャー企業でプログラムを書いています。INFILEを実行できるようにするmacのAutomatorでhomebrewのコマンドをFinderのサービスから実行できるようにするReactオススメ書籍React自体の基礎、AtomicDesignの適用、CSSの運用手法の歴史的な経緯とメリットデメリット、Reduxの基礎、redux-sagaによる非同期処理、サーバサイドレンダリング、テスト、lint、を学ぶ事ができます。単行本(ソフトカバー)この商品を含むブログを見るAngularオススメ書籍Angularを学ぶなら絶対以下がおすすめです!バインディング、ディレクティブ、パイプ、フォーム、コンポーネント、サービス、ルーティング、httpClientによる非同期httpリクエスト、テスト、angular-cli、を非常に丁寧な説明で網羅的に解説しています。大型本この商品を含むブログを見るSEOオススメ書籍SEOを学ぶなら絶対以下がおすすめです!クローラに対して何をどうすればサイトの巡回効率・速度を上げる事ができるのか、どういったマークアップをする事が標準仕様なのか。巷に溢れる業者による経験則に基づくオレオレSEO情報は一切無く、全てGoogle等のオフィシャルな情報に基づいて何をすべきか、どんな手段があるのかを解説されています。プログラマな私が業務で行った施策が多く書かれており、プログラマ寄りで高度な内容となっており、巷のビギナー向けの曖昧な情報集とは一線を画しています。Amazonアソシエイト・プログラムの参加者です。reserved.スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。