AWS CLIを使ってELBのS3ログ転送設定をする

aws_logoコマンドラインツールの aws cli を使って Elastic Load Balancing(ELB) のログを S3 転送させる方法をメモ。

ELB の S3 へのログ転送機能について

2014年3月から ELB のアクセスログを S3 に転送できるようになった

マニュアルを読めばわかるように、管理コンソールからの S3 ログ転送設定は極めて簡単。

elb_configure_access_logs_1
ELB の “Description” タブにある "Access Logs" の “Edit” をクリックし、ユニークな S3 のバケット名を指定して、 "Create the location for me" のチェックを入れておけば、S3 バケットの作成だけでなく、S3 のセキュリティー設定もよしなにしてくれる。

aws cli から S3 ログ転送設定

管理画面からやれば超簡単なこの設定を、コマンドラインツールの aws cli から

  • elb に S3 ログ転送の設定を追加
  • ログ転送先の S3 の作成

を行う。

elb の設定

"demo" という名前の elb に対して、S3 ログ転送の設定を追加する。
まずは aws elb describe-load-balancer-attributes でデフォルトの ELB 設定を確認。

$ aws elb describe-load-balancer-attributes --load-balancer-name demo
{
    "LoadBalancerAttributes": {
        "ConnectionDraining": {
            "Enabled": true,
            "Timeout": 300
        },
        "CrossZoneLoadBalancing": {
            "Enabled": true
        },
        "AccessLog": {
            "Enabled": false
        }
    }
}

AccessLog は "Enabled": false となっており、S3 転送設定はされていない。

次に、以下のような S3 転送用の JSON を用意(ファイル名は elb.json)。

{
"AccessLog": {
    "Enabled": true,
    "S3BucketName": "elb-logs",
    "EmitInterval": 5,
    "S3BucketPrefix": "test"
  }
}
  • ログを転送する S3 のバケット名を "S3BucketName" で指定
  • "Enabled": true でログを有効にする
  • EmitInterval でログ転送間隔(単位は分)を指定。 5 分または 60 分の二択。
  • S3BucketPrefix はバケットでの elb ログの prefix。

この設定を cli の aws elb modify-load-balancer-attributes コマンドで ELB に反映する。
設定対象の ELB は --load-balancer-name で指定する。

$ aws elb modify-load-balancer-attributes --load-balancer-name demo --load-balancer-attribute file://elb.json
{
    "LoadBalancerAttributes": {
        "AccessLog": {
            "S3BucketPrefix": "demo",
            "EmitInterval": 5,
            "Enabled": true,
            "S3BucketName": "elb-logs"
        }
    },
    "LoadBalancerName": "demo"
}

設定画反映されていることを確認。

$ aws elb describe-load-balancer-attributes --load-balancer-name demo
{
    "LoadBalancerAttributes": {
        "ConnectionDraining": {
            "Enabled": true,
            "Timeout": 300
        },
        "CrossZoneLoadBalancing": {
            "Enabled": true
        },
        "AccessLog": {
            "S3BucketPrefix": "test",
            "EmitInterval": 5,
            "Enabled": true,
            "S3BucketName": "elb-logs"
        }
    }
}

s3 の設定

次に転送先の S3 バケットの作成を行う。

Elastic Load Balancing : Configure an Amazon S3 Bucket for Storing Access Logs
http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/configure-s3-bucket.html

 

まずはバケットの作成。

$ aws s3 mb s3://elb-logs
make_bucket: s3://elb-logs/

次に、このバケットにログファイルを PUT するアクセスポリシーを設定する。

aws が提供するポリシージェネレーターサービスを利用して JSON のポリシーを生成する。

http://awspolicygen.s3.amazonaws.com/policygen.html

マニュアル“Attach a Policy to Your Amazon S3 Bucket” に従って入力欄を埋める。

  • Effect は Allow
  • Principal は ログを PUT してくる ELB のアカウントIDを指定。アカウント ID はリージョンごとに異なるので注意する。
    Region Region Name Elastic Load Balancing Account ID
    us-east-1 US East (N.Virginia) 127311923021
    us-west-1 US West (N.California) 027434742980
    us-west-2 US West (Oregon) 797873946194
    eu-west-1 EU (Ireland) 156460612806
    ap-northeast-1 Asia Pacific (Tokyo) 582318560864
    ap-southeast-1 Asia Pacific (Singapore) 114774131450
    ap-southeast-2 Asia Pacific (Sydney) 783225319266
    sa-east-1 South America (Sao Paulo) 507241528517
    us-gov-west-1 AWS GovCloud (US) 048591011584
  • AWS Service は S3
  • Actions は s3:PutObject
  • ARN "arn:aws:s3:::yourS3bucketname/prefix/AWSLogs/yourAWSAccountID/*" の赤のところを埋める。
  • yourAWSAccountID は AWS 管理画面の iam から確認可能。

 

aws-policy-generator

入力後は "Add Statement" ボタンをポチって、"Generate Policy" ボタンをポチって JSON を生成する。
このポリシーを転送先 S3 バケットのパーミッションに設定する。

$ cat s3-policy.json
{
  "Id": "Policy1397977086861",
  "Statement": [
    {
      "Sid": "Stmt1397977082952",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::elb-logs/test/AWSLogs/01234567890/*",
      "Principal": {
        "AWS": [
          "582318560864"
        ]
      }
    }
  ]
}

$ aws s3api put-bucket-policy --bucket elb-logs --policy file://s3-policy.json

S3 ログの取得

アクセスログは

{Bucket}/{Prefix}/AWSLogs/{AWS AccountID}/elasticloadbalancing/{Region}/{Year}/{Month}/{Day}/{AWS Account ID}_elasticloadbalancing_{Region}_{Load Balancer Name}_{End Time}_{Load Balancer IP}_{Random String}.log

という命名規則で S3 に PUT されていく。
ローカルに S3 ログファイルをコピーしたいときは、以下のコマンドを実行。

$ aws s3 cp --recursive s3://elb-logs .

取得したログを確認。

$ tree
.
`-- test
    `-- AWSLogs
        `-- 01234567890
            |-- ELBAccessLogTestFile
            `-- elasticloadbalancing
                `-- ap-northeast-1
                    `-- 2014
                        `-- 04
                            |-- 19
                            |   |-- 423109663842_elasticloadbalancing_ap-northeast-1_demo_20140419T1805Z_54.218.215.124_2mo578bn.log
                            |   |-- 423109663842_elasticloadbalancing_ap-northeast-1_demo_20140419T1810Z_54.218.215.124_4dwd8vzz.log
                            |   `-- 423109663842_elasticloadbalancing_ap-northeast-1_demo_20140419T1825Z_54.218.215.124_5cha5k4q.log
                            `-- 20
                                |-- 423109663842_elasticloadbalancing_ap-northeast-1_demo_20140420T0205Z_54.218.215.124_4ja90q36.log
                                `-- 423109663842_elasticloadbalancing_ap-northeast-1_demo_20140420T0220Z_54.218.215.124_311zz88t.log

9 directories, 6 files

ログの活用例

Advertisements
Tagged with: , , ,
Posted in aws

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
%d bloggers like this: