CodeBuildでDocker imageの作成をするときにDockerfile内の処理へIAM Roleを引き渡す方法

例えば、Dockerfile内のコマンドでS3にファイルをアップロードする処理が挟まっていた場合。
Dockerfile内に ARG AWS_CONTAINER_CREDENTIALS_RELATIVE_URIとして受け取れるようにしてやれば良い。

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/troubleshooting.html#troubleshooting-versions

ビルド環境で Docker コンテナを実行する必要があり、コンテナが AWS 認証情報を必要とする場合は、ビルド環境からコンテナに資格情報を渡す必要があります。
buildspec ファイルに、次のような Docker run コマンドを含めます。
この例では、aws s3 ls コマンドを使用して使用可能な Amazon S3 バケットを一覧表示しています。-e オプションは、コンテナが AWS 認証情報にアクセスするために必要な環境変数を渡します。

ruby 2.7.0入れようとしてopensslのインストール時にldエラー起きたときのメモ

binutilsを消して解決

anatofuz.hatenablog.com

$ rbenv install 2.7.0
Downloading openssl-1.1.1d.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/1e3a91bc1f9dfce01af26026f856e064eab4c8ee0a8f457b5ae30b40b8b711f2
Installing openssl-1.1.1d...

BUILD FAILED (OS X 10.14.6 using ruby-build 20191225)

Inspect or clean up the working tree at /var/folders/r5/_282n9zn4lg2gb29mtz39_8r0000gn/T/ruby-build.20191227155826.29602.YeYTvQ
Results logged to /var/folders/r5/_282n9zn4lg2gb29mtz39_8r0000gn/T/ruby-build.20191227155826.29602.log

Last 10 log lines:
      _s_server_main in s_server.o
  "_verify_stateless_cookie_callback", referenced from:
      _s_server_main in s_server.o
  "_wait_for_async", referenced from:
      _s_client_main in s_client.o
      _sv_body in s_server.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [apps/openssl] Error 1
make: *** [all] Error 2
$ 
$ tail -n 100 /var/folders/r5/_282n9zn4lg2gb29mtz39_8r0000gn/T/ruby-build.20191227155826.29602.log 
  "_save_serial", referenced from:
      _ca_main in ca.o
      _x509_main in x509.o
  "_set_cert_ex", referenced from:
      _ca_main in ca.o
      _req_main in req.o
      _x509_main in x509.o
  "_set_cert_key_stuff", referenced from:
      _s_client_main in s_client.o
      _s_server_main in s_server.o
  "_set_cert_stuff", referenced from:
      _s_time_main in s_time.o
  "_set_cert_times", referenced from:
      _do_body in ca.o
      _req_main in req.o
      _x509_main in x509.o
  "_set_ext_copy", referenced from:
      _ca_main in ca.o
  "_set_keylog_file", referenced from:
      _s_client_main in s_client.o
      _s_server_main in s_server.o
  "_set_nameopt", referenced from:
      _ca_main in ca.o
      _crl_main in crl.o
      _req_main in req.o
      _s_client_main in s_client.o
      _s_server_main in s_server.o
      _s_time_main in s_time.o
      _verify_main in verify.o
      ...
  "_setup_engine", referenced from:
      _ca_main in ca.o
      _cms_main in cms.o
      _dgst_main in dgst.o
      _dhparam_main in dhparam.o
      _dsa_main in dsa.o
      _dsaparam_main in dsaparam.o
      _ec_main in ec.o
      ...
  "_setup_ui_method", referenced from:
      _main in openssl.o
  "_setup_verify", referenced from:
      _cms_main in cms.o
      _crl_main in crl.o
      _ocsp_main in ocsp.o
      _pkcs12_main in pkcs12.o
      _smime_main in smime.o
      _verify_main in verify.o
  "_ssl_ctx_add_crls", referenced from:
      _s_client_main in s_client.o
      _s_server_main in s_server.o
  "_ssl_ctx_security_debug", referenced from:
      _s_client_main in s_client.o
      _s_server_main in s_server.o
  "_ssl_ctx_set_excert", referenced from:
      _s_client_main in s_client.o
      _s_server_main in s_server.o
  "_ssl_excert_free", referenced from:
      _s_client_main in s_client.o
      _s_server_main in s_server.o
  "_ssl_load_stores", referenced from:
      _s_client_main in s_client.o
      _s_server_main in s_server.o
  "_ssl_print_groups", referenced from:
      _www_body in s_server.o
      _print_connection_info in s_server.o
  "_ssl_print_point_formats", referenced from:
      _print_connection_info in s_server.o
  "_ssl_print_sigalgs", referenced from:
      _print_stuff in s_client.o
      _www_body in s_server.o
      _print_connection_info in s_server.o
  "_ssl_print_tmp_key", referenced from:
      _print_stuff in s_client.o
  "_store_setup_crl_download", referenced from:
      _verify_main in verify.o
  "_tlsext_cb", referenced from:
      _s_client_main in s_client.o
      _rev_body in s_server.o
      _www_body in s_server.o
      _sv_body in s_server.o
  "_verify_args", referenced from:
      _s_client_main in s_client.o
      _s_server_main in s_server.o
      _s_time_main in s_time.o
      _doConnection in s_time.o
  "_verify_callback", referenced from:
      _s_client_main in s_client.o
      _s_server_main in s_server.o
  "_verify_cookie_callback", referenced from:
      _s_server_main in s_server.o
  "_verify_stateless_cookie_callback", referenced from:
      _s_server_main in s_server.o
  "_wait_for_async", referenced from:
      _s_client_main in s_client.o
      _sv_body in s_server.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [apps/openssl] Error 1
