[AWS][Elasticsearch]记一次Elasticsearch无法捕捉到fargate log的解决

说问题前,首先说一下这个做法的思路和实现步骤:

  • Cloudformation定义Resource时需要AWS::Logs::LogGroup
  • 在Cloudwatch Log group里找到对应ECS fargate产生的Log, 选中后Actions-->Stream to Amazon Elasticsearch Service,选中已创建的ES Cluster, 选择Log Format,后续会自动生成对应的Lambda和Role
  • 修改Lambda, 将indexName由原先的
    payload.logEvents.forEach(function(logEvent) {
        var timestamp = new Date(1 * logEvent.timestamp);
        var indexName = [
            'cw-' + timestamp.getUTCFullYear(),              // year
            ('0' + (timestamp.getUTCMonth() + 1)).slice(-2),  // month
            ('0' + timestamp.getUTCDate()).slice(-2)          // day
        ].join('.');

修改为带有index-prefix的indexName, 方便分离创建不同index

    var indexPrefix = payload.logGroup.split('/').slice(-1)[0];
    payload.logEvents.forEach(function(logEvent) {
        var timestamp = new Date(1 * logEvent.timestamp);
              
        // index name format: indexPrefix-YYYY.MM.DD
        var indexName = [
            indexPrefix + '-' + timestamp.getUTCFullYear(),              // year
            ('0' + (timestamp.getUTCMonth() + 1)).slice(-2),  // month
            ('0' + timestamp.getUTCDate()).slice(-2)          // day
        ].join('.');

  • 在ES中进入Kibana, 在management-->Index Patterns里创建新的对应的index pattern即可。创建成功的可在Saved Objects里看到。

再说实现过程中遇到的问题症状:Dev环境下ES可以正常捕捉到Fargate产生的Log,Prod环境下却不行。

最后是我们查到的原因:自动创建的Lambda所对应IAM的Role缺少Policy. 需要包含两个Policy:

  • 一个是AwsLambdaVPCAccessExecutionRole, 用以访问VPC内内容。
AWSLambdaVPCAccessExecutionRole – Grants permissions for Amazon Elastic Compute Cloud (Amazon EC2) actions to manage elastic network interfaces (ENIs).
If you are writing a Lambda function to access resources in a VPC in the Amazon Virtual Private Cloud (Amazon VPC) service, you can attach this permissions policy. The policy also grants permissions for CloudWatch Logs actions to write logs.
  • 另一个Policy则包含一个是ES Cluster的Write,和Cloudwatch Logs的Write,可能由系统产生,名称形式如‘oneClick_lambda_elasticsearch_execution_157xxxxxx’

因为我们建的Managed Elasticseach是private的cluster, 而Lambda作为有可能面向外部的资源,自动生成对应的IAM Role时出于安全考虑,系统不会自动添加允许访问VPC内内容的Policy, 所以需要手动添加,也就是上面提到的第一个Policy。