LoginSignup
0
1

AWS Lambda のデプロイ(CLI)

Last updated at Posted at 2023-05-31

VPCの作成
サブネットとサブネットグループの作成
ルートテーブルの作成とサブネットとの関連付け
エンドポイントの作成
セキュリティグループの作成
データベースの作成
S3の作成
Lambdaの作成(ライブラリの作成、レイヤーの作成)
Lambda実行ロールの作成
Lambdaの作成(関数ファイルの作成、Lambda関数の作成)
Lambdaの設定
サブスクリプションフィルタの設定
実行と確認

VPCの作成

  • VPC「cli-myproject-vpc」の作成をします。
  • powershell で実行します。
# デフォルトのリージョンを設定します。
$AWS_DEFAULT_REGION="ap-southeast-1"

# VPC タグの設定
$EC2_VPC_TAG_NAME="cli-myproject-vpc"
$STRING_EC2_VPC_TAG="ResourceType=vpc,Tags=[{Key=Name,Value=$EC2_VPC_TAG_NAME}]"
# VPC CIDR の設定
# 使用可能なホストアドレス範囲「10. 0. 0. 1~10. 0. 15.254」
# 参考 https://hogehoge.tk/ip/
$EC2_VPC_CIDR="10.0.0.0/20"
# VPC の作成
aws ec2 create-vpc `
  --cidr-block $EC2_VPC_CIDR `
  --tag-specifications $STRING_EC2_VPC_TAG
# 作成した VPC の確認
aws ec2 describe-vpcs `
  --filters Name=tag:Name,Values=$EC2_VPC_TAG_NAME `
  --query 'Vpcs[].Tags[?Key==`Name`].Value' `
  --output text

サブネットとサブネットグループの作成

  • サブネット「cli-myproject-private-subnet-a」「cli-myproject-private-subnet-b」の作成をします。
# サブネットタグの設定
$EC2_AZ_CODE_A="a"
$EC2_AZ_CODE_C="c"
$EC2_SUBNET_TYPE="private"
$EC2_SUBNET_TAG_NAME_A="cli-myproject-$EC2_SUBNET_TYPE-subnet-$EC2_AZ_CODE_A"
$EC2_SUBNET_TAG_NAME_C="cli-myproject-$EC2_SUBNET_TYPE-subnet-$EC2_AZ_CODE_C"
$STRING_EC2_SUBNET_A_TAG="ResourceType=subnet,Tags=[{Key=Name,Value=$EC2_SUBNET_TAG_NAME_A}]"
$STRING_EC2_SUBNET_C_TAG="ResourceType=subnet,Tags=[{Key=Name,Value=$EC2_SUBNET_TAG_NAME_C}]"
# サブネット CIDR の設定
# 10. 0. 0. 1~10. 0. 0.254
$EC2_SUBNET_A_CIDR="10.0.0.0/24"
# 10. 0. 1. 1~10. 0. 1.254
$EC2_SUBNET_C_CIDR="10.0.1.0/24"
# availability-zone の設定
$EC2_AZ_NAME_A="$AWS_DEFAULT_REGION$EC2_AZ_CODE_A"
$EC2_AZ_NAME_C="$AWS_DEFAULT_REGION$EC2_AZ_CODE_C"
# VPCID の取得
$EC2_VPC_ID=aws ec2 describe-vpcs `
    --filters "Name=tag:Name,Values=$EC2_VPC_TAG_NAME" `
    --query 'Vpcs[].VpcId' `
    --output text
# サブネットの作成(A)
aws ec2 create-subnet `
  --vpc-id $EC2_VPC_ID `
  --cidr-block $EC2_SUBNET_A_CIDR `
  --availability-zone $EC2_AZ_NAME_A `
  --tag-specifications $STRING_EC2_SUBNET_A_TAG
# サブネットの作成(C)
aws ec2 create-subnet `
  --vpc-id $EC2_VPC_ID `
  --cidr-block $EC2_SUBNET_C_CIDR `
  --availability-zone $EC2_AZ_NAME_C `
  --tag-specifications $STRING_EC2_SUBNET_C_TAG
