GeekFactory

int128.hatenablog.com

2017年の振り返り

2017年のアウトプットを振り返り。 ブクマとスターを合わせて多い順から。 2018年もよろしくお願いします。

Kubernetes nodesをMulti-AZからSingle-AZに移行した

kopsで運用しているKubernetes nodesをMulti-AZからSingle-AZに移行したので作業メモを残しておきます。 us-west-2b や us-west-2c にあるNodesとPersistent Volumesを us-west-2a に移行します。Masterは us-west-2a のままにします。 kops 1.8.0, Kubernet…

インターネットとVPC内部から同一FQDNでアクセス可能な構成

aws

AWSでALBを使う場合に、Security Groupでインターネットからアクセス可能なIPアドレスを制限しながら、VPC内部から同じFQDNでサービスにアクセスできるようにしたい。 TL;DR Requirements: インターネットから https://api.example.com でサービスにアクセス…

KeycloakのSAML SSOでGitLabやMattermostにログインする

KeycloakとGitLabでSAML SSOを設定する方法を説明します。ユーザ管理をKeycloakで行いながら、GitLabやMattermostにSSOできるのでとても便利です。 TL;DR Keycloakはオープンソースの統合ID管理ツールです。OpenID ConnectやSAMLによる認証を提供しています…

GitLabでRDS for PostgreSQLを使う

GitLabでRDS for PostgreSQLを使う場合にハマったのでメモです。 TL;DR GitLabを起動した際のマイグレーションスクリプトで CREATE EXTENSION pg_trgm; が実行されるが、一般ユーザは CREATE EXTENSION の権限を持っていないのでエラーが発生します。 あらか…

GKE with HTTPS by kube-lego

GKEでHTTPSを使う場合のメモです。 kube-legoのサンプルに書いてある通りですが、一部注意が必要です。 github.com まず、kube-legoをデプロイします。 cd lego vim configmap.yaml #...snip data: # modify this to specify your address lego.email: "int1…

AWSでメールを受信してLambdaで処理する

AWSでメールを受信してLambdaで処理するには以下の方法があります。 SES→S3, SES→Lambda SES→SNS→Lambda 大きなメールを受信したい場合は1を選びます。1はS3にメールを格納してから読みに行くため、サイズの大きなメールも受信できます。2では160kB以下のメ…

How to upgrade to ownCloud 10

This will explain how to upgrade ownCloud on Docker Compose. Pull a new image. # docker-compose pull owncloud Run migration. # docker-compose exec --user www-data owncloud /bin/bash $ php occ upgrade If error occurred, remove /apps and ext…

WSLでIDEAを使う

wsl

WSL(Bash on Windows)でIDEA(IntelliJ)を使い始めて少し経ったので雑感をまとめてみます。 IDEAにはJDKなしとJDKありがあります。IDEAに同梱されているJDKはフォントレンダラーが改善されているため、JDKありを使った方がフォントが綺麗になります。これ…

Springでリクエストとレスポンスのログを出力する

Spring MVCでリクエストとレスポンスのログを出力する方法を説明します。 リクエストログだけなら CommonsRequestLoggingFilter もしくは AbstractRequestLoggingFilter を使う方法が簡単です。詳しくは下記の記事で説明しています。 int128.hatenablog.com …

AppEngine + Spring SessionでCookieが出力されない問題

AppEngine/Java + Spring Sessionを使っていて気づいたのですが、セッションの使い方によってクッキーにセッションIDが出力されない場合があります。具体的には以下の場合があります。 Spring SecurityのCSRFフィルタ:OK Spring Securityのログイン:OK Con…

JavaScriptにおけるURLエンコードされたCookieの取得

