Lambda에서 애플리케이션 활성화 - Amazon CloudWatch

Lambda에서 애플리케이션 활성화

Lambda 함수에 대해 Application Signals를 활성화할 수 있습니다. Application Signals에서는 Lambda 계층을 통해 제공되는 향상된 AWS Distro for OpenTelemetry(ADOT) 라이브러리를 사용하여 Lambda 함수를 자동으로 계측합니다. 이 OpenTelemetry용 AWS Lambda 계층에서는 Application Signals의 자동 계측에 필요한 라이브러리를 패키징하고 배포합니다.

Application Signals를 지원하는 것 외에도, 이 Lambda 계층은 Lambda OpenTelemetry 지원의 구성 요소이기도 하며 추적 기능을 제공합니다.

또한 트랜잭션 검색을 사용하여 Lambda 관찰성을 개선할 수 있습니다. 이렇게 하면 샘플링 없이 Lambda 함수 간접 호출에 대한 트레이스 스팬을 캡처할 수 있습니다. 이 기능을 사용하면 트레이스 컨텍스트 전파에서 sampled 플래그의 영향을 받지 않고 함수에 대한 스팬을 수집할 수 있습니다. 그리고 이 방법을 사용하면 다운스트림 종속 서비스에 추가적인 영향이 없습니다. Lambda에서 트랜잭션 검색을 활성화하면 함수 성능을 완벽하게 파악할 수 있으며, 드물게 발생하는 문제를 해결할 수 있습니다. 시작하려면 트랜잭션 검색를 참조하십시오

시작

Lambda 함수에 대해 Application Signals를 활성화하는 3가지 방법이 있습니다.

Lambda 함수에 대해 Application Signals를 활성화한 후, 해당 함수의 원격 측정이 Application Signals 콘솔에 표시되려면 몇 분 정도 걸립니다.

  • CloudWatch Application Signals 콘솔 사용

  • Lambda 콘솔 사용

  • Lambda 함수 런타임에 OpenTelemetry용 AWS Lambda 계층을 수동으로 추가합니다.

이러한 각 메서드에서는 함수에 OpenTelemetry용 AWS Lambda 계층이 추가됩니다.

CloudWatch Application Signals 콘솔 사용

다음 단계에 따라 Application Signals 콘솔을 사용하여 Lambda 함수에 대해 Application Signals를 활성화합니다.

  1. https://console.aws.amazon.com/cloudwatch/에서 CloudWatch 콘솔을 엽니다.

  2. 탐색 창에서 Application Signals, 서비스를 선택합니다.

  3. 서비스 목록 영역에서 Application Signals 활성화를 선택합니다.

  4. Lambda 타일을 선택합니다.

  5. Application Signals에 대해 활성화하려는 각 함수를 선택한 다음 완료를 선택합니다.

Lambda 콘솔 사용

다음 단계에 따라 Lambda 콘솔을 사용하여 Lambda 함수에 대한 Application Signals를 활성화합니다.

  1. https://console.aws.amazon.com/lambda/에서 AWS Lambda 콘솔을 엽니다.

  2. 탐색 창에서 함수를 선택한 다음 활성화하려는 함수의 이름을 선택합니다.

  3. 구성을 선택한 다음 모니터링 및 운영 도구를 선택합니다.

  4. 편집을 선택합니다.

  5. CloudWatch Application Signals and X-Ray 섹션에서 Automatically collect application traces and standard application metrics with Application SignalsAutomatically collect Lambda service traces for end to end visibility with X-Ray를 둘 다 선택합니다.

  6. 저장을 선택합니다.

AWS CDK를 사용하여 Lambda에서 Application Signals 활성화

이 계정에서 아직 Application Signals를 활성화하지 않은 경우 서비스를 검색하는 데 필요한 권한을 Application Signals에 부여해야 합니다. 자세한 내용은 계정에서 Application Signals 활성화 섹션을 참조하세요.

  1. 애플리케이션에 대해 Application Signals 활성화

    import { aws_applicationsignals as applicationsignals } from 'aws-cdk-lib'; const cfnDiscovery = new applicationsignals.CfnDiscovery(this, 'ApplicationSignalsServiceRole', { } );

    Discovery CloudFormation 리소스는 Application Signals에 다음 권한을 부여합니다.

    • xray:GetServiceGraph

    • logs:StartQuery

    • logs:GetQueryResults

    • cloudwatch:GetMetricData

    • cloudwatch:ListMetrics

    • tag:GetResources

    이에 대한 자세한 내용은 CloudWatch Application Signals에 대한 서비스 연결 역할 권한 섹션을 참조하세요.

  2. Lambda 함수에 IAM 정책 CloudWatchLambdaApplicationSignalsExecutionRolePolicy를 추가합니다.

    const fn = new Function(this, 'DemoFunction', { code: Code.fromAsset('$YOUR_LAMBDA.zip'), runtime: Runtime.PYTHON_3_12, handler: '$YOUR_HANDLER' }) fn.role?.addManagedPolicy(ManagedPolicy.fromAwsManagedPolicyName('CloudWatchLambdaApplicationSignalsExecutionRolePolicy'));
  3. $AWS_LAMBDA_LAYER_FOR_OTEL_ARN을 해당 리전의 실제 OpenTelemetry ARN용 AWS Lambda 계층으로 바꿉니다.

    fn.addLayers(LayerVersion.fromLayerVersionArn( this, 'AwsLambdaLayerForOtel', '$AWS_LAMBDA_LAYER_FOR_OTEL_ARN' )) fn.addEnvironment("AWS_LAMBDA_EXEC_WRAPPER", "/opt/otel-instrument");