# 作成したサブネットの確認
aws ec2 describe-subnets `
  --filters Name=vpc-id,Values=$EC2_VPC_ID `
            Name=tag:Name,Values=$EC2_SUBNET_TAG_NAME_A `
  --query 'Subnets[].[Tags[?Key==`Name`].Value]' `
  --output text
aws ec2 describe-subnets `
  --filters Name=vpc-id,Values=$EC2_VPC_ID `
            Name=tag:Name,Values=$EC2_SUBNET_TAG_NAME_C `
  --query 'Subnets[].[Tags[?Key==`Name`].Value]' `
  --output text
  • サブネットグループの作成(RDS用)
# サブネット ID の設定(A)
$EC2_SUBNET_A_ID=aws ec2 describe-subnets `
  --filters Name=vpc-id,Values=$EC2_VPC_ID `
            Name=tag:Name,Values=$EC2_SUBNET_TAG_NAME_A `
  --query 'Subnets[].SubnetId' `
  --output text
# サブネット ID の設定(C)
$EC2_SUBNET_C_ID=aws ec2 describe-subnets `
  --filters Name=vpc-id,Values=$EC2_VPC_ID `
            Name=tag:Name,Values=$EC2_SUBNET_TAG_NAME_C `
  --query 'Subnets[].SubnetId' `
  --output text
$EC2_SUBNET_GROUP_TAG_NAME="cli-myproject-$EC2_SUBNET_TYPE-subnet-group"
$STRING_EC2_SUBNET_GROUP_TAG="Key=Name,Value=$EC2_SUBNET_GROUP_TAG_NAME"
# サブネットグループの作成
aws rds create-db-subnet-group `
  --db-subnet-group-name $EC2_SUBNET_GROUP_TAG_NAME `
  --db-subnet-group-description "subnet group description" `
  --subnet-ids $EC2_SUBNET_A_ID $EC2_SUBNET_C_ID `
  --tags $STRING_EC2_SUBNET_GROUP_TAG
# 作成したサブネットグループの確認
aws rds describe-db-subnet-groups `
  --db-subnet-group-name $EC2_SUBNET_GROUP_TAG_NAME `
  --query 'DBSubnetGroups[].DBSubnetGroupName' `
  --output text

ルートテーブルの作成とサブネットとの関連付け

ルートテーブル「cli-myproject-private-route-table」を作成します。

# ルートテーブルタグの設定
$EC2_ROUTE_TABLE_TAG_NAME_A="cli-myproject-private-route-table-a"
$EC2_ROUTE_TABLE_TAG_NAME_C="cli-myproject-private-route-table-c"
$STRING_EC2_ROUTE_TABLE_A_TAG="ResourceType=route-table,Tags=[{Key=Name,Value=$EC2_ROUTE_TABLE_TAG_NAME_A}]"
$STRING_EC2_ROUTE_TABLE_C_TAG="ResourceType=route-table,Tags=[{Key=Name,Value=$EC2_ROUTE_TABLE_TAG_NAME_C}]"
# ルートテーブルの作成(A)
aws ec2 create-route-table `
  --vpc-id $EC2_VPC_ID `
  --tag-specifications $STRING_EC2_ROUTE_TABLE_A_TAG
# ルートテーブルの作成(C)
aws ec2 create-route-table `
  --vpc-id $EC2_VPC_ID `
  --tag-specifications $STRING_EC2_ROUTE_TABLE_C_TAG
# 作成したルートテーブルの確認
aws ec2 describe-route-tables `
  --filters Name=vpc-id,Values=$EC2_VPC_ID `
            Name=tag:Name,Values=$EC2_ROUTE_TABLE_TAG_NAME_A `
  --query 'RouteTables[].Tags[?Key==`Name`].Value' `
  --output text
aws ec2 describe-route-tables `
  --filters Name=vpc-id,Values=$EC2_VPC_ID `
            Name=tag:Name,Values=$EC2_ROUTE_TABLE_TAG_NAME_C `
  --query 'RouteTables[].Tags[?Key==`Name`].Value' `
  --output text
  • サブネットとルートテーブルの関連付けを行う。
# ルートテーブル ID の設定(A)
$EC2_ROUTE_TABLE_A_ID=aws ec2 describe-route-tables `
  --filters Name=vpc-id,Values=$EC2_VPC_ID `
            Name=tag:Name,Values=$EC2_ROUTE_TABLE_TAG_NAME_A `
  --query 'RouteTables[].RouteTableId' `
  --output text
# ルートテーブル ID の設定(C)
$EC2_ROUTE_TABLE_C_ID=aws ec2 describe-route-tables `
  --filters Name=vpc-id,Values=$EC2_VPC_ID `
            Name=tag:Name,Values=$EC2_ROUTE_TABLE_TAG_NAME_C `
  --query 'RouteTables[].RouteTableId' `
  --output text
# サブネットとルートテーブルの関連付け(A)
aws ec2 associate-route-table `
  --subnet-id $EC2_SUBNET_A_ID `
  --route-table-id $EC2_ROUTE_TABLE_A_ID
# サブネットとルートテーブルの関連付け(C)
aws ec2 associate-route-table `
  --subnet-id $EC2_SUBNET_C_ID `
  --route-table-id $EC2_ROUTE_TABLE_C_ID
# ルートテーブルに関連付いているサブネットの確認
aws ec2 describe-route-tables `
  --route-table-ids $EC2_ROUTE_TABLE_A_ID `
  --query 'RouteTables[].Associations[].SubnetId' `
  --output text
