- 投稿日:2019-04-03T23:17:49+09:00
EC2インスタンスからFluentdを使ってKinesis Data Streamsにログを送信する
概要
EC2インスタンスからFluentdを使ってKinesis Data Streamsにログを送信するアーキテクトを構築します。
fluent-plugin-kinesisでKinesis Streamsにログを送信する
こちらの記事を参考にしました。
基本的な流れは同じですが、簡単な説明だったり情報が古かったりして少し戸惑ったのでまとめました。
今回は一から作成していますが、必要に応じて作成済みのものを利用してください。環境
作業 OS:macOS Mojave
EC2 OS:Amazon Linux 2 AMI (HVM)
fluentd:1.4.2
td-agent:1.3.3
fluent-plugin-kinesis:3.0.0
ruby:2.6.2目次
- EC2の作成
- Streamの作成
- EC2にロール付与
(1) StreamのARNを指定して、Kinesisのポリシーを作成
(2) ポリシーを指定して、ロールを作成
(3) EC2にロールを付与する
- EC2にSSH接続してログイン
- Apacheのインストール
- rbenv/Rubyのインストール
- Fluentdのインストール
- プラグインのインストール
- Fluentd設定ファイルを修正する
- 設定ファイルのシンタックスチェックを行う
- Fluentdの起動
- Streamにデータが送信されていることを確認
(1) シャードイテレータを確認
(2) シャードイテレータを指定してレコード取得
(3) デコードして中身を確認
1. EC2の作成
まず、Fluentdを入れるためのAWS EC2を作成します。
AWSマネジメントコンソール > EC2 > インスタンス を開きます。
インスタンス作成ボタンから、任意のOSを選択して作成します。
今回はAmazon Linuxを利用し、設定等はデフォルトで作成しました。
SHH接続の際に使用するキーペアが生成されるので、保存してください。2. Streamの作成
次に、ログの送信先であるKinesis Data Streamを作成します。
AWSマネジメントコンソール > Kinesis > Data Streamを開きます。
Kibesisストリームの作成ボタンから作成します。
今回はストリーム名をtest、シャード数を1に設定して作成しました。
※シャード…ストリーム内の一意に識別されたデータレコードのシーケンス。ストリームの総容量はシャードの容量の合計。
その後、作成したストリームをクリックし、詳細タブのストリーム ARNの項目を確認しておきます。
これは次のポリシー作成の際に使用します。3. EC2にロール付与
先ほど作成したストリームのリソースに対するKinesisの権限をEC2に付与します。
(1) 作成したStreamのARNを指定して、Kinesisのポリシーを作成
AWSマネジメントコンソール > IAM > ポリシー を開きます。
ポリシーの作成ボタンから作成します。
ビジュアルエディタの設定で、以下のように設定します。(その他の設定は任意です)
- サービス:Kinesis
- アクション:すべてのKinesisアクション (kinesis:*)
- リソース:stream > ARNの追加 > ARNを手動でリスト > ストリームARNを貼り付ける
ここではポリシーの名前をtest-kinesis-policyとします。
(2) 作成したポリシーを指定して、ロールを作成
AWSマネジメントコンソール > IAM > ロール を開きます。
ポリシーの作成ボタンから作成します。
設定は以下のようにします。(その他の設定は任意です。)
- このロールを使用するサービスを選択:EC2
- Attach アクセス権限ポリシー:test-kinesis-policy
ここではロールの名前をtest-kinesis-roleとします。
(3) EC2に作成したロールを付与する
AWSマネジメントコンソール > EC2 > インスタンス を開きます。
作成したEC2を選択 > アクション > インスタンスの設定 > IAMロールの割り当て/置換 を開きます。
以下を指定して、適用します。
- IAMロール:test-kinesis-role
4. EC2にSSH接続してログイン
ターミナルを開いて、EC2にSSH接続します。
$ ssh -i <key-pair>.pem <ユーザ名>@<パブリックIP or パブリックDNS名>5. Apacheのインストール
EC2にApatchをインストールして起動します。
$ sudo yum install -y httpd $ sudo service httpd start6. rbenv/Rubyのインストール
EC2にrbevnとRubyをインストールします。
Rubyのバージョンは今回は安定版の2.6.2(2019/4/3現在)をインストールしました。
※Fluentdの公式ではRubyのversionは2.1以上をサポートしているとのことです。参考:Amazon Linuxに rbenv をインストールして、Rubyをバージョンアップ(Bundlerも)
7. Fluentdのインストール
EC2にFluentdをgemでインストールします。
$ gem install fluentd --no-document参考:Installing Fluentd Using Ruby Gem | Fluentd
※Fluentdの公式ではgem install fluentd --no-ri --no-rdoc
と書かれていますが、--no-ri --no-rdoc
オプションは廃止されました。以下のコマンドで、エラーなく動くことを確認します。
$ fluentd --setup ./fluent $ fluentd -c ./fluent/fluent.conf -vv & $ echo '{"json":"message"}' | fluent-cat debug.test8. プラグインのインストール
EC2にfluent-plugin-kinesisをインストールします。
$ sudo td-agent-gem install fluent-plugin-kinesis参考:Plugin Management | Fluentd
9. Fluentd設定ファイルを修正する
Fluentdの設定を行います。
$ sudo vim /etc/td-agent/td-agent.conf以下をファイルに追記します。
データソースの定義が <source>タグ、データ処理の定義が <match>タグです。
使い方などはaws-fluent-plugin-kinesis#Getting startedを確認してください。<source> @type tail @id output_log format apache2 path /var/log/httpd/access_log pos_file /var/log/td-agent/httpd-access.pos tag log.httpd.access </source> <match log.httpd.*> @type kinesis_streams @id input_httpd stream_name test region ap-northeast-1 random_partition_key true use_yajl true </match>10. 設定ファイルのシンタックスチェックを行う
$ td-agent --dry-run -c /etc/td-agent/td-agent.confエラーがおきなければOKです。
11. Fluentdの起動
Fluentdを起動します。
まずはフォアグラウンドで実行できることを確認して、その後バックグラウンドで実行します。フォアグラウンド実行
$ sudo td-agent -c /etc/td-agent/td-agent.confバックグラウンド実行
$ sudo service td-agent startApacheにリクエストを投げて、Kinesis Streamに送信するログを生成します。
$ curl localhost
12. Streamにデータが送信されていることを確認
(1) シャードイテレータを確認
$ STREAM_NAME=test $ aws kinesis get-shard-iterator --shard-id shardId-000000000000 --stream-name $STREAM_NAME --shard-iterator-type TRIM_HORIZON { "ShardIterator": "AAAAAAAAAAEYTwTh..." }(2) シャードイテレータを指定してレコード取得
$ aws kinesis get-records --shard-iterator "AAAAAAAAAAEYTwTh..." { "Records": [ { "Data": "eyJob3N0IjoiMTI3LjAuMC4xIiwidXNlciI6bnVsbCwibWV0aG9kIjoiR0VUIiwicGF0aCI6Ii8iLCJjb2RlIjo0MDMsInNpemUiOjM2MzAsInJlZmVyZXIiOm51bGwsImFnZW50IjoiY3VybC83LjYxLjEifQo=", "PartitionKey": "8c3e250cc103933ec37f63cec968054c", "ApproximateArrivalTimestamp": 1554283487.951, "SequenceNumber": "49594439765182586642277267931515081312153319763399933954" }, { "Data": "eyJob3N0IjoiMTI3LjAuMC4xIiwidXNlciI6bnVsbCwibWV0aG9kIjoiR0VUIiwicGF0aCI6Ii8iLCJjb2RlIjo0MDMsInNpemUiOjM2MzAsInJlZmVyZXIiOm51bGwsImFnZW50IjoiY3VybC83LjYxLjEifQo=", "PartitionKey": "10e21500031d1d5f5d6beadb2fbd5fe3", "ApproximateArrivalTimestamp": 1554283679.042, "SequenceNumber": "49594439765182586642277267931516290237972947586714173442" } ], "NextShardIterator": "AAAAAAAAAAEVvuiUpuBdo5LXOID3x5ksssSyqNfkxhNFkG7jkkhiqaX7knHtVolTj2JgOIgYT0vJVsYgIQA9BT950RdbxFfSIgyv2y1t75br6/UQlZXfVN3TWHLKJPyu9Xzx0fr+TN3avc0UyzOwg++NQCaPEBV2dTaDhXY03Q0dpXPhROAF7Dnkm8oxRjNYD3tIN+mkkPHu1YZs7mAOwVTuew85iAmF", "MillisBehindLatest": 0 }(3) デコードして中身を確認
$ DATA="eyJob3N0IjoiMTI3LjAuMC4xIiwidXNlciI6bnVsbCwibWV0aG9kIjoiR0VUIiwicGF0aCI6Ii8iLCJjb2RlIjo0MDMsInNpemUiOjM2MzAsInJlZmVyZXIiOm51bGwsImFnZW50IjoiY3VybC83LjYxLjEifQo=" $ echo -n $DATA | base64 -d {"host":"127.0.0.1","user":null,"method":"GET","path":"/","code":403,"size":3630,"referer":null,"agent":"curl/7.61.1"}Apatchから投げたリクエストを確認できました。
最後に
記事に間違いや不明点があれば遠慮なくご指摘ください。
- 投稿日:2019-04-03T20:04:33+09:00
[AWS]EC2にEFSを設定してみる
遅めですがEFSが東京リージョンにも対応したので利用してみました。
前提
接続するEC2インスタンスのVPCでDNSホスト名が有効になっている必要がある。
Amazonが提供するDNSサーバーを使用するように設定されている必要がある。EFS用セキュリティグループ作成
ec2に設定しているセキュリティグループからのNFSインバウンドを許可する。
タイプ NFS プロトコル TCP ポート 2049 ソース EFSを利用するEC2のセキュリティグループ マウントヘルパーインストール
マウント前の確認
# df -Th ファイルシス タイプ サイズ 使用 残り 使用% マウント位置 devtmpfs devtmpfs 475M 0 475M 0% /dev tmpfs tmpfs 492M 0 492M 0% /dev/shm tmpfs tmpfs 492M 400K 492M 1% /run tmpfs tmpfs 492M 0 492M 0% /sys/fs/cgroup /dev/xvda1 xfs 8.0G 1.4G 6.7G 17% / tmpfs tmpfs 99M 0 99M 0% /run/user/1000インストール
# sudo yum install -y amazon-efs-utils# sudo mkdir /efs # sudo mount -t efs -o tls fs-{efs-ID}:/ /efsマウント後の確認
# df -Th ファイルシス タイプ サイズ 使用 残り 使用% マウント位置 devtmpfs devtmpfs 475M 0 475M 0% /dev tmpfs tmpfs 492M 0 492M 0% /dev/shm tmpfs tmpfs 492M 440K 492M 1% /run tmpfs tmpfs 492M 0 492M 0% /sys/fs/cgroup /dev/xvda1 xfs 8.0G 1.5G 6.6G 19% / tmpfs tmpfs 99M 0 99M 0% /run/user/1000 127.0.0.1:/ nfs4 8.0E 0 8.0E 0% /efs自動的にマウントするよう既存の EC2 インスタンスを更新する
fs-{efs-ID}:/ /mnt/efs efs defaults,_netdev 0 0インスタンス再起動後
EC2の管理画面から今回設定したEC2インスタンスを再起動して
再起動後もマウントされているか確認します。# df -Th ファイルシス タイプ サイズ 使用 残り 使用% マウント位置 devtmpfs devtmpfs 475M 0 475M 0% /dev tmpfs tmpfs 492M 0 492M 0% /dev/shm tmpfs tmpfs 492M 400K 492M 1% /run tmpfs tmpfs 492M 0 492M 0% /sys/fs/cgroup /dev/xvda1 xfs 8.0G 1.5G 6.6G 19% / fs-{efs-ID}.efs.ap-northeast-1.amazonaws.com:/ nfs4 8.0E 0 8.0E 0% /mnt/efs tmpfs tmpfs 99M 0 99M 0% /run/user/1000無事共有されています!
AMI作成
EC2の管理画面から今回設定したEC2インスタンスのAMIを作成し、
AMIを起動して、マウントされているかを確認します。# df -Th ファイルシス タイプ サイズ 使用 残り 使用% マウント位置 devtmpfs devtmpfs 475M 0 475M 0% /dev tmpfs tmpfs 492M 0 492M 0% /dev/shm tmpfs tmpfs 492M 400K 492M 1% /run tmpfs tmpfs 492M 0 492M 0% /sys/fs/cgroup /dev/xvda1 xfs 8.0G 1.5G 6.6G 19% / fs-{efs-ID}.efs.ap-northeast-1.amazonaws.com:/ nfs4 8.0E 0 8.0E 0% /mnt/efs tmpfs tmpfs 99M 0 99M 0% /run/user/1000無事共有されています!
参考
- 投稿日:2019-04-03T16:14:17+09:00
AWS Code シリーズ
■AWSのCode シリーズ
CodeCommit
ソースコードを管理するGitリポジトリサービスCodeBuild
ソースコードのビルド/テスティングサービスCodeDeploy
ビルドされたモジュールのデプロイサービスCodePipeline
継続的デリバリー/継続的インテグレーションをサポートするサービス1.CodeCommit
- 簡単にGitリポジトリをホストすることができる。
- サードバーティ製のツールも利用可能。
- プルリクエスト機能も利用可能。
1-1 CodeCommitのリポジトリを作成する
1-2 初期セットアップ、コードのPush
IAMユーザの権限を使って、CodeCommitのリポジトリに接続し、Pushします。
gitを利用するのに最初に実行。
git config --global credential.helper '!aws --region ap-northeast-1 codecommit credential-helper $@' git config --global credential.UseHttpPath true誰が登録したかわかるようにユーザー情報を入れる。
git config --global user.name "[user_name]" git config --global user.email "[user_email]"gitでこのディレクトリを管理すると定義する。
git init ##.gitができあがっていることも確認しておく。 ll -a drwxrwxr-x 7 ec2-user ec2-user 4096 3月 26 00:47 .git先程作成したリポジトリをリモートとして登録する。
git remote add origin [https_clone_url] git status On branch master No commits yet Untracked files: (use "git add <file>..." to include in what will be committed) buildspec.yml src/ nothing added to commit but untracked files present (use "git add" to track)全てを追加する。
git add -A git status On branch master No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: buildspec.yml new file: src/appspec.yml new file: src/img/img1.jpeg new file: src/img/img2.jpeg new file: src/index.php new file: src/script/clean.shコミットする。
git commit -m "first commit" [master (root-commit) e9e67f0] first commit 6 files changed, 69 insertions(+) create mode 100644 buildspec.yml create mode 100644 src/appspec.yml create mode 100644 src/img/img1.jpeg create mode 100644 src/img/img2.jpeg create mode 100644 src/index.php create mode 100644 src/script/clean.shpushする。
git push origin master [ec2-user@demo-batch work]$ git push origin master Counting objects: 11, done. Compressing objects: 100% (9/9), done. Writing objects: 100% (11/11), 516.43 KiB | 18.44 MiB/s, done. Total 11 (delta 0), reused 0 (delta 0) To https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/demo-codcommit * [new branch] master -> master2.CodeBuild
- ビルドサービス
- ソースコードのコンパイルを行ったり、テストを実行する環境を簡単に構築することができる。
- CodeBuild上で行う作業については、buildspec.ymlに定義する。
2-1 成果物格納用のS3バケットを準備しておく
S3バケットを作成し、バージョニング を有効にしておく。
バージョニングについては実際に試されている↓の記事が参考になりました。
今さらだけどS3のバージョニングを試してみた。2-2 buildspec.ymlを作成する
buildspec.yml##[application-name] は後で必要になるので適当な名前に、 ##[S3-bucket-name]は「2-1 成果物格納用のS3バケットを準備しておく」で作成したS3バケットを指定。 version: 0.1 phases: build: commands: - aws deploy push --region ap-northeast-1 --application-name [application-name] --s3-location s3://[S3-bucket-name]/sample.zip --source src artifacts: files: - '**/*' base-directory: src name: sample.zip2-3 CodeBuildプロジェクトを作成する
[Source provider][リポジトリ] は「1.AWSCodeCommit」のリポジトリから取ってくるように指定します。
[Operating system]は Ubuntu しか選べません。
[Runtime]は PHP にしておきます。
[Service role]は New service role で新しく作成する。※後でポリシーを追加します。
[Type]は AmazonS3
[Bucket name]に作成したS3バケットを指定
[Enable semantic versioning]にチェック
[Namespace type]はBuild IDを指定
2-4 Service roleにIMAポリシーを追加する
先ほど作成した、Service roleに以下2つのポリシーを追加してください。
AWSCodeDeployDeployerAccess
AmazonS3FullAccess
3.CodeDeploy
- デプロイ自動化サービス
- appspec.ymlにデプロイ時の動作を定義する
- デプロイ方式を1台、半分、全台など選択可能。
- デプロイ先にエージェントをインストールする必要がある。
3-1 EC2インスタンスにIAMロールを作成する
EC2に以下のIAMロールのポリシーで作成し、EC2にアタッチする。
AmazonS3FullAccess
3-2 EC2インスタンスにCodeDeployエージェントをインストールする
wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install chmod +x install sudo ./install auto3-3 CodeDeploy用のIAMロールを作成する
CodeDeployに以下のIAMロールのポリシーで作成する。
AWSCodeDeployRole
3-4 CodeDeployアプリケーションを用意する
[アプリケーション名]には、CodeBuildで決めたアプリケーション名を入力してください。
[コンピューティングプラットフォーム]は、EC2。
デプロイグループの作成
[デプロイグループ名]に任意のものを入力。
[サービスロール]は、「3-3 CodeDeploy用のIAMロールを作成する」で作成したものを選択。
[デプロイ設定]は、CodeDeployDefault.AllAtOne。
3-5 CodeBuildを開始する
[Container] 2019/03/27 11:15:26 Waiting for agent ping [Container] 2019/03/27 11:15:29 Waiting for DOWNLOAD_SOURCE [Container] 2019/03/27 11:15:33 Phase is DOWNLOAD_SOURCE [Container] 2019/03/27 11:15:33 CODEBUILD_SRC_DIR=/codebuild/output/src359827589/src/git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/demo-codcommit [Container] 2019/03/27 11:15:33 YAML location is /codebuild/output/src359827589/src/git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/demo-codcommit/buildspec.yml [Container] 2019/03/27 11:15:33 Processing environment variables [Container] 2019/03/27 11:15:33 Moving to directory /codebuild/output/src359827589/src/git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/demo-codcommit [Container] 2019/03/27 11:15:33 Registering with agent [Container] 2019/03/27 11:15:33 Phases found in YAML: 1 [Container] 2019/03/27 11:15:33 BUILD: 1 commands [Container] 2019/03/27 11:15:33 Phase complete: DOWNLOAD_SOURCE Success: true [Container] 2019/03/27 11:15:33 Phase context status code: Message: [Container] 2019/03/27 11:15:33 Entering phase INSTALL [Container] 2019/03/27 11:15:33 Phase complete: INSTALL Success: true [Container] 2019/03/27 11:15:33 Phase context status code: Message: [Container] 2019/03/27 11:15:34 Entering phase PRE_BUILD [Container] 2019/03/27 11:15:34 Phase complete: PRE_BUILD Success: true [Container] 2019/03/27 11:15:34 Phase context status code: Message: [Container] 2019/03/27 11:15:34 Entering phase BUILD [Container] 2019/03/27 11:15:34 Running command aws deploy push --region ap-northeast-1 --application-name leomaro --s3-location s3://leomaro-codebuild/sample.zip --source src To deploy with this revision, run: aws deploy create-deployment --application-name leomaro --s3-location bucket=leomaro-codebuild,key=sample.zip,bundleType=zip,eTag=cc07369e1d36342a99f827d40358d26f,version=q_0JhOdGpyuCg5B1lsavI4Avd5lqnaFa --deployment-group-name <deployment-group-name> --deployment-config-name <deployment-config-name> --description <description> [Container] 2019/03/27 11:15:40 Phase complete: BUILD Success: true [Container] 2019/03/27 11:15:40 Phase context status code: Message: [Container] 2019/03/27 11:15:40 Entering phase POST_BUILD [Container] 2019/03/27 11:15:40 Phase complete: POST_BUILD Success: true [Container] 2019/03/27 11:15:40 Phase context status code: Message: [Container] 2019/03/27 11:15:40 Expanding base directory path: src [Container] 2019/03/27 11:15:40 Assembling file list [Container] 2019/03/27 11:15:40 Expanding src [Container] 2019/03/27 11:15:40 Expanding artifact file paths for base directory src [Container] 2019/03/27 11:15:40 Assembling file list [Container] 2019/03/27 11:15:40 Expanding **/* [Container] 2019/03/27 11:15:40 Found 5 file(s) [Container] 2019/03/27 11:15:40 Updating artifact name as sample.zip [Container] 2019/03/27 11:15:40 Phase complete: UPLOAD_ARTIFACTS Success: true [Container] 2019/03/27 11:15:40 Phase context status code: Message:CodeDeployのRevisionに作成されていることがわかります。
3-6 デプロイする
作成されたRevisionを指定してデプロイしていきます。
[デプロイグループ]は「3-4 CodeDeployアプリケーションを用意する」で作成されたものを指定。
[リビジョンの場所]で「3-5 CodeBuildを開始する」で作成されたものを指定。
これでデプロイは完成です。
4.CodePipeline
- 継続的デリバリーをサポートするサービス
- Codecommit/CodeBuild/CodeDeployの流れをパイプラインとして定義することで、ソースコードがコミットされたらデプロイまで自動化
4-1 パイプラインを作成する
Step 1:パイプラインの設定を選択する
[パイプライン名]には任意の名前を入力。
[Service role]はNew service roleでここで新しく作成します。
[アーティファクトストア]はカスタムロケーションでS3バケットを指定します。
Step 2:ソースステージを追加する
[ソースプロバイダー]はAWS Codecommitにし、「1.CodeCommit」で作成したものを指定していきます。
Step 3:ビルドステージを追加する
[プロバイダーを構築する]はAWS CodeBuildにし、「2.CodeBuild」で作成したものを指定していきます。
Step 4:デプロイステージを追加する
[デプロイプロバイダー]をAWS CodeDeployにし、「3.CodeDeploy」で作成したものを指定していきます。
Step 5:レビュー
「パイプラインを作成する」Pipeline作成時と、CodecommitのPush時に動作します。
なので、ここでは何も変わらないので次で動作を確認してみる。4-2 CodecommitでPushし動作を確認する
ファイルを作成してPushする。
git add -A git commit -m "fix." git push origin master
- 投稿日:2019-04-03T00:57:36+09:00
Amazon WorkSpaces]AmazonLinux2にPostmanインストール
Amazon Linux release 2 (Karoo)
# Postmanのインストール $ sudo wget https://dl.pstmn.io/download/latest/linux64 -O postman.tar.gz $ sudo tar -xzf postman.tar.gz -C /opt $ sudo rm postman.tar.gz $ sudo ln -s /opt/Postman/Postman /usr/bin/postman # ランチャーに追加(アプリケーションープログラミングーPostMan) cat > ~/.local/share/applications/postman.desktop <<EOL [Desktop Entry] Encoding=UTF-8 Name=Postman Exec=postman Icon=/opt/Postman/app/resources/app/assets/icon.png Terminal=false Type=Application Categories=Development; EOL