(선택 사항) 애플리케이션 상태 모니터링

Lambda에서 애플리케이션을 활성화하면 애플리케이션 상태를 모니터링할 수 있습니다. 자세한 내용은 Application Signals를 사용하여 애플리케이션의 운영 상태 모니터링 섹션을 참조하세요.

Application Signals를 수동으로 활성화합니다.

다음 단계에 따라 Lambda 함수에 대해 Application Signals를 수동으로 활성화합니다.

  1. Lambda 런타임에 OpenTelemetry용 AWS Lambda 계층을 추가합니다. 계층 ARN을 찾으려면 OpenTelemetry용 AWS Lambda 계층 ARN 섹션을 참조하세요.

  2. 환경 변수 AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-instrument를 추가합니다.

    환경 변수 LAMBDA_APPLICATION_SIGNALS_REMOTE_ENVIRONMENT를 추가하여 사용자 지정 Lambda 환경을 구성합니다. 기본적으로 Lambda 환경은 lambda:default로 구성됩니다.

  3. AWS 관리형 IAM 정책 CloudWatchLambdaApplicationSignalsExecutionRolePolicy를 Lambda 실행 역할에 연결합니다.

  4. (선택 사항) 추적 경험을 더욱 개선하려면 Lambda 활성 추적을 활성화하는 것이 좋습니다. 자세한 내용은 AWS X-Ray로 Lambda 함수 간접 호출 시각화 섹션을 참조하세요.

Application Signals 수동으로 비활성화

Lambda 함수에 대해 Application Signals를 수동으로 비활성화하려면 Lambda 런타임에서 OpenTelemetry용 AWS Lambda 계층을 제거하고 AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-instrument 환경 변수를 제거합니다.

Application Signals 구성

이 섹션을 사용하여 Lambda에서 Application Signals를 구성할 수 있습니다.

여러 Lambda 함수를 하나의 서비스로 그룹화

환경 변수 OTEL_SERVICE_NAME에서는 서비스의 이름을 설정합니다. Application Signals 대시보드에 애플리케이션의 서비스 이름으로 표시됩니다. 여러 Lambda 함수에 동일한 서비스 이름을 할당하면 Application Signals에서 단일 서비스로 병합됩니다. 이 키에 대한 값을 제공하지 않으면 기본값 Lambda 함수 이름이 사용됩니다.

샘플링

기본적으로 트레이스 샘플링 전략은 상위 기반입니다. 환경 변수 OTEL_TRACES_SAMPLER를 설정하여 샘플링 전략을 조정할 수 있습니다.

예를 들면, 트레이스 샘플링 비율을 30%로 설정합니다.

OTEL_TRACES_SAMPLER=traceidratio OTEL_TRACES_SAMPLER_ARG=0.3

자세한 내용은 OpenTelemetry 환경 변수 사양을 참조하세요.

모든 라이브러리 계측 활성화

Lambda 콜드 스타트가 감소하도록 기본적으로 Python, 노드 및 Java에는 AWS SDK 및 HTTP 계측만 활성화되어 있습니다. 환경 변수를 설정하여 Lambda 함수에서 사용되는 다른 라이브러리에 대한 계측을 활성화할 수 있습니다.

  • Python – OTEL_PYTHON_DISABLED_INSTRUMENTATIONS=none

  • 노드 - OTEL_NODE_DISABLED_INSTRUMENTATIONS=none

  • Java – OTEL_INSTRUMENTATION_COMMON_DEFAULT_ENABLED=true

OpenTelemetry용 AWS Lambda 계층 ARN

다음 표에는 지원되는 리전마다 OpenTelemetry용 AWS Lambda 계층을 사용하는 ARN이 나열되어 있습니다.

Python
리전 ARN

미국 동부(버지니아 북부)

arn:aws:lambda:us-east-1:615299751070:layer:AWSOpenTelemetryDistroPython:16

미국 동부(오하이오)

arn:aws:lambda:us-east-2:615299751070:layer:AWSOpenTelemetryDistroPython:13

미국 서부(캘리포니아 북부)

arn:aws:lambda:us-west-1:615299751070:layer:AWSOpenTelemetryDistroPython:20

미국 서부(오리건)

arn:aws:lambda:us-west-2:615299751070:layer:AWSOpenTelemetryDistroPython:20

아프리카(케이프타운)

arn:aws:lambda:af-south-1:904233096616:layer:AWSOpenTelemetryDistroPython:10

아시아 태평양(홍콩)

arn:aws:lambda:ap-east-1:888577020596:layer:AWSOpenTelemetryDistroPython:10

아시아 태평양(하이데라바드)

arn:aws:lambda:ap-south-2:796973505492:layer:AWSOpenTelemetryDistroPython:10

아시아 태평양(자카르타)

arn:aws:lambda:ap-southeast-3:039612877180:layer:AWSOpenTelemetryDistroPython:10

아시아 태평양(멜버른)

arn:aws:lambda:ap-southeast-4:713881805771:layer:AWSOpenTelemetryDistroPython:10

아시아 태평양(뭄바이)

arn:aws:lambda:ap-south-1:615299751070:layer:AWSOpenTelemetryDistroPython:13

아시아 태평양(오사카)

arn:aws:lambda:ap-northeast-3:615299751070:layer:AWSOpenTelemetryDistroPython:12

아시아 태평양(서울)

arn:aws:lambda:ap-northeast-2:615299751070:layer:AWSOpenTelemetryDistroPython:13

아시아 태평양(싱가포르)

arn:aws:lambda:ap-southeast-1:615299751070:layer:AWSOpenTelemetryDistroPython:12

아시아 태평양(시드니)

