それなりに適当にやってます

なんとなくそれっぽいメモとか備忘録とか適当に。 2018年5月にブログ移転しました。 古い記事は未整理です。

AWS/EC2で fluentd を使ってS3へログを送りたい

CentOS 7.x のインスタンスで試した。

参考URL

EC2の初期設定

ややこしいのでタイムゾーンの修正と、rsyslog の再起動、SELinuxの無効化と更新・再起動だけしとく。

$ sudo timedatectl set-timezone Asia/Tokyo$ timedatectl  =>"Time zone"がJSTになってる事を確認$ sudo systemctl restart rsyslog$ sudo sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config$ sudo yum upgrade -y && sudo shutdown -r now 

fluentd

インストール

公式の Installing Fluentd Using rpm Package を参照、 curl でスクリプトを拾い sudo で入れる。

$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sudo sh

プラグインのインストール

以下3つのプラグインをインストールした。

$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-ec2-metadata$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-s3$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-forest

IAMユーザの作成とポリシーの割り当て

IAMで最低限の権限を持ったユーザを作成する。 アクセスキーの作成はするが、コンソールへのアクセスは許可せず、ポリシーも割り当てないまま進め、アカウント作成後にインラインポリシーを作成・設定した。 インラインポリシーの内容については fluent-plugin-ec2-metadatafluent-plugin-s3 に掲載されているものを参考にした。

{    "Version": "2012-10-17",    "Statement": [        {            "Effect": "Allow",            "Action": "ec2:Describe*",            "Resource": "*"        },        {            "Effect": "Allow",            "Action": "elasticloadbalancing:Describe*",            "Resource": "*"        },        {            "Effect": "Allow",            "Action": [                "cloudwatch:ListMetrics",                "cloudwatch:GetMetricStatistics",                "cloudwatch:Describe*"            ],            "Resource": "*"        },        {            "Effect": "Allow",            "Action": "autoscaling:Describe*",            "Resource": "*"        },        {            "Effect": "Allow",            "Action": "s3:*",            "Resource": "arn:aws:s3:::YOUR_S3_BUCKET_NAME/*"        }    ]}

S3バケットのアクセス許可設定

コンソールからS3を開き、ログを保管するバケットのプロパティを表示する。 プロパティ内のアクセス許可を開き "さらにアクセス許可を追加する" をクリックし 認証済みユーザリストアップロード/削除 の許可を与える(チェックボックスにチェックを入れる)

設定例

とりあえずオリジナルの設定ファイルを退避

$ cd /etc/td-agent$ sudo mv td-agent.conf td-agent.conf.orig

こちらの記事を参考に、下記のような設定ファイルを作成した。

$ sudo vi td-agent.conf
<source>    type tail  format syslog  pos_file /tmp/syslog.pos  path /var/log/messages  tag syslog.messages</source><match syslog.**>    type ec2_metadata  aws_key_id  YOUR_AWS_KEY_ID  aws_sec_key YOUR_AWS_SECRET_KEY  ## EC2インスタンスのタグ Name を取得して tag: syslog.messages の前に付ける。  ## ここで付与した Name でアウトプット先を変える。  output_tag ${tagset_name}.${tag}</match><match {YOUR_EC2_INSTANCE_TAG_NAME}.**>    type forest  subtype s3   <template>     aws_key_id YOUR_AWS_KEY_ID     aws_sec_key YOUR_AWS_SECRET_KEY     s3_bucket YOUR_S3_BUCKET_NAME     s3_region ap-northeast-1     buffer_path /var/log/td-agent/buffer/${tag}     time_slice_format ${tag_parts[0]}/${hostname}/%Y/%m/%d/${tag_parts[1..-1]}-%Y-%m-%d-%H      flush_at_shutdown true   </template></match>  

起動と動作確認

ターミナルを2つ開き、片方で fluentd をトレースモードで起動する。

$ sudo td-agent -vv

syslog に適当なメッセージを流す。 上記 td-agent のトレースログでエラーが出ていないか確認

$ logger -p local1.error "test"

トレースモードで起動していた td-agent を [CTRL]+[C] で落とし、実際にS3へログが出力されているか確認する。

自動起動の有効化

特に問題がなければ自動起動を有効にしておく。 上記手順でインストールした fluentd は、まだsystemdに対応してないので必要なら systemd の設定を作った方がよいかも。

$ sudo systemctl enable td-agent  =>/etc/init.d/td-agent で native なサービスじゃないから chkconfig td-agent on が実行したーと出力があった。

これでS3へのログ保管方法は分かったので、あとはサービスの常時起動や、各ミドルウェアに合わせたログ設定を入れてけばなんとかなるかも。

以上、なにごとも適当に。