Большое спасибо @Adiii, который указал мне правильное направление. Найдите ниже сквозное решение для этой проблемы.
Решение Включите следующие части:
- create-lambda-role
- предоставление-разрешений-лямбда-ролям
- создание-лямбда
- предоставление-облачных наблюдений-разрешение-выполнять-лямбда
- add-subscription-to-cloudwatch-log-group
Я предполагаю, что лямбда-функция уже упакована и доступна.Вы можете найти лямбда-функцию здесь .
Ручные шаги здесь .
1.create-lambda-role
Сначала нам нужно создать роль, которую использует лямбда-функция, затем мы прикрепим соответствующие политики к этой роли.
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.grant-permissions-to-lambda-role
Прикрепите соответствующие политики к лямбда-роли.
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-разрешение-to-execute-lambda
Предоставляет службе 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.add-subscription-to-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