arn:aws:lambda:ap-southeast-2:615299751070:layer:AWSOpenTelemetryDistroPython:13

아시아 태평양(도쿄)

arn:aws:lambda:ap-northeast-1:615299751070:layer:AWSOpenTelemetryDistroPython:13

캐나다(중부)

arn:aws:lambda:ca-central-1:615299751070:layer:AWSOpenTelemetryDistroPython:13

유럽(프랑크푸르트)

arn:aws:lambda:eu-central-1:615299751070:layer:AWSOpenTelemetryDistroPython:13

유럽(아일랜드)

arn:aws:lambda:eu-west-1:615299751070:layer:AWSOpenTelemetryDistroPython:13

유럽(런던)

arn:aws:lambda:eu-west-2:615299751070:layer:AWSOpenTelemetryDistroPython:13

유럽(밀라노)

arn:aws:lambda:eu-south-1:257394471194:layer:AWSOpenTelemetryDistroPython:10

유럽(파리)

arn:aws:lambda:eu-west-3:615299751070:layer:AWSOpenTelemetryDistroPython:13

유럽(스페인)

arn:aws:lambda:eu-south-2:490004653786:layer:AWSOpenTelemetryDistroPython:10

유럽(스톡홀름)

arn:aws:lambda:eu-north-1:615299751070:layer:AWSOpenTelemetryDistroPython:13

유럽(취리히)

arn:aws:lambda:eu-central-2:156041407956:layer:AWSOpenTelemetryDistroPython:10

이스라엘(텔아비브)

arn:aws:lambda:il-central-1:746669239226:layer:AWSOpenTelemetryDistroPython:10

중동(바레인)

arn:aws:lambda:me-south-1:980921751758:layer:AWSOpenTelemetryDistroPython:10

중동(UAE)

arn:aws:lambda:me-central-1:739275441131:layer:AWSOpenTelemetryDistroPython:10

남아메리카(상파울루)

arn:aws:lambda:sa-east-1:615299751070:layer:AWSOpenTelemetryDistroPython:13

Node.js
리전 ARN

미국 동부(버지니아 북부)

arn:aws:lambda:us-east-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

미국 동부(오하이오)

arn:aws:lambda:us-east-2:615299751070:layer:AWSOpenTelemetryDistroJs:8

미국 서부(캘리포니아 북부)

arn:aws:lambda:us-west-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

미국 서부(오리건)

arn:aws:lambda:us-west-2:615299751070:layer:AWSOpenTelemetryDistroJs:8

아프리카(케이프타운)

arn:aws:lambda:af-south-1:904233096616:layer:AWSOpenTelemetryDistroJs:8

아시아 태평양(홍콩)

arn:aws:lambda:ap-east-1:888577020596:layer:AWSOpenTelemetryDistroJs:8

아시아 태평양(하이데라바드)

arn:aws:lambda:ap-south-2:796973505492:layer:AWSOpenTelemetryDistroJs:6

아시아 태평양(자카르타)

arn:aws:lambda:ap-southeast-3:039612877180:layer:AWSOpenTelemetryDistroJs:8

아시아 태평양(멜버른)

arn:aws:lambda:ap-southeast-4:713881805771:layer:AWSOpenTelemetryDistroJs:8

아시아 태평양(뭄바이)

arn:aws:lambda:ap-south-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

아시아 태평양(오사카)

arn:aws:lambda:ap-northeast-3:615299751070:layer:AWSOpenTelemetryDistroJs:8

아시아 태평양(서울)

arn:aws:lambda:ap-northeast-2:615299751070:layer:AWSOpenTelemetryDistroJs:8

아시아 태평양(싱가포르)

arn:aws:lambda:ap-southeast-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

아시아 태평양(시드니)

arn:aws:lambda:ap-southeast-2:615299751070:layer:AWSOpenTelemetryDistroJs:8

아시아 태평양(도쿄)

arn:aws:lambda:ap-northeast-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

캐나다(중부)

arn:aws:lambda:ca-central-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

유럽(프랑크푸르트)

arn:aws:lambda:eu-central-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

유럽(아일랜드)

arn:aws:lambda:eu-west-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

유럽(런던)

arn:aws:lambda:eu-west-2:615299751070:layer:AWSOpenTelemetryDistroJs:8

유럽(밀라노)

arn:aws:lambda:eu-south-1:257394471194:layer:AWSOpenTelemetryDistroJs:8

유럽(파리)

arn:aws:lambda:eu-west-3:615299751070:layer:AWSOpenTelemetryDistroJs:8

유럽(스페인)

arn:aws:lambda:eu-south-2:490004653786:layer:AWSOpenTelemetryDistroJs:8

유럽(스톡홀름)

arn:aws:lambda:eu-north-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

유럽(취리히)

arn:aws:lambda:eu-central-2:156041407956:layer:AWSOpenTelemetryDistroJs:8

이스라엘(텔아비브)

arn:aws:lambda:il-central-1:746669239226:layer:AWSOpenTelemetryDistroJs:8

중동(바레인)

arn:aws:lambda:me-south-1:980921751758:layer:AWSOpenTelemetryDistroJs:8

중동(UAE)

arn:aws:lambda:me-central-1:739275441131:layer:AWSOpenTelemetryDistroJs:8

남아메리카(상파울루)

arn:aws:lambda:sa-east-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

.Net
리전 ARN

미국 동부(버지니아 북부)

arn:aws:lambda:us-east-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:6

미국 동부(오하이오)

arn:aws:lambda:us-east-2:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

미국 서부(캘리포니아 북부)

arn:aws:lambda:us-west-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

미국 서부(오리건)