make: *** [all] Error 2
$ 
$ brew uninstall binutils
Uninstalling /usr/local/Cellar/binutils/2.32... (134 files, 167.5MB)
$ 
$ rbenv install 2.7.0
Downloading openssl-1.1.1d.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/1e3a91bc1f9dfce01af26026f856e064eab4c8ee0a8f457b5ae30b40b8b711f2
Installing openssl-1.1.1d...
Installed openssl-1.1.1d to /Users/st1t/.rbenv/versions/2.7.0

Downloading ruby-2.7.0.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.bz2
Installing ruby-2.7.0...
ruby-build: using readline from homebrew
Installed ruby-2.7.0 to /Users/st1t/.rbenv/versions/2.7.0

$ 

Elastic Stack 7.1をコンテナで適当に触ってる

Elastic ON Tokyoでセッションを聞きながら手元でコンテナ起ち上げて最近のElastic Stackがどんな感じなのかお試し中。

docker-compose.yml

version: '2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.1.1
    environment:
      - discovery.type=single-node
      - node.name=es01
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes:
      - ./mount/es01/usr/share/elasticsearch/data:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
    networks:
      - esnet
  kibana:
    image: docker.elastic.co/kibana/kibana:7.1.1
    environment:
      ELASTICSEARCH_HOSTS: http://es01:9200
    ports:
      - "5601:5601"
    networks:
      - esnet
    depends_on:
      - es01
networks:
  esnet:

動かす

$ docker-compose up

Machine LearningのImport dataでNginxのテストデータを流す

# Elasticでtestデータが置いてあるから落としとく
$ wget https://raw.githubusercontent.com/elastic/examples/master/Common%20Data%20Formats/nginx_logs/nginx_logs
# ログの日時が古いから2019年にしとく@BSD版(Mac)のsedオプション
$ sed -i '' 's%/2015:%/2019:%g' nginx_logs 

あとはWEBから流すだけ

open http://localhost:5601/app/ml#/filedatavisualizer?_g=()

f:id:st1t:20190530150823p:plain

Mac使いな自分がThinkPad T490にUbuntu 18.04を入れたPCに移行したときにやったこと

まえがき

タイトルの通り、ThinkPad T490が届いたのでWindow10とデュアルブートする形でUbuntu18.04を入れてそっちをメインにしてみました。 今まではMacユーザだったので、なるべく違和感ない操作にするためにも変更したことをメモしておきます。

画面の解像度

解像度を2048 * 1152(16:9)に変更

今回、WQHDを購入したが、そのままだと文字が小さすぎて辛いので、解像度を2048 * 1152(16:9)に変更した。 Windowsロゴキー-> 設定 -> デバイス -> ディスプレイ


起動時トラブル

WaylandEnableをfalseにする

cat /etc/gdm3/custom.conf
WaylandEnable=false

トラックパッド

ブラウザで指でブラウザバックさせる

github.com

基本的にはINSTALLATIONに従ってインストールしていくだけ。 設定は以下の通り。

$ cat ~/.config/libinput-gestures.conf 
# ブラウザの戻る・進む
gesture swipe left      4 xdotool key alt+Right
gesture swipe right     4 xdotool key alt+Left
# ワークスペースの切り替え
gesture swipe up        3 xdotool key super+Page_Up
gesture swipe down      3 xdotool key super+Page_Down
$
$ libinput-getures-setup restart