aws ec2 describe-route-tables `
  --route-table-ids $EC2_ROUTE_TABLE_C_ID `
  --query 'RouteTables[].Associations[].SubnetId' `
  --output text

エンドポイントの作成

  • S3 と接続するためのエンドポイント「cli-myproject-vpce-s3」を作成します。
# エンドポイントタグの設定
$EC2_ENDPOINT_TAG_NAME="cli-myproject-vpce-s3"
$STRING_EC2_ENDPOINT_TAG="ResourceType=vpc-endpoint,Tags=[{Key=Name,Value=$EC2_ENDPOINT_TAG_NAME}]"
# エンドポイントの作成
aws ec2 create-vpc-endpoint `
  --vpc-id $EC2_VPC_ID `
  --service-name com.amazonaws.ap-southeast-1.s3 `
  --route-table-ids $EC2_ROUTE_TABLE_A_ID $EC2_ROUTE_TABLE_C_ID `
  --tag-specifications $STRING_EC2_ENDPOINT_TAG
# 作成したエンドポイントの確認
aws ec2 describe-vpc-endpoints `
  --filters Name=tag:Name,Values=$EC2_ENDPOINT_TAG_NAME `
  --query 'VpcEndpoints[].Tags[?Key==`Name`].Value' `
  --output text

セキュリティグループの作成

  • セキュリティグループ「cli-myproject-security-group」を作成します。
# セキュリティグループタグの設定
$EC2_SECURITY_GROUP_NAME="cli-myproject-security-group"
$STRING_EC2_ENDPOINT_TAG="ResourceType=security-group,Tags=[{Key=Name,Value=$EC2_SECURITY_GROUP_NAME}]"
# セキュリティグループの作成
aws ec2 create-security-group `
  --group-name $EC2_SECURITY_GROUP_NAME `
  --description $EC2_SECURITY_GROUP_NAME `
  --vpc-id $EC2_VPC_ID `
  --tag-specifications $STRING_EC2_ENDPOINT_TAG
# 作成したセキュリティグループの確認
aws ec2 describe-security-groups `
  --filters Name=tag:Name,Values=$EC2_SECURITY_GROUP_NAME `
  --query 'SecurityGroups[].Tags[?Key==`Name`].Value' `
  --output text
  • セキュリティグループにインバウンドルール、アウトバウンドルールの設定
# セキュリティグループ ID の設定
$SECURITY_GROUP_ID=aws ec2 describe-security-groups `
  --filters Name=tag:Name,Values=$EC2_SECURITY_GROUP_NAME `
  --query 'SecurityGroups[].GroupId' `
  --output text