arn:aws:lambda:us-west-2:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

아프리카(케이프타운)

arn:aws:lambda:af-south-1:904233096616:layer:AWSOpenTelemetryDistroDotNet:5

아시아 태평양(홍콩)

arn:aws:lambda:ap-east-1:888577020596:layer:AWSOpenTelemetryDistroDotNet:5

아시아 태평양(하이데라바드)

arn:aws:lambda:ap-south-2:796973505492:layer:AWSOpenTelemetryDistroDotNet:5

아시아 태평양(자카르타)

arn:aws:lambda:ap-southeast-3:039612877180:layer:AWSOpenTelemetryDistroDotNet:5

아시아 태평양(멜버른)

arn:aws:lambda:ap-southeast-4:713881805771:layer:AWSOpenTelemetryDistroDotNet:5

아시아 태평양(뭄바이)

arn:aws:lambda:ap-south-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

아시아 태평양(오사카)

arn:aws:lambda:ap-northeast-3:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

아시아 태평양(서울)

arn:aws:lambda:ap-northeast-2:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

아시아 태평양(싱가포르)

arn:aws:lambda:ap-southeast-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

아시아 태평양(시드니)

arn:aws:lambda:ap-southeast-2:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

아시아 태평양(도쿄)

arn:aws:lambda:ap-northeast-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

캐나다(중부)

arn:aws:lambda:ca-central-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

유럽(프랑크푸르트)

arn:aws:lambda:eu-central-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

유럽(아일랜드)

arn:aws:lambda:eu-west-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

유럽(런던)

arn:aws:lambda:eu-west-2:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

유럽(밀라노)

arn:aws:lambda:eu-south-1:257394471194:layer:AWSOpenTelemetryDistroDotNet:5

유럽(파리)

arn:aws:lambda:eu-west-3:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

유럽(스페인)

arn:aws:lambda:eu-south-2:490004653786:layer:AWSOpenTelemetryDistroDotNet:5

유럽(스톡홀름)

arn:aws:lambda:eu-north-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

유럽(취리히)

arn:aws:lambda:eu-central-2:156041407956:layer:AWSOpenTelemetryDistroDotNet:5

이스라엘(텔아비브)

arn:aws:lambda:il-central-1:746669239226:layer:AWSOpenTelemetryDistroDotNet:5

중동(바레인)

arn:aws:lambda:me-south-1:980921751758:layer:AWSOpenTelemetryDistroDotNet:5

중동(UAE)

arn:aws:lambda:me-central-1:739275441131:layer:AWSOpenTelemetryDistroDotNet:5

남아메리카(상파울루)

arn:aws:lambda:sa-east-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

Java
리전 ARN

미국 동부(버지니아 북부)

arn:aws:lambda:us-east-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

미국 동부(오하이오)

arn:aws:lambda:us-east-2:615299751070:layer:AWSOpenTelemetryDistroJava:5

미국 서부(캘리포니아 북부)

arn:aws:lambda:us-west-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

미국 서부(오리건)

arn:aws:lambda:us-west-2:615299751070:layer:AWSOpenTelemetryDistroJava:5

아프리카(케이프타운)

arn:aws:lambda:af-south-1:904233096616:layer:AWSOpenTelemetryDistroJava:5

아시아 태평양(홍콩)

arn:aws:lambda:ap-east-1:888577020596:layer:AWSOpenTelemetryDistroJava:5

아시아 태평양(하이데라바드)

arn:aws:lambda:ap-south-2:796973505492:layer:AWSOpenTelemetryDistroJava:5

아시아 태평양(자카르타)

arn:aws:lambda:ap-southeast-3:039612877180:layer:AWSOpenTelemetryDistroJava:5

아시아 태평양(멜버른)

arn:aws:lambda:ap-southeast-4:713881805771:layer:AWSOpenTelemetryDistroJava:5

아시아 태평양(뭄바이)

arn:aws:lambda:ap-south-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

아시아 태평양(오사카)

arn:aws:lambda:ap-northeast-3:615299751070:layer:AWSOpenTelemetryDistroJava:5

아시아 태평양(서울)

arn:aws:lambda:ap-northeast-2:615299751070:layer:AWSOpenTelemetryDistroJava:5

아시아 태평양(싱가포르)

arn:aws:lambda:ap-southeast-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

아시아 태평양(시드니)

arn:aws:lambda:ap-southeast-2:615299751070:layer:AWSOpenTelemetryDistroJava:5

아시아 태평양(도쿄)

arn:aws:lambda:ap-northeast-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

캐나다(중부)

arn:aws:lambda:ca-central-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

유럽(프랑크푸르트)

arn:aws:lambda:eu-central-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

유럽(아일랜드)

arn:aws:lambda:eu-west-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

유럽(런던)

arn:aws:lambda:eu-west-2:615299751070:layer:AWSOpenTelemetryDistroJava:5

유럽(밀라노)

arn:aws:lambda:eu-south-1:257394471194:layer:AWSOpenTelemetryDistroJava:5

유럽(파리)

arn:aws:lambda:eu-west-3:615299751070:layer:AWSOpenTelemetryDistroJava:5

유럽(스페인)

arn:aws:lambda:eu-south-2:490004653786:layer:AWSOpenTelemetryDistroJava:5

유럽(스톡홀름)

arn:aws:lambda:eu-north-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

유럽(취리히)

arn:aws:lambda:eu-central-2:156041407956:layer:AWSOpenTelemetryDistroJava:5

이스라엘(텔아비브)

arn:aws:lambda:il-central-1:746669239226:layer:AWSOpenTelemetryDistroJava:5

중동(바레인)