キーボード

CapsLockをCtrlにする

gsettings set org.gnome.desktop.input-sources xkb-options "['ctrl:nocaps']"

Tweaks

キーボードとマウス -> 追加のレイアウトオプション -> Alt/Win キーの動作 -> Meta is mapped to Win

キーバインドをEmacsっぽくする

sudo apt install gnome-tweak-tool

日本語入力モード

Mozcだけにして、Mozc内の入力モードをCtrl+Spaceで切り替えられるようにしていく

do-you-linux.com


マウス

qiita.com

※imwheelの自動起動はsystemdだとDISPLAY変数周りでめんどうなので、OSのアクティビティの検索窓から「自動起動するアプリケーションの設定」からコマンドを登録したらいけた。


ターミナル

ホームディレクトリが日本語表示されるのを英語にする

$ LANG=C xdg-user-dirs-gtk-update

open command

$ sudo unlink /bin/open
$ sudo ln -s /usr/bin/xdg-open /bin/open

Google Custom Search APIを叩いてみた

まえがき

ふーむ、と思ってちょっと調べてみました。
Googleのことだから多分検索用のAPI用意されてるだろうし、そこにデータ入ってないかな?がスタートです。

Google Custom Search APIについて

調べてみたら、Google Custom Search JSON APIというものがあるみたいです。

qiita.com

手順については上記ブログで記載があるので割愛します。
一箇所だけ、get_search_response.py内の

def getSearchResponse(project_id, keyword_id, keyword):

は呼び出し元がtarget_keywordだけしか使って使っていなさそうだったので、それ以外の引数を消しました。

def getSearchResponse(keyword):

取れたデータについて

target_keywordを自分のブログのURLを指定してみました。

    target_keyword = 'https://www.st1t.com/entry/2018/12/27/174532'