# セキュリティグループRULEの設定
$STRING_SECURITY_GROUP_RULE="IpProtocol=-1,FromPort=-1,ToPort=-1,UserIdGroupPairs=[{GroupId=$SECURITY_GROUP_ID,Description='security_group'}]"
# インバウンドルールを作成する。
aws ec2 authorize-security-group-ingress `
  --group-id $SECURITY_GROUP_ID `
  --ip-permissions $STRING_SECURITY_GROUP_RULE
# アウトバウンドルールを作成する。
aws ec2 authorize-security-group-egress `
  --group-id $SECURITY_GROUP_ID `
  --ip-permissions $STRING_SECURITY_GROUP_RULE

データベースの作成

  • RDS「cli-myproject-rds」を作成します。
# RDS タグの設定
$RDS_NAME="cli-myproject-rds"
$STRING_RDS_TAG="Key=Name,Value=$RDS_NAME"
# RDS の作成
aws rds create-db-instance `
  --db-instance-identifier $RDS_NAME `
  --db-instance-class db.t2.micro `
  --engine mysql `
  --engine-version 8.0.32 `
  --db-name mysql_db `
  --master-username admin `
  --master-user-password adminadmin `
  --port 3306 `
  --allocated-storage 20 `
  --no-publicly-accessible `
  --vpc-security-group-ids $SECURITY_GROUP_ID `
  --db-subnet-group-name $EC2_SUBNET_GROUP_TAG_NAME `
  --no-copy-tags-to-snapshot `
  --backup-retention-period 0 `
  --tags $STRING_RDS_TAG
# 作成した RDS の確認
aws rds describe-db-instances `
  --db-instance-identifier $RDS_NAME `
  --query 'DBInstances[].[DBInstanceIdentifier,DBInstanceStatus]' `
  --output text

S3の作成

# ユニークな名前を設定
$S3_NAME="my-bucket-12312309809813579"
aws s3 mb "s3://$S3_NAME"

Lambda実行ロールの作成

  • policy.json を作成します。
policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
        "Effect": "Allow",
        "Principal": {
            "Service": "lambda.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
        }
    ]
}
  • Lambda 実行ロール(cli-lambda-role)を作成します。
# 新しいロールを作成
$LAMBDA_ROLE_NAME="cli-lambda-role"
aws iam create-role `
  --role-name $LAMBDA_ROLE_NAME `
  --assume-role-policy-document file://policy.json
# 作成したロールに権限の付与
aws iam attach-role-policy `
  --role-name $LAMBDA_ROLE_NAME `
  --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess
aws iam attach-role-policy `
  --role-name $LAMBDA_ROLE_NAME `
  --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
aws iam attach-role-policy `
  --role-name $LAMBDA_ROLE_NAME `
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
# 作成したロールの確認
aws iam get-role `
  --role-name $LAMBDA_ROLE_NAME `
  --query "[Role.RoleName]" `
  --output text
# 作成したロールのポリシーの確認
aws iam list-attached-role-policies `
  --role-name $LAMBDA_ROLE_NAME `
  --query "[AttachedPolicies][][PolicyArn]" `
  --output text

Lambdaの作成(ライブラリの作成、レイヤーの作成)

# MySQL のライブラリの作成
pip install -t python/lib/python3.8/site-packages mysql.connector
zip -r mysql.zip python
rm -r python
# boto3 のライブラリの作成
pip install -t python/lib/python3.8/site-packages boto3
zip -r boto3.zip python
  • レイヤー「cli-mysql-layer」「cli-boto3-layer」を作成する。
# レイヤー名の設定
$LAYER_NAME_MYSQL="cli-mysql-layer"
$LAYER_NAME_boto3="cli-boto3-layer"
# レイヤー(MySQL)の作成
aws lambda publish-layer-version `
    --layer-name $LAYER_NAME_MYSQL `
    --description "layer description MySQL" `
    --zip-file "fileb://mysql.zip" `
    --compatible-runtimes "python3.8" `
    --compatible-architectures "x86_64"
# レイヤー(boto3)の作成
aws lambda publish-layer-version `
    --layer-name $LAYER_NAME_boto3 `
    --description "layer description boto3" `
    --zip-file "fileb://boto3.zip" `
    --compatible-runtimes "python3.8" `
    --compatible-architectures "x86_64"