JavaScriptでURLエンコードされた文字列を変換するには decodeURIComponent を使用しますが、UTF-8以外の場合(Shift-JIS等)は文字コード変換が必要です。encoding.jsを使うと下記のように書けます。 github.com Encoding.codeToString(Encoding.convert(En…

ZipkinのトレースIDを生成して引き継ぐ

ZipkinのトレースIDを引き継ぐ方法のメモです。 ブラウザ or 外部サービス ↓ フロントエンド(トレースIDを生成) ↓ ↓ X-B3-TraceId: xxxx ↓ バックエンドAPI(トレースIDを中継) ↓ ↓ X-B3-TraceId: xxxx ↓ バックエンドAPI フロントエンドがPHPの場合は以…

CircleCIでApp Engine Javaアプリをデプロイする

CircleCI 2.0でGoogle App Engine (Java8 Standard) をデプロイする方法を調べたのでメモ。 google/cloud-sdk イメージを使う。 App Engine SDKとGradleでJavaが必要になるので、 google/cloud-sdk:alpine イメージに openjdk8 を追加する。DebianはJavaの依…

#渋谷java でSwaggerのテンプレートを魔改造した話をした

第二十回 #渋谷java で、複数チームの並行開発におけるSwagger(OpenAPI)の活用についてお話しさせていただきました。 speakerdeck.com TL;DR 複数チームが並行開発を行う場合はインクリメンタルなAPI設計は避けられない。 OpenAPI YAMLからAPI Server, Cli…

Spring Boot + Gradleで依存関係のバージョンが下がる場合の対応策

GradleでSpring Boot Pluginを利用している場合、依存関係のバージョンが勝手に下がることがあります。例えば、 テスティングフレームワークのプロジェクト → spock-core-1.1-groovy-2.4 アプリのプロジェクト → テスティングフレームワークのプロジェクト …

Gradle Swagger Generator Plugin 2.6.0をリリースした

Gradle Swagger Generator Plugin 2.6.0をリリースしました。OpenAPI YAMLのバリデーション、コード生成、Swagger UI生成を行うためのプラグインです。 github.com New features 複数のOpenAPI YAMLを扱う場合に簡潔に記述できるようになりました。これまで…

CloudFront→ELB→EC2構成におけるIPアドレスのアクセス制御

AWSでCloudFront → ELB → EC2の構成を採用する場合に、IPアドレスによるアクセス制御を行う方法を説明します。 方法1: EC2上のWebサーバによるアクセス制御 CloudFrontやELBはリクエストを受けると x-forwarded-for ヘッダにクライアントのIPアドレスを付与…

OpenAPIで同じキーのパラメータを複数受け取る

OpenAPIで同じキーのパラメータを複数受け取りたい場合は collectionFormat: multi を使います。 collectionFormat Determines the format of the array if type array is used. Possible values are: csv - comma separated values foo,bar. ssv - space se…

GitHubのGit Data APIでコミットを作成する

本記事ではGitHub APIを利用してコミットを作成する方法を紹介します。通常はGitクライアントでcommitとpushを行うことでコミットを作成しますが、GitHub APIだけでもコミットを作成できます。 まずはGitのデータ構造を把握しておく必要があります。下図のよ…

Swagger Codegenにおけるカスタムバリデーションの追加

Swagger(OpenAPI)では必須チェック(required: true)や数値型チェック(type: integer)などが用意されており、コード生成時にバリデーションコードを出力できます。しかし、複雑なバリデーションルールを定義するには正規表現に頼らざるを得ないため、YA…

Circle CIでCloud Functionをデプロイする

以前に Circle CIでCloud Functionをデプロイする - GeekFactory というエントリを書きましたが、gcloudコマンドでデプロイする方が簡単でした。gcloudコマンドでデプロイする手順を説明します。 GCPの設定 デプロイに使用するサービスアカウントを作成しま…

Spring Security OAuthにおけるアクセストークン取得失敗時の例外

Spring Security OAuthでアクセストークンの取得に失敗した場合のリトライを設計するため、エラーケースと例外の対応を調べてみました。 アクセストークンの取得をリトライするには以下の2つの方法があります。 アクセストークン取得(AccessTokenProvider#o…

Jenkinsでテストケースを並列実行して所要時間を短縮する

プロダクトが成長するにつれてCIの所要時間が長くなる悩みを抱えている方は多いと思います。本稿では、テストケースの並列実行でスローテストを乗り越える方法を検討します。 CIの所要時間を短縮する戦略 CIの所要時間が長くなる主な原因はテストです。だが…

Circle CIでCloud Functionをデプロイする

Circle CIからGoogle Cloud Functionsに関数をデプロイする方法を調べたのでメモします。 具体的には、GitHub → Circle CI → Cloud Source Repository → Cloud Functionの流れで継続的インテグレーションと継続的デプロイを行います。 開発者がGitHubのリポ…

第10回Jenkins勉強会でエモい話をした

第10回Jenkins勉強会に参加しました。 今回はMultibranch Pipelineの話が多かったですね。GitHub + Jenkinsでチーム開発する時のデファクトですね。 私は本番環境のリリースを自動化したエモい話をしました。 speakerdeck.com LTだったので技術的な話は省き…

Google Cloud FunctionsでTwitter検索のRSSフィードを作る

Twitterの検索結果をRSSフィードで提供するサービスはいくつかありますが、リフレッシュ間隔がいまいちだったのでGoogle Cloud Functionsで自作することにしました。 Twitter Search APIの結果をRSSフィードに変換して返して、SlackでRSSフィードを購読しま…

Spring MVCで所要時間付きのリクエストログを出力する

Spring MVCのアプリケーションでリクエストログを出力するには CommonsRequestLoggingFilter を使うと簡単です。 リクエストログの設定 Spring Bootの場合は以下のように設定します。 @Configuration public class AppConfiguration { @Bean public CommonsR…

Spring Bootアプリケーションのログファイル運用

Spring Bootアプリケーションのログファイル運用についてメモ。 前提 EC2などのクラウドのインスタンスで運用する場合を想定する。 ログ基盤に転送して蓄積する。 インスタンスに残っているログファイルは基本的に見ない。 Spring Bootのログ Spring Bootの…

SetEnvIfでヘッダがない場合の条件の書き方

ApacheのSetEnvIfでヘッダがない場合の条件の書き方を調べてみました。下記のように正規表現に ^$ を指定すると、ヘッダなしにマッチしてくれます。 # x-forwarded-forヘッダがない場合、環境変数noelbを設定する SetEnvIf x-forwarded-for "^$" noelb 例え…