$ jq . data/response/response_20181228.json 
{
  "snapshot_ymd": "20181228",
  "snapshot_timestamp": "2018/12/28 20:34:11",
  "response": [
    {
      "kind": "customsearch#search",
      "url": {
        "type": "application/json",
        "template": "https://www.googleapis.com/customsearch/v1?q={searchTerms}&num={count?}&start={startIndex?}&lr={language?}&safe={safe?}&cx={cx?}&sort={sort?}&filter={filter?}&gl={gl?}&cr={cr?}&googlehost={googleHost?}&c2coff={disableCnTwTranslation?}&hq={hq?}&hl={hl?}&siteSearch={siteSearch?}&siteSearchFilter={siteSearchFilter?}&exactTerms={exactTerms?}&excludeTerms={excludeTerms?}&linkSite={linkSite?}&orTerms={orTerms?}&relatedSite={relatedSite?}&dateRestrict={dateRestrict?}&lowRange={lowRange?}&highRange={highRange?}&searchType={searchType}&fileType={fileType?}&rights={rights?}&imgSize={imgSize?}&imgType={imgType?}&imgColorType={imgColorType?}&imgDominantColor={imgDominantColor?}&alt=json"
      },
      "queries": {
        "request": [
          {
            "title": "Google Custom Search - https://www.st1t.com/entry/2018/12/27/174532",
            "totalResults": "1",
            "searchTerms": "https://www.st1t.com/entry/2018/12/27/174532",
            "count": 1,
            "startIndex": 1,
            "language": "lang_ja",
            "inputEncoding": "utf8",
            "outputEncoding": "utf8",
            "safe": "off",
            "cx": "000541688366129963034:bisdpfb8q-4"
          }
        ]
      },
      "context": {
        "title": "カスタム検索エンジン"
      },
      "searchInformation": {
        "searchTime": 0.142453,
        "formattedSearchTime": "0.14",
        "totalResults": "1",
        "formattedTotalResults": "1"
      },
      "items": [
        {
          "kind": "customsearch#result",
          "title": "検索システムを作る上で役立つ本 - infra.log",
          "htmlTitle": "検索システムを作る上で役立つ本 - infra.log",
          "link": "https://www.st1t.com/entry/2018/12/27/174532",
          "displayLink": "www.st1t.com",
          "snippet": "1 日前 ... ... 初めて見たくらい良書だと思いました。 買うのが不安な方は立ち読みだけでもいい\nのでまずは見てもらうといいのかなーと思います。 https://www.kindaikagaku.co.jp/\nimg/book/ · https://www.kindaikagaku.co.jp/information/kd0577.htm ...",
          "htmlSnippet": "1 日前 <b>...</b> ... 初めて見たくらい良書だと思いました。 買うのが不安な方は立ち読みだけでもいい<br>\nのでまずは見てもらうといいのかなーと思います。 <b>https</b>://www.kindaikagaku.co.jp/<br>\nimg/book/ &middot; <b>https</b>://www.kindaikagaku.co.jp/information/kd0577.htm&nbsp;...",
          "cacheId": "61D4dXdaVo0J",
          "formattedUrl": "https://www.st1t.com/entry/2018/12/27/174532",
          "htmlFormattedUrl": "<b>https</b>://www.<b>st1t.com/entry</b>/<b>2018/12/27/174532</b>",
          "pagemap": {
            "cse_thumbnail": [
              {
                "width": "170",
                "height": "216",
                "src": "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcShrcLWXuO7jeYzIprdKhrVSMarpKuAKRZZyzQUgBSu4_Dm_JVH-wAukx8"
              }
            ],
            "metatags": [
              {
                "viewport": "width=device-width, initial-scale=1.0",
                "og:title": "検索システムを作る上で役立つ本 - infra.log",
                "og:type": "article",
                "og:url": "https://www.st1t.com/entry/2018/12/27/174532",
                "og:image": "https://www.kindaikagaku.co.jp/img/book/KD0577-170.jpg",
                "og:description": "まえがき 最近Elasticsearchを触る機会が増えつつあるのですが、 そもそも検索を行う際に何をどうしたら良いのか全くわからんって時のためおすすめの書籍をいくつか紹介したいと思います。 また、達人出版社さんから冬休み合同フェアというのが開催されており、 こちらだと電子書籍が半額で買えるのでオススメです。 tatsu-zine.com 初級編 Elasticsearch実践ガイド book.impress.co.jp 全文検索を行おうと思ったら大体最近の流れはElasticsearchにいきつくパターンが多いかと思います。 ただ、公式のドキュメントは英語だったり、そもそも全文検索の界隈で当…",
                "og:site_name": "infra.log",
                "article:published_time": "1545900332",
                "twitter:card": "summary_large_image",
                "twitter:image": "https://www.kindaikagaku.co.jp/img/book/KD0577-170.jpg",
                "twitter:title": "検索システムを作る上で役立つ本 - infra.log",
                "twitter:description": "まえがき 最近Elasticsearchを触る機会が増えつつあるのですが、 そもそも検索を行う際に何をどうしたら良いのか全くわからんって時のためおすすめの書籍をいくつか紹介したいと思います。 また、達人出版社さんから冬休み合同フェアというのが開催されており、 こちらだと電子書籍が半額で買えるのでオススメです。 tats…",
                "twitter:app:name:iphone": "はてなブログアプリ",
                "twitter:app:id:iphone": "583299321",
                "twitter:app:url:iphone": "hatenablog:///open?uri=https%3A%2F%2Fwww.st1t.com%2Fentry%2F2018%2F12%2F27%2F174532",
                "twitter:site": "@st_1t"
              }
            ],
            "article": [
              {
                "name": "検索システムを作る上で役立つ本 - infra.log",
                "image": "https://www.kindaikagaku.co.jp/img/book/KD0577-170.jpg"
              }
            ],
            "cse_image": [
              {
                "src": "https://www.kindaikagaku.co.jp/img/book/KD0577-170.jpg"
              }
            ]
          }
        }
      ]
    }
  ]
}
$ 

jqで日付とタイトルを抜き出す

article:published_timeはUNIXタイムなので人が見るときは変換したほうが良いかも。

$ jq '.response[].items[].pagemap.metatags[]["og:title","article:published_time"]' data/response/response_20181228.json 
"検索システムを作る上で役立つ本 - infra.log"
"1545900332"

あとがき

というわけでさくっとやってみたのですが、まだ課題があります。
SEOは門外漢すぎて知らなかったのですが、
このarticle:published_timeはOpen Graph Protocol(OGP)というSEO対策のためにホームページ作成者がよしなにいれこむものみたいでした。
(なるほど、ブログにリンク貼ると以下のように画像と説明がでるのもOGPのおかげだったんですね。。。)

www.asahi-net.or.jp

なので、ものによってはやはりmetaタグがなかったり、article:published_time自体がなかったりしました。
Googleが初めてIndexしたタイミングの日時が取得できることを密かに期待していたのですが、残念💧

検索システムを作る上で役立つ本

まえがき