# 作成したレイヤーの確認
aws lambda list-layers `
  --query "Layers[?LayerName==``$LAYER_NAME_MYSQL``].[LayerName]" `
  --output text
aws lambda list-layers `
  --query "Layers[?LayerName==``$LAYER_NAME_boto3``].[LayerName]" `
  --output text

Lambdaの作成(関数ファイルの作成、Lambda関数の作成)

  • Lambda 関数ファイルを作成・zip にして、アップロードして Lambda 関数を作成します。
  • 1つ目の Lambda 関数ファイル(ファイル名は「lambda_01.py」としました。)
import mysql.connector
import json
import os
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

host = os.environ['RDS_HOST_NAME']
user = os.environ['USER_NAME']
password = os.environ['PASSWORD']
db = os.environ['DB_NAME']

def lambda_handler(event, context):
    conn = None
    date_time = None
    message = None
    try:
        # MySQL の接続
        conn = mysql.connector.connect(
            user=user,
            password=password,
            database=db,
            host=host
        )
        cur = conn.cursor()
        # 日時の取得
        cur.execute(f"SELECT NOW();")
        results = cur.fetchall()
        message = f"{results[0][0]}"
        logger.info("取得した時刻:" + message)
        status_code = 200
    except Exception as e:
        logger.info(f"Error Occurred: {e}")
        status_code = 500
        message = "error"
    finally:
        if conn is not None and conn.is_connected():
            conn.close()
    return {
        "statusCode": status_code,
        "body": json.dumps({
            "res": message,
            "event": event
            })
    }
  • 2つ目の Lambda 関数ファイル(ファイル名は「lambda_02.py」としました。)
import json
import base64
import gzip
import re
import boto3
import tempfile
import os
import glob
from datetime import datetime, timedelta, timezone
from boto3.session import Session

import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

JST = timezone(timedelta(hours=+9), 'JST')

BUCKET_NAME = os.environ['BUCKET_NAME']

def lambda_handler(event, context):
    try:
        # base64 デコード
        decoded_data = base64.b64decode(event["awslogs"]["data"])
        # gzip 解凍
        decompressed_data = gzip.decompress(decoded_data)
        #decompressed_data = '{"test": "test1", "logEvents": [{"message":"aaa取得した時刻:aaa", "test3": "eee"}]}'
        json_data = json.loads(decompressed_data)
        logger.info(json_data)
        
        # 取得した時刻:が書かれているログの一部を抜き出します。
        for logEvent in json_data["logEvents"]:
            log = re.search(r"取得した時刻:.*", logEvent["message"])
            if log != None:
                message = log.group()
                logger.info("イベント:{0}".format(message))
                break
        # 一時ファイルへの書き込み
        with tempfile.TemporaryDirectory() as tmpdir_name:
            tmpfile_name = "temp.txt"
            tmpfile_path = os.path.join(tmpdir_name, tmpfile_name)
            # tmpファイルの作成
            with open(tmpfile_path, "w", encoding='UTF-8') as f:
                f.write(message)
            logger.info("一時ファイル:{0}".format(glob.glob(tmpfile_path, recursive=True)))
            # tmpファイルの中身を確認
            with open(tmpfile_path, encoding='UTF-8') as f:
                logger.info("一時ファイルの中身:{0}".format(f.read()))

            # tmpファイルを S3 へアップロード
            s3 = boto3.resource("s3")
            bucket = s3.Bucket(BUCKET_NAME)
            date_time = datetime.now(JST).strftime('%Y%m%d_%H%M%S_%f')
            logger.info("現在時刻:{0}".format(date_time))
            s3file_path = os.path.join(date_time, tmpfile_name)
            bucket.upload_file(tmpfile_path, s3file_path)

        # 一時ファイルの削除を確認
        logger.info("削除後の一時ファイル:{0}".format(glob.glob(tmpfile_path, recursive=True)))
        # s3ファイルの確認
        for obj in bucket.objects.all():
            logger.info("S3削除対象:{0}".format(obj.key))
            # s3ファイルの削除
            res = bucket.objects.filter(Prefix=obj.key).delete()
            logger.info("削除したS3ファイル:HTTPStatusCode:{0}, Deleted:{1}".format(res[0]["ResponseMetadata"]["HTTPStatusCode"], res[0]["Deleted"][0]["Key"]))
    except Exception as e:
        logger.info(f"Error Occurred: {e}")
    return {
        "statusCode": 200,
        "body": json.dumps({
            "res": "S3TEST",
            "event": event
            }),
    }
  • Lambda 関数「cli_rds_lambda」「cli_s3_lambda」を作成します。