arn:aws:lambda:me-south-1:980921751758:layer:AWSOpenTelemetryDistroJava:5

중동(UAE)

arn:aws:lambda:me-central-1:739275441131:layer:AWSOpenTelemetryDistroJava:5

남아메리카(상파울루)

arn:aws:lambda:sa-east-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

Amazon ECR 컨테이너를 사용하여 Lambda 함수 배포

컨테이너 이미지로 배포된 Lambda 함수에서는 기존 방식으로 Lambda 계층을 지원하지 않습니다. 컨테이너 이미지를 사용하는 경우 다른 Lambda 배포 방법처럼 계층을 연결할 수 없습니다. 그 대신 빌드 프로세스 중에 계층의 콘텐츠를 컨테이너 이미지에 수동으로 통합해야 합니다.

Java

OpenTelemetry용 AWS Lambda 계층을 컨테이너화된 Java Lambda 함수에 통합하고, layer.zip 아티팩트를 다운로드하고 Java Lambda 함수 컨테이너에 통합하여 Application Signals 모니터링을 활성화하는 방법을 알아볼 수 있습니다.

사전 조건 

  • 자격 증명으로 구성된 AWS CLI

  • Docker 설치됨

  • 이러한 지침에서는 사용자가 x86_64 플랫폼에 있다고 가정합니다.

  1. 프로젝트 구조 설정

    Lambda 함수에 대한 디렉터리 생성

    mkdir java-appsignals-container-lambda && \ cd java-appsignals-container-lambda

    Maven 프로젝트 구조 생성

    mkdir -p src/main/java/com/example/java/lambda mkdir -p src/main/resources
  2. Dockerfile 생성

    Application Signals가 지원되는 OpenTelemetry 계층을 다운로드하여 Lambda 컨테이너 이미지에 바로 통합합니다. 이를 위해 Dockerfile 파일이 생성됩니다.

    FROM public.ecr.aws/lambda/java:21 # Install utilities RUN dnf install -y unzip wget maven # Download the OpenTelemetry Layer with AppSignals Support RUN wget https://github.com/aws-observability/aws-otel-java-instrumentation/releases/latest/download/layer.zip -O /tmp/layer.zip # Extract and include Lambda layer contents RUN mkdir -p /opt && \ unzip /tmp/layer.zip -d /opt/ && \ chmod -R 755 /opt/ && \ rm /tmp/layer.zip # Copy and build function code COPY pom.xml ${LAMBDA_TASK_ROOT} COPY src ${LAMBDA_TASK_ROOT}/src RUN mvn clean package -DskipTests # Copy the JAR file to the Lambda runtime directory (from inside the container) RUN mkdir -p ${LAMBDA_TASK_ROOT}/lib/ RUN cp ${LAMBDA_TASK_ROOT}/target/function.jar ${LAMBDA_TASK_ROOT}/lib/ # Set the handler CMD ["com.example.java.lambda.App::handleRequest"]
    참고

    layer.zip 파일에는 AWS Application Signals 지원에서 Lambda 함수를 모니터링하는 데 필요한 OpenTelemetry 계측이 포함되어 있습니다.

    계층 추출 단계에서 다음이 확보됩니다.

    • layer.zip 콘텐츠가 /opt/ directory에 제대로 추출됩니다.

    • otel-instrument 스크립트가 적절한 실행 권한을 받습니다.

    • 이미지 크기가 더 작게 유지되도록 임시 layer.zip 파일이 제거됩니다.

  3. Lambda 함수 코드 - src/main/java/com/example/lambda/App.java:에서 Lambda 핸들러에 대한 Java 파일 생성

    프로젝트가 다음과 같아야 합니다.

    . ├── Dockerfile ├── pom.xml └── src └── main ├── java │ └── com │ └── example │ └── java │ └── lambda │ └── App.java └── resources
  4. 컨테이너 이미지 빌드 및 배포

    환경 변수 설정

    AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) AWS_REGION=$(aws configure get region) # For fish shell users: # set AWS_ACCOUNT_ID (aws sts get-caller-identity --query Account --output text) # set AWS_REGION (aws configure get region)

    ECR로 인증

    먼저 퍼블릭 ECR 사용(기본 이미지의 경우):

    aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws

    그런 다음에 프라이빗 ECR 사용:

    aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com

    이미지 빌드, 태그 지정 및 푸시

    # Build the Docker image docker build -t lambda-appsignals-demo . # Tag the image docker tag lambda-appsignals-demo:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/lambda-appsignals-demo:latest # Push the image docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/lambda-appsignals-demo:latest
  5. Lambda 함수 생성 및 구성

    Lambda 콘솔을 사용하여 새 함수를 생성합니다.

    배포 옵션으로 컨테이너 이미지를 선택합니다.

    이미지 찾아보기기 선택하여 Amazon ECR 이미지를 선택합니다.

  6. 테스트 및 확인 - 간단한 이벤트로 Lambda를 테스트합니다. 계층 통합에 성공하면 Application Signals 서비스 맵 아래에 Lambda가 나타납니다.

    CloudWatch 콘솔에 Lambda 함수에 대한 트레이스 및 지표가 표시됩니다.

문제 해결

Application Signals가 작동하지 않는 경우 다음을 확인합니다.

  • OpenTelemetry 계측과 관련된 오류가 있는지 함수 로그를 확인합니다.

  • 환경 변수 AWS_LAMBDA_EXEC_WRAPPER가 올바르게 설정되었는지 확인

  • Docker 파일의 계층 추출이 성공적으로 완료되었는지 확인

  • IAM 권한이 제대로 연결되었는지 확인

  • 필요한 경우 Lambda 함수의 일반 구성에서 타임아웃 및 메모리 설정을 늘립니다.