最近Elasticsearchを触る機会が増えつつあるのですが、
そもそも検索を行う際に何をどうしたら良いのか全くわからんって時のためおすすめの書籍をいくつか紹介したいと思います。

また、達人出版社さんから冬休み合同フェアというのが開催されており、
こちらだと電子書籍が半額で買えるのでオススメです。

tatsu-zine.com

初級編

Elasticsearch実践ガイド

book.impress.co.jp

全文検索を行おうと思ったら大体最近の流れはElasticsearchにいきつくパターンが多いかと思います。
ただ、公式のドキュメントは英語だったり、そもそも全文検索の界隈で当たり前に使われる用語が普通に出てきて辛いという方へちょうど良いと思います。

  • 良い点
    • 日本語の書籍で新しい(2018/6/15発売)
    • 図解が多い
    • 基礎から書いてある
    • 全文検索そのものだけでなくTipsが充実している
    • 日本語の検索も少しだけど載っている
  • ここがあればもっと嬉しかった
    • 日本語検索についてもう少し記述があると嬉しかった(sudachiとか)

Apache Lucene 入門

gihyo.jp

いきなり絶版の本を紹介してすいません。。。
ただ、この本は、全文検索?なにそれおいしいのって方には凄く良かったと記憶しているので、ヤフオクやメルカリで安く手に入りそうだったら購入してみるのも良いかもしれません。

  • 良い点
    • 全文検索の最初の一歩となるところが記載されている
  • ここがあればもっと嬉しかった
    • 電子書籍化
    • 古いので(2006/5/17発売)、改訂版の出版

中/上級編

こちらで紹介する本はまだ私もきちんと読み切っていないのですが、
途中や一部だけでも十分良い本だと思ったのでリンクだけ紹介しておきます。

形態素解析の理論と実装

なんとなくMecabについても書かれているっぽいって噂だけで達人出版社のフェアでゆるふわに買っちゃいましたが、めっちゃ良いです!
日本語における形態素解析についてきちんと書かれているし、数式は学のない自分には難しすぎて頭がフットーしそうですが、
今まで見てきた日本語における形態素解析についてここまでキチンと書かれている本は初めて見たくらい良書だと思いました。
買うのが不安な方は立ち読みだけでもいいのでまずは見てもらうといいのかなーと思います。

https://www.kindaikagaku.co.jp/img/book/KD0577-170.jpg

https://www.kindaikagaku.co.jp/information/kd0577.htm

検索エンジン自作入門

gihyo.jp

Logstashの最近のアップデートで面白そうなものをピックアップしてみた

まえがき

2018年Elastic Stackアドベントカレンダーの20日目の記事で代理で書きます!
今回はLogstash6.1.0から6.5.4までで面白そうなアップデートを簡単に紹介していきます。

qiita.com

Logstash Release notes

www.elastic.co

DNS Filterの更新について

DNS FilterはIPを逆引きしてフィールドに追加することができます。
例えば、Webサーバ等のアクセスログのx-forwarded-forを逆引きでホスト名を引いた情報をElasticsearchに投入することで、アクセス元を簡易的にわかるようにしたりします。
これはセキュリティを意識するときとかに、アクセス元がAWSだったり、海外の全く関係なさそうなところだったらBAN判定の一つの要素にできるときがあります。

アップデート内容について

github.com

Logstash 6.3.1からDNSの問い合わせ結果でキャッシュを有効化したときに、クエリがネームサーバに同期的に問い合わせていたため、応答待ちで他の処理待ちがあった状況を解決しているみたいです。
DNS Filterをキャッシュ機能を有効化にして6.3.0以下のバージョンを使っている場合は試してみるとよいかもしれません。

File input pluginの更新について

こちらのプラグインはおなじみの、ファイルを読み込むためのプラグインですね。

アップデート内容について

github.com

Logstash 6.4.0からgzipファイルをそのままで読み込めるようになりました🎉
この機能のおかげで、例えばログサーバ上においてあるような過去のgzipファイルを解凍せずにそのままデータ読込できるようになります。

Logstashの実行モードについて

アップデート内容について

www.elastic.co

JRubyによる実行以外にJavaで実行できるようになり、
Logstash 6.3.0からは本番運用まであと一歩になりました。
Elasticユーザ会では本番でも使えるっぽいと発言しちゃいましたが、よく見たらあと一歩みたいでした、すいません。。。

We’re happy to announce that the new Java execution engine in Logstash has reached the production candidate stage.