# Lambda 関数名の設定
$LAMBDA_FUNCTION_NAME_RDS="cli_rds_lambda"
$LAMBDA_FUNCTION_NAME_S3="cli_s3_lambda"
# ロール ARN の設定
$LAMBDA_ROLE=aws iam get-role `
  --role-name $LAMBDA_ROLE_NAME `
  --query "[Role.Arn]" `
  --output text
# RDS に接続する Lambda 関数の作成
aws lambda create-function `
  --function-name $LAMBDA_FUNCTION_NAME_RDS `
  --timeout 10 `
  --runtime python3.8 `
  --zip-file fileb://lambda_01.zip `
  --handle lambda_01.lambda_handler `
  --role $LAMBDA_ROLE
# S3 に接続する Lambda 関数の作成
aws lambda create-function `
  --function-name $LAMBDA_FUNCTION_NAME_S3 `
  --timeout 10 `
  --runtime python3.8 `
  --zip-file fileb://lambda_02.zip `
  --handle lambda_02.lambda_handler `
  --role $LAMBDA_ROLE
# 作成した Lambda 関数の確認
aws lambda list-functions `
  --query "Functions[?FunctionName==``$LAMBDA_FUNCTION_NAME_RDS``].FunctionName" `
  --output text
aws lambda list-functions `
  --query "Functions[?FunctionName==``$LAMBDA_FUNCTION_NAME_S3``].FunctionName" `
  --output text

Lambdaの設定

  • Lambda 関数に環境変数、VPC、レイヤーを設定します。
# レイヤーの「LayerVersionArn」を設定します。
$MYSQL_LAYER_ARN=aws lambda list-layers `
  --query Layers[?LayerName==``$LAYER_NAME_MYSQL``].LatestMatchingVersion[].LayerVersionArn[] `
  --output text
$BOTO3_LAYER_ARN=aws lambda list-layers `
  --query Layers[?LayerName==``$LAYER_NAME_boto3``].LatestMatchingVersion[].LayerVersionArn[] `
  --output text
# Lambda 関数に環境変数、VPC、レイヤーを設定
# RDS 情報の設定
$RDS_HOST_NAME=aws rds describe-db-instances `
  --db-instance-identifier $RDS_NAME `
  --query DBInstances[].Endpoint[].Address `
  --output text
# Lambda 関数の更新
aws lambda update-function-configuration `
  --function-name $LAMBDA_FUNCTION_NAME_RDS `
  --environment "Variables={ `
      DB_NAME=mysql_db, `
      PASSWORD=adminadmin, `
      RDS_HOST_NAME=$RDS_HOST_NAME, `
      USER_NAME=admin
  }" `
  --vpc-config "SubnetIds=$EC2_SUBNET_A_ID,SecurityGroupIds=$SECURITY_GROUP_ID" `
  --layers $MYSQL_LAYER_ARN
aws lambda update-function-configuration `
  --function-name $LAMBDA_FUNCTION_NAME_S3 `
  --environment "Variables={ `
      BUCKET_NAME=my-bucket-12312309809813579 `
  }" `
  --vpc-config "SubnetIds=$EC2_SUBNET_A_ID,SecurityGroupIds=$SECURITY_GROUP_ID" `
  --layers $BOTO3_LAYER_ARN

サブスクリプションフィルタの設定

  • ロググループを作成します。
# ロググループ名の設定
$RDS_LOG_GROUP_NAME="/aws/lambda/$LAMBDA_FUNCTION_NAME_RDS"
$S3_LOG_GROUP_NAME="/aws/lambda/$LAMBDA_FUNCTION_NAME_S3"
# ロググループの作成
aws logs create-log-group `
    --log-group-name $RDS_LOG_GROUP_NAME
