使用AWS CLI将日志流转为弹性

时间:2019-09-23 12:26:13

标签: amazon-web-services elasticsearch aws-cli amazon-cloudwatch

我想启用从Cloudwatch到Elasticsearch的Stream to Amazon Elasticsearch Service。

enter image description here

我熟悉如何手动执行此操作,我正在寻找一种通过运行aws cli命令来实现此目标的方法。

假设Elasticsearch已配置,是否有任何方法可以自动执行该过程?

2 个答案:

答案 0 :(得分:2)

在“流至Amazon Elasticsearch”服务的后台创建新的lambda,然后将日志推送到Lambda,然后是ELK。

目标网址

  

Kinesis流的Amazon资源名称(ARN),Kinesis数据   您想用作目标的Firehose流或Lambda函数   订阅供稿。

所以这是推送到AWS lambda的方法,Lambda会自动将这些流推送到ELK。

aws logs put-subscription-filter --log-group-name log_group_name --filter-pattern "" --filter-name filter_name_demo   --destination-arn arn:aws:lambda:us-west-2:***********:function:your_lambda_name

AmazonCloudWatch-logs-Subscriptions

答案 1 :(得分:2)

更新

如果您正在使用cloudformation,请看一下我的答案here


非常感谢@Adiii为我指出了正确的方向,请在下面找到此问题的端到端解决方案。

解决方案包括以下部分:

  • create-lambda-role

  • 授予lambda角色的权限

  • create-lambda
  • grant-cloudwatch-permission-execute-lambda
  • 向cloudwatch-log-group添加订阅

我认为lambda函数已经打包并且可以访问了。 您可以找到lambda函数here

手动执行here

1。 create-lambda-role

首先,我们需要创建lambda函数使用的角色,然后我们将相关策略附加到该角色。

    cat > lambda-policy.json << EOF
{
  "Version": "2012-10-17",
  "Statement": {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
  }
} 
EOF

    aws iam create-role \
    --role-name ${ROLE_NAME} \
    --assume-role-policy-document file://lambda-policy.json \
    --profile ${PROFILE} \
    >/dev/null

2。将许可授予lambda角色

将相关政策附加到lambda角色。

 cat > lambda-to-es-via-vpc-policy.json << EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1569580358341",
      "Action": "es:*",
      "Effect": "Allow",
      "Resource": "arn:aws:es:${AWS_REGION}:${AWS_ACCOUNT_ID}:domain/${ES_DOMAIN}/*"
    },
    {
      "Sid": "Stmt1569580707924",
      "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "ec2:CreateNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DeleteNetworkInterface"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
EOF

    aws iam put-role-policy \
    --role-name ${ROLE_NAME} \
    --policy-name lambda-to-es-via-vpc-policy \
    --policy-document file://lambda-to-es-via-vpc-policy.json \
    --profile ${PROFILE} \
    >/dev/null

3。 create-lambda

aws lambda create-function \
    --function-name ${LAMBDA_NAME} \
    --runtime nodejs8.10 \
    --role arn:aws:iam::${AWS_ACCOUNT_ID}:role/${ROLE_NAME} \
    --handler ${LAMBDA_NAME}.handler \
    --zip-file fileb://${LAMBDA_NAME}.zip \
    --timeout 30 \
    --vpc-config SubnetIds=${SUBNET_IDS},SecurityGroupIds=${SECURITY_GROUP_IDS} \
    --profile ${PROFILE} \
    >/dev/null

4。 grant-cloudwatch-permission-toexecutelambda

授予AWS服务或其他帐户使用功能的权限。

aws lambda add-permission \
--function-name "${LAMBDA_NAME}" \
--statement-id "${LAMBDA_NAME}" \
--principal "logs.${AWS_REGION}.amazonaws.com" \
--action "lambda:InvokeFunction" \
--source-arn "arn:aws:logs:${AWS_REGION}:${AWS_ACCOUNT_ID}:log-group:/aws/eks/${EKS_CLUSTER}/cluster:*" \
--source-account ${AWS_ACCOUNT_ID} \
--profile ${PROFILE} \
>/dev/null

5。将订阅添加到cloudwatch-log-group

创建或更新订阅筛选器,并将其与指定的日志组关联。订阅过滤器使您可以订阅日志事件的实时流,并将其传递到特定的目的地。

  aws logs put-subscription-filter \
   --log-group-name  "/aws/eks/${EKS_CLUSTER}/cluster" \
   --filter-name "Common Log Format" \
   --filter-pattern "[host, ident, authuser, date, request, status, bytes]" \
   --destination-arn  arn:aws:lambda:${AWS_REGION}:${AWS_ACCOUNT_ID}:function:${LAMBDA_NAME} \
   --profile ${PROFILE} \
   >/dev/null