設定方法は「--experimental-java-execution」オプションを起動時に付けるだけ。

GitHubには6.0.0と6.3.0で1.4倍ほど早くなったとか🤔

Pipeline-to-Pipeline Communication (Beta)について

パイプライン同士でデータを受け渡しができるようになりました。
まだベータバージョンですが、以下のような記述で設定できるようです。
ただ、pipeline.ymlが肥大化するのでそれはそれで困るかもという声もあるので、
ここをいい感じに分割できるようになることを期待したいですね🤔

# config/pipelines.yml
- pipeline.id: upstream
  config.string: input { stdin {} } output { pipeline { send_to => [myVirtualAddress] } }
- pipeline.id: downstream
  config.string: input { pipeline { address => myVirtualAddress } }

www.elastic.co

Architectural patternについて

www.elastic.co

アップデートとは違うのですが、
いくつか公式でおすすめの設定パターンがあるようです。

The distributor pattern

単一のinputからデータタイプに応じて処理パターンがあるときにifとかで長くなるところを短縮できるようになるから良いよ!というものみたいです。

# config/pipelines.yml
- pipeline.id: beats-server
  config.string: |
    input { beats { port => 5044 } }
    output {
        if [type] == apache {
          pipeline { send_to => weblogs }
        } else if [type] == system {
          pipeline { send_to => syslog }
        } else {
          pipeline { send_to => fallback }
        }
    }
- pipeline.id: weblog-processing
  config.string: |
    input { pipeline { address => weblogs } }
    filter {
       # Weblog filter statements here...
    }
    output {
      elasticsearch { hosts => [es_cluster_a_host] }
    }
- pipeline.id: syslog-processing
  config.string: |
    input { pipeline { address => syslog } }
    filter {
       # Syslog filter statements here...
    }
    output {
      elasticsearch { hosts => [es_cluster_b_host] }
    }
- pipeline.id: fallback-processing
    config.string: |
    input { pipeline { address => fallback } }
    output { elasticsearch { hosts => [es_cluster_b_host] } }

The output isolator pattern

出力先を複数に分けることでどちらかに障害が起きてもデータロストすることを防ぐためのもので、
ディスクにキューイングするpersisted typeにすることでより強固にするためのもののようです。

# config/pipelines.yml
- pipeline.id: intake
  queue.type: persisted
  config.string: |
    input { beats { port => 5044 } }
    output { pipeline { send_to => [es, http] } }
- pipeline.id: buffered-es
  queue.type: persisted
  config.string: |
    input { pipeline { address => es } }
    output { elasticsearch { } }
- pipeline.id: buffered-http
  queue.type: persisted
  config.string: |
    input { pipeline { address => http } }
    output { http { } }

The forked path pattern

今まではcloneやif/elseを使ってLogstashでデータ加工をおこなっていた箇所をストリームをつなげて設定を簡素化できるようになるパターンのようです。
以下の例では、Elasticsearchには未加工でデータを送信し、S3にアップロードするときだけセンシティブなフィールドを削除してからアップロードするようです。

# config/pipelines.yml
- pipeline.id: intake
  queue.type: persisted
  config.string: |
    input { beats { port => 5044 } }
    output { pipeline { send_to => ["internal-es", "partner-s3"] } }
- pipeline.id: buffered-es
  queue.type: persisted
  config.string: |
    input { pipeline { address => "internal-es" } }
    # Index the full event
    output { elasticsearch { } }
- pipeline.id: partner
  queue.type: persisted
  config.string: |
    input { pipeline { address => "partner-s3" } }
    filter {
      # Remove the sensitive data
      mutate { remove_field => 'sensitive-data' }
    }
    output { s3 { } } # Output to partner's bucket

The collector pattern

The distributor patternとは反対に複数のデータソースがあるときに、
output前に共通の処理をはさみたいときに以下のように設定すると設定を簡易化することができるようにしているようです。

# config/pipelines.yml
- pipeline.id: beats
  config.string: |
    input { beats { port => 5044 } }
    output { pipeline { send_to => [commonOut] } }
- pipeline.id: kafka
  config.string: |
    input { kafka { ... } }
    output { pipeline { send_to => [commonOut] } }
- pipeline.id: partner
  # This common pipeline enforces the same logic whether data comes from Kafka or Beats
  config.string: |
    input { pipeline { address => commonOut } }
    filter {
      # Always remove sensitive data from all input sources
      mutate { remove_field => 'sensitive-data' }
    }
    output { elasticsearch { } }