.Net

Application Signals가 지원되는 OpenTelemetry 계층을 컨테이너화된 .Net Lambda 함수에 통합하고, layer.zip 아티팩트를 다운로드하고 .Net Lambda 함수 컨테이너에 통합하여 Application Signals 모니터링을 활성화하는 방법을 알아볼 수 있습니다.

사전 조건 

  • 자격 증명으로 구성된 AWS CLI

  • Docker 설치됨

  • .Net 8 SDK

  • 이러한 지침에서는 사용자가 x86_64 플랫폼에 있다고 가정합니다.

  1. 프로젝트 구조 설정

    Lambda 함수 컨테이너 이미지용 디렉터리 생성

    mkdir dotnet-appsignals-container-lambda && \ cd dotnet-appsignals-container-lambda
  2. Dockerfile 생성

    Application Signals가 지원되는 OpenTelemetry 계층을 다운로드하여 Lambda 컨테이너 이미지에 바로 통합합니다. 이를 위해 Dockerfile 파일이 생성됩니다.

    FROM public.ecr.aws/lambda/dotnet:8 # Install utilities RUN dnf install -y unzip wget dotnet-sdk-8.0 which # Add dotnet command to docker container's PATH ENV PATH="/usr/lib64/dotnet:${PATH}" # Download the OpenTelemetry Layer with AppSignals Support RUN wget https://github.com/aws-observability/aws-otel-dotnet-instrumentation/releases/latest/download/layer.zip -O /tmp/layer.zip # Extract and include Lambda layer contents RUN mkdir -p /opt && \ unzip /tmp/layer.zip -d /opt/ && \ chmod -R 755 /opt/ && \ rm /tmp/layer.zip WORKDIR ${LAMBDA_TASK_ROOT} # Copy the project files COPY dotnet-lambda-function/src/dotnet-lambda-function/*.csproj ${LAMBDA_TASK_ROOT}/ COPY dotnet-lambda-function/src/dotnet-lambda-function/Function.cs ${LAMBDA_TASK_ROOT}/ COPY dotnet-lambda-function/src/dotnet-lambda-function/aws-lambda-tools-defaults.json ${LAMBDA_TASK_ROOT}/ # Install dependencies and build the application RUN dotnet restore # Use specific runtime identifier and disable ReadyToRun optimization RUN dotnet publish -c Release -o out --self-contained false /p:PublishReadyToRun=false # Copy the published files to the Lambda runtime directory RUN cp -r out/* ${LAMBDA_TASK_ROOT}/ CMD ["dotnet-lambda-function::dotnet_lambda_function.Function::FunctionHandler"]
    참고

    layer.zip 파일에는 AWS Application Signals 지원에서 Lambda 함수를 모니터링하는 데 필요한 OpenTelemetry 계측이 포함되어 있습니다.

    계층 추출 단계에서 다음이 확보됩니다.

    • layer.zip 콘텐츠가 /opt/ directory에 제대로 추출됩니다.

    • otel-instrument 스크립트가 적절한 실행 권한을 받습니다.

    • 이미지 크기가 더 작게 유지되도록 임시 layer.zip 파일이 제거됩니다.

  3. Lambda 함수 코드 - Lambda .NET 템플릿을 사용하여 AWS Lambda 프로젝트를 초기화합니다.

    # Install the Lambda templates if you haven't already dotnet new -i Amazon.Lambda.Templates # Create a new Lambda project dotnet new lambda.EmptyFunction -n dotnet-lambda-function

    프로젝트가 다음과 같아야 합니다.

    . ├── Dockerfile └── dotnet-lambda-function ├── src │ └── dotnet-lambda-function │ ├── Function.cs │ ├── Readme.md │ ├── aws-lambda-tools-defaults.json │ └── dotnet-lambda-function.csproj └── test └── dotnet-lambda-function.Tests ├── FunctionTest.cs └── dotnet-lambda-function.Tests.csproj
  4. 컨테이너 이미지 빌드 및 배포

    환경 변수 설정

    AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) AWS_REGION=$(aws configure get region) # For fish shell users: # set AWS_ACCOUNT_ID (aws sts get-caller-identity --query Account --output text) # set AWS_REGION (aws configure get region)

    Function.cs 코드를 다음과 같이 업데이트합니다.

    dotnet-lambda-function.csproj 코드를 다음과 같이 업데이트합니다.

    <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0>/TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles> <AWSProjectType>Lambda</AWSProjectType> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <PublishReadyToRun>true</PublishReadyToRun> </PropertyGroup> <ItemGroup> <PackageReference Include="Amazon.Lambda.Core" Version="2.5.0" /> <PackageReference Include="Amazon.Lambda.Serialization.SystemTextJson" Version="2.4.4" /> <PackageReference Include="AWSSDK.S3" Version="3.7.305.23" /> </ItemGroup> </Project>
  5. 컨테이너 이미지 빌드 및 배포

    환경 변수 설정

    AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) AWS_REGION=$(aws configure get region) # For fish shell users: # set AWS_ACCOUNT_ID (aws sts get-caller-identity --query Account --output text) # set AWS_REGION (aws configure get region)

    퍼블릭 Amazon ECR로 인증

    aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws

    프라이빗 Amazon ECR로 인증

    aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com

    Amazon ECR 리포지토리 생성(필요한 경우)

    aws ecr create-repository \ --repository-name lambda-appsignals-demo \ --region $AWS_REGION

    이미지 빌드, 태그 지정 및 푸시

    # Build the Docker image docker build -t lambda-appsignals-demo . # Tag the image docker tag lambda-appsignals-demo:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/lambda-appsignals-demo:latest # Push the image docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/lambda-appsignals-demo:latest 5. Create and Configure the Lambda Function
  6. Lambda 함수 생성 및 구성

    Lambda 콘솔을 사용하여 새 함수를 생성합니다.

    배포 옵션으로 컨테이너 이미지를 선택합니다.

    이미지 찾아보기기 선택하여 Amazon ECR 이미지를 선택합니다.

  7. 테스트 및 확인 - 간단한 이벤트로 Lambda를 테스트합니다. 계층 통합에 성공하면 Application Signals 서비스 맵 아래에 Lambda가 나타납니다.

    CloudWatch 콘솔에 Lambda 함수에 대한 트레이스 및 지표가 표시됩니다.