aws logs create-log-group `
    --log-group-name $S3_LOG_GROUP_NAME
# 作成したロググループの確認
aws logs describe-log-groups `
  --query logGroups[?logGroupName==``$RDS_LOG_GROUP_NAME``].logGroupName `
  --output text
aws logs describe-log-groups `
  --query logGroups[?logGroupName==``$S3_LOG_GROUP_NAME``].logGroupName `
  --output text
  • サブスクリプションフィルタで呼び出す Lambda に log-group(サブスクリプションフィルタ) からのアクセスを許可します。
# Lambda 関数を呼び出すロググループの ARN を設定
$LOG_GROUP_RDS_ARN=aws logs describe-log-groups `
  --query logGroups[?logGroupName==``/aws/lambda/$LAMBDA_FUNCTION_NAME_RDS``].arn `
  --output text
# アカウント ID を設定(IAMログインする時のID)
$ACCOUNT_ID="123456789012"
# Lambda 関数に権限を追加
aws lambda add-permission `
  --function-name $LAMBDA_FUNCTION_NAME_S3 `
  --statement-id cli-subscriptionfilter-event `
  --action lambda:InvokeFunction `
  --principal logs.amazonaws.com `
  --source-arn $LOG_GROUP_RDS_ARN `
  --source-account $ACCOUNT_ID
  • サブスクリプションフィルタを作成します。
# サブスクリプションフィルタ名を設定
$SUBSCRIPTION_FILTER_NAME="cli_myproject_subscriptionfilter"
# 呼び出す Lambda 関数の ARN を設定
$CALLEE_LAMBDA_ARN=aws lambda list-functions `
  --query "Functions[?FunctionName==``$LAMBDA_FUNCTION_NAME_S3``].FunctionArn" `
  --output text
# サブスクリプションフィルタを作成する。
aws logs put-subscription-filter `
  --log-group-name $RDS_LOG_GROUP_NAME `
  --filter-name $SUBSCRIPTION_FILTER_NAME `
  --filter-pattern "取得した時刻" `
  --destination-arn $CALLEE_LAMBDA_ARN

実行と確認

  • 以下コマンドで Lambda 関数(RDS)を実行します。
# $LAMBDA_FUNCTION_NAME_RDS を実行します。
aws lambda invoke `
  --function-name $LAMBDA_FUNCTION_NAME_RDS `
  result.log
  • 実行後 CloudWatch のログを確認します。
# ログストリーム名を設定
$LOG_STREAM_NAME_RDS=aws logs describe-log-streams `
  --log-group-name $RDS_LOG_GROUP_NAME `
  --query "logStreams[].logStreamName" `
  --order-by LastEventTime `
  --descending `
  --max-items 1 `
  --output text
$LOG_STREAM_NAME_S3=aws logs describe-log-streams `
  --log-group-name $S3_LOG_GROUP_NAME `
  --query "logStreams[].logStreamName" `
  --order-by LastEventTime `
  --descending `
  --max-items 1 `
  --output text
# ログイベントを表示
# CloudWatch のサブスクリプションフィルタで Lambda 関数(S3) が呼び出されている事を確認出来ます。
aws logs get-log-events `
  --log-stream-name $LOG_STREAM_NAME_RDS[0] `
  --log-group-name $RDS_LOG_GROUP_NAME `
  --query "events[].message" `
  --output text
aws logs get-log-events `
  --log-stream-name $LOG_STREAM_NAME_S3[0] `
  --log-group-name $S3_LOG_GROUP_NAME `
  --query "events[].message" `
  --output text
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1