Lambda 함수에 AWS 서비스 접근 권한 부여하기

Lambda 함수에 AWS 서비스 접근 권한 부여하기 (Granting Lambda function access to AWS services)

AWS 서비스로 함수를 호출할 때 리소스 기반 정책(resource-based policy)의 문(statement)에서 권한을 부여해요. 함수 전체에 문을 적용하거나, 단일 버전이나 별칭으로 제한할 수 있어요.

참고 Lambda 콘솔로 함수에 트리거를 추가하면 콘솔이 함수의 리소스 기반 정책을 업데이트해 서비스가 함수를 호출하도록 허용해요. Lambda 콘솔에서 사용할 수 없는 다른 계정이나 서비스에 권한을 부여하려면 AWS CLI를 사용할 수 있어요.

전체 JSON 정책을 정의하려면 put-resource-policy 사용을 권장해요. put-resource-policy로 deny 문을 추가하고, 전체 범위의 IAM 조건 키를 사용하고, 모든 권한을 단일 문서로 관리할 수 있어요. 단순한 사용 사례의 개별 문은 add-permission으로 추가할 수도 있어요.

중요 put-resource-policy를 사용하면 리소스의 기존 리소스 기반 정책을 대체해요. 리소스에 이미 add-permission으로 정의된 권한이 있다면 put-resource-policy가 이를 덮어써요. 변경하기 전에 get-resource-policy로 기존 정책을 검색하세요.

전체 JSON 정책 사용하기 (권장)

다음 예시 정책은 Amazon Simple Notification Service에 my-function이라는 함수를 호출할 권한을 부여하지만 특정 토픽에 대해서만 허용해요. 또한 특정 토픽에서의 호출을 거부해요.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "allow-sns-my-topic",
      "Effect": "Allow",
      "Principal": {
        "Service": "sns.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:sns:us-east-2:123456789012:my-topic"
        }
      }
    },
    {
      "Sid": "deny-sns-other-topic",
      "Effect": "Deny",
      "Principal": {
        "Service": "sns.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": [
        "arn:aws:lambda:us-east-2:123456789012:function:my-function",
        "arn:aws:lambda:us-east-2:123456789012:function:my-function:*"
      ],
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:sns:us-east-2:123456789012:restricted-topic"
        }
      }
    }
  ]
}

정책을 policy.json이라는 파일로 저장하고 put-resource-policy로 적용해요.

aws lambda put-resource-policy \
  --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function \
  --policy file://policy.json

Amazon S3의 경우 소스는 ARN에 계정 ID가 포함되지 않는 버킷이에요. 버킷을 삭제하면 다른 계정이 같은 이름의 버킷을 만들 수 있어요. aws:SourceAccount 조건 키로 여러분 계정의 리소스만 함수를 호출할 수 있도록 해요.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "allow-s3",
      "Effect": "Allow",
      "Principal": {
        "Service": "s3.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "123456789012"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:s3:::my-bucket"
        }
      }
    }
  ]
}

add-permission 사용하기

단순한 사용 사례에서는 add-permission으로 개별 문을 추가할 수 있어요. 다음 명령은 Amazon Simple Notification Service에 my-function이라는 함수를 호출할 권한을 부여해요.

aws lambda add-permission \
  --function-name my-function \
  --action lambda:InvokeFunction \
  --statement-id sns \
  --principal sns.amazonaws.com \
  --output text

다음 출력이 보여야 해요.

{"Sid":"sns","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}

참고 put-resource-policy 후에 add-permission을 호출하면 새 문이 기존 JSON 정책에 추가돼요.

호출을 특정 리소스로 제한하려면 source-arn 옵션을 사용해요.

aws lambda add-permission \
  --function-name my-function \
  --action lambda:InvokeFunction \
  --statement-id sns-my-topic \
  --principal sns.amazonaws.com \
  --source-arn arn:aws:sns:us-east-2:123456789012:my-topic

Amazon S3의 경우 계정 ID와 함께 source-account 옵션을 사용해요.

aws lambda add-permission \
  --function-name my-function \
  --action lambda:InvokeFunction \
  --statement-id s3-account \
  --principal s3.amazonaws.com \
  --source-arn arn:aws:s3:::amzn-s3-demo-bucket \
  --source-account 123456789012

출처: AWS Lambda 개발자 안내서

더 알아보기 (Learn more)