문제 해결

Application Signals가 작동하지 않는 경우 다음을 확인합니다.

  • OpenTelemetry 계측과 관련된 오류가 있는지 함수 로그를 확인합니다.

  • 환경 변수 AWS_LAMBDA_EXEC_WRAPPER가 올바르게 설정되었는지 확인

  • Docker 파일의 계층 추출이 성공적으로 완료되었는지 확인

  • IAM 권한이 제대로 연결되었는지 확인

  • 필요한 경우 Lambda 함수의 일반 구성에서 타임아웃 및 메모리 설정을 늘립니다.

Node.js

Application Signals가 지원되는 OpenTelemetry 계층을 컨테이너화된 Node.js Lambda 함수에 통합하고, layer.zip 아티팩트를 다운로드하고 Node.js Lambda 함수 컨테이너에 통합하여 Application Signals 모니터링을 활성화하는 방법을 알아볼 수 있습니다.

사전 조건 

  • 자격 증명으로 구성된 AWS CLI

  • Docker 설치됨

  • 이러한 지침에서는 사용자가 x86_64 플랫폼에 있다고 가정합니다.

  1. 프로젝트 구조 설정

    Lambda 함수 컨테이너 이미지용 디렉터리 생성

    mkdir nodejs-appsignals-container-lambda &&\ cd nodejs-appsignals-container-lambda
  2. Dockerfile 생성

    Application Signals가 지원되는 OpenTelemetry 계층을 다운로드하여 Lambda 컨테이너 이미지에 바로 통합합니다. 이를 위해 Dockerfile 파일이 생성됩니다.

    # Dockerfile FROM public.ecr.aws/lambda/nodejs:22 # Install utilities RUN dnf install -y unzip wget # Download the OpenTelemetry Layer with AppSignals Support RUN wget https://github.com/aws-observability/aws-otel-js-instrumentation/releases/latest/download/layer.zip -O /tmp/layer.zip # Extract and include Lambda layer contents RUN mkdir -p /opt && \ unzip /tmp/layer.zip -d /opt/ && \ chmod -R 755 /opt/ && \ rm /tmp/layer.zip # Install npm dependencies RUN npm init -y RUN npm install # Copy function code COPY *.js ${LAMBDA_TASK_ROOT}/ # Set the CMD to your handler CMD [ "index.handler" ]
    참고

    layer.zip 파일에는 AWS Application Signals 지원에서 Lambda 함수를 모니터링하는 데 필요한 OpenTelemetry 계측이 포함되어 있습니다.

    계층 추출 단계에서 다음이 확보됩니다.

    • layer.zip 콘텐츠가 /opt/ directory에 제대로 추출됩니다.

    • otel-instrument 스크립트가 적절한 실행 권한을 받습니다.

    • 이미지 크기가 더 작게 유지되도록 임시 layer.zip 파일이 제거됩니다.

  3. Lambda 함수 코드

    다음과 같은 콘텐츠로 index.js 파일을 생성합니다.

    const { S3Client, ListBucketsCommand } = require('@aws-sdk/client-s3'); // Initialize S3 client const s3Client = new S3Client({ region: process.env.AWS_REGION }); exports.handler = async function(event, context) { console.log('Received event:', JSON.stringify(event, null, 2)); console.log('Handler initializing:', exports.handler.name); const response = { statusCode: 200, body: {} }; try { // List S3 buckets const command = new ListBucketsCommand({}); const data = await s3Client.send(command); // Extract bucket names const bucketNames = data.Buckets.map(bucket => bucket.Name); response.body = { message: 'Successfully retrieved buckets', buckets: bucketNames }; } catch (error) { console.error('Error listing buckets:', error); response.statusCode = 500; response.body = { message: `Error listing buckets: ${error.message}` }; } return response; };

    프로젝트 구조가 다음과 같아야 합니다.

    . ├── Dockerfile └── index.js
  4. 컨테이너 이미지 빌드 및 배포

    환경 변수 설정

    AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) AWS_REGION=$(aws configure get region) # For fish shell users: # set AWS_ACCOUNT_ID (aws sts get-caller-identity --query Account --output text) # set AWS_REGION (aws configure get region)

    퍼블릭 Amazon ECR로 인증

    aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws

    프라이빗 Amazon ECR로 인증

    aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com

    Amazon ECR 리포지토리 생성(필요한 경우)

    aws ecr create-repository \ --repository-name lambda-appsignals-demo \ --region $AWS_REGION

    이미지 빌드, 태그 지정 및 푸시

    # Build the Docker image docker build -t lambda-appsignals-demo . # Tag the image docker tag lambda-appsignals-demo:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/lambda-appsignals-demo:latest # Push the image docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/lambda-appsignals-demo:latest 5. Create and Configure the Lambda Function
  5. Lambda 함수 생성 및 구성

    Lambda 콘솔을 사용하여 새 함수를 생성합니다.

    배포 옵션으로 컨테이너 이미지를 선택합니다.

    이미지 찾아보기기 선택하여 Amazon ECR 이미지를 선택합니다.

  6. 테스트 및 확인 - 간단한 이벤트로 Lambda를 테스트합니다. 계층 통합에 성공하면 Application Signals 서비스 맵 아래에 Lambda가 나타납니다.

    CloudWatch 콘솔에 Lambda 함수에 대한 트레이스 및 지표가 표시됩니다.

문제 해결

Application Signals가 작동하지 않는 경우 다음을 확인합니다.

  • OpenTelemetry 계측과 관련된 오류가 있는지 함수 로그를 확인합니다.

  • 환경 변수 AWS_LAMBDA_EXEC_WRAPPER가 올바르게 설정되었는지 확인

  • Docker 파일의 계층 추출이 성공적으로 완료되었는지 확인

  • IAM 권한이 제대로 연결되었는지 확인

  • 필요한 경우 Lambda 함수의 일반 구성에서 타임아웃 및 메모리 설정을 늘립니다.

Python

Application Signals가 지원되는 OpenTelemetry 계층을 컨테이너화된 Python Lambda 함수에 통합하고, layer.zip 아티팩트를 다운로드하고 .Python Lambda 함수 컨테이너에 통합하여 Application Signals 모니터링을 활성화하는 방법을 알아볼 수 있습니다.

사전 조건 

  • 자격 증명으로 구성된 AWS CLI

  • Docker 설치됨

  • 이러한 지침에서는 사용자가 x86_64 플랫폼에 있다고 가정합니다.

  1. 프로젝트 구조 설정

    Lambda 함수 컨테이너 이미지용 디렉터리 생성

    mkdir python-appsignals-container-lambda &&\ cd python-appsignals-container-lambda
  2. Dockerfile 생성

    Application Signals가 지원되는 OpenTelemetry 계층을 다운로드하여 Lambda 컨테이너 이미지에 바로 통합합니다. 이를 위해 Dockerfile 파일이 생성됩니다.

    참고

    layer.zip 파일에는 AWS Application Signals 지원에서 Lambda 함수를 모니터링하는 데 필요한 OpenTelemetry 계측이 포함되어 있습니다.

    계층 추출 단계에서 다음이 확보됩니다.

    • layer.zip 콘텐츠가 /opt/ directory에 제대로 추출됩니다.

    • otel-instrument 스크립트가 적절한 실행 권한을 받습니다.

    • 이미지 크기가 더 작게 유지되도록 임시 layer.zip 파일이 제거됩니다.

  3. Lambda 함수 코드

    app.py 파일에 Lambda 함수를 생성합니다.

    import json import boto3 def lambda_handler(event, context): """ Sample Lambda function that can be used in a container image. Parameters: ----------- event: dict Input event data context: LambdaContext Lambda runtime information Returns: __ dict Response object """ print("Received event:", json.dumps(event, indent=2)) # Create S3 client s3 = boto3.client('s3') try: # List buckets response = s3.list_buckets() # Extract bucket names buckets = [bucket['Name'] for bucket in response['Buckets']] return { 'statusCode': 200, 'body': json.dumps({ 'message': 'Successfully retrieved buckets', 'buckets': buckets }) } except Exception as e: print(f"Error listing buckets: {str(e)}") return { 'statusCode': 500, 'body': json.dumps({ 'message': f'Error listing buckets: {str(e)}' }) }

    프로젝트 구조가 다음과 같아야 합니다.

    . ├── Dockerfile ├── app.py └── instructions.md
  4. 컨테이너 이미지 빌드 및 배포

    환경 변수 설정

    AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) AWS_REGION=$(aws configure get region) # For fish shell users: # set AWS_ACCOUNT_ID (aws sts get-caller-identity --query Account --output text) # set AWS_REGION (aws configure get region)

    퍼블릭 Amazon ECR로 인증

    aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws

    프라이빗 Amazon ECR로 인증

    aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com

    Amazon ECR 리포지토리 생성(필요한 경우)

    aws ecr create-repository \ --repository-name lambda-appsignals-demo \ --region $AWS_REGION

    이미지 빌드, 태그 지정 및 푸시

    # Build the Docker image docker build -t lambda-appsignals-demo . # Tag the image docker tag lambda-appsignals-demo:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/lambda-appsignals-demo:latest # Push the image docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/lambda-appsignals-demo:latest 5. Create and Configure the Lambda Function
  5. Lambda 함수 생성 및 구성

    Lambda 콘솔을 사용하여 새 함수를 생성합니다.

    배포 옵션으로 컨테이너 이미지를 선택합니다.

    이미지 찾아보기기 선택하여 Amazon ECR 이미지를 선택합니다.

  6. 테스트 및 확인 - 간단한 이벤트로 Lambda를 테스트합니다. 계층 통합에 성공하면 Application Signals 서비스 맵 아래에 Lambda가 나타납니다.

    CloudWatch 콘솔에 Lambda 함수에 대한 트레이스 및 지표가 표시됩니다.

문제 해결

Application Signals가 작동하지 않는 경우 다음을 확인합니다.

  • OpenTelemetry 계측과 관련된 오류가 있는지 함수 로그를 확인합니다.

  • 환경 변수 AWS_LAMBDA_EXEC_WRAPPER가 올바르게 설정되었는지 확인

  • Docker 파일의 계층 추출이 성공적으로 완료되었는지 확인

  • IAM 권한이 제대로 연결되었는지 확인

  • 필요한 경우 Lambda 함수의 일반 구성에서 타임아웃 및 메모리 설정을 늘립니다.