리소스 기반 정책 가이드

리소스 기반 정책 개요

Cloud Functions의 리소스 기반 정책(Resource-based Policy)은 리소스에 부여되는 정책으로써 특정 자원에 대한 행동(Action)을 주체(Principal)에 한하여 허용하거나 거부(Effect)하도록 결정할 수 있습니다.
리소스 기반 정책을 활용하여 함수를 실행(Invoke)할 수 있는 주체를 직접 정의할 수 있습니다.

참고
일반적인 IAM 정책(Identity-based)이 사용자에게 권한을 주는 것이라면, 리소스 기반 정책은 함수 자체에 적용하여 외부의 접근을 허용하는 방식입니다.

리소스 기반 정책을 통해 다음을 정의하여 함수 호출을 허용할 수 있습니다.

  • 지정된 Samsung Cloud Platform 계정의 사용자
  • 지정된 소스 IP 주소 범위 또는 CIDR 블록

소스 정책은 지정된 보안 주체(보통 IAM 역할 또는 그룹)가 API를 호출할 수 있는지 여부를 제어하기 위해 API에 연결되는 JSON 정책 문서 형태로 정의됩니다.

구분설명예시
대상(Principal)함수를 호출할 주체 지정특정 오브젝트 스토리지 버킷, API Gateway, 다른 Samsung Cloud Platform 계정 등
작업(Action)허용할 기능을 정의대부분 scf:InvokeFunction
조건(Condition)특정 상황에서만 허용하도록 제한“특정 SRN을 가진 버킷에서 온 요청만 허용”
표. API 호출 여부를 제어하는 Entity
참고
  • Cloud Functions의 리소스 기반 정책은 IAM의 리소스 기반 정책의 규칙을 활용합니다.
  • JSON을 활용하여 정책을 생성하거나 수정하는 방법은 JSON 모드 활용 가이드를 참고하세요.

리소스 기반 정책 사용 시나리오

리소스 기반 정책의 주요 사용 시나리오는 다음과 같습니다.

리소스 기반 정책 시나리오

Cloud Functions의 기능이 동작할 때 활용되는 리소스 기반 정책 시나리오는 다음과 같습니다.

구분설명참고 예시
함수 URL - 인증타입 None함수의 URL을 생성하여 호출할 때 필요합니다.
  • 리소스 기반 정책이 없으면 인가에 실패하여 Public URL을 이용한 함수 호출이 불가능합니다.
함수 URL(인증타입 None) 예시
함수 URL - 인증타입 IAM
  • 리소스 기반 정책으로 등록되어 있거나 자격 증명 권한이 필요합니다.
  • 동일 Account의 자원인 경우: 리소스 기반 정책 또는 자격 증명 권한(InvokeFunctionUrl)이 있으면 호출할 수 있습니다.
  • 타 Account의 자원인 경우: 리소스 기반 정책과 자격 증명 권한(InvokeFunction)이 모두 있어야 호출할 수 있습니다.
함수 URL(인증 타입 IAM) 예시
API Gateway 트리거외부 API 요청을 처리하기 위해 API Gateway가 Lambda를 호출할 때 필요합니다.
  • 리소스 기반 정책 등록이 필요합니다.
  • 리소스 기반 정책이 없으면 인가에 실패하여 API Gateway를 이용한 함수 호출이 불가능합니다.
API Gateway 트리거 예시
PrivateLink 연결PrivateLink Service를 연결해 함수를 다른 VPC에서 프라이빗하게 접근하도록 정의할 수 있습니다.
  • 리소스 기반 정책으로 등록되어 있거나 자격 증명 권한이 필요합니다.
  • 동일 Account의 자원인 경우: 리소스 기반 정책 혹은 자격 증명 권한(InvokeFunction)이 있으면 호출할 수 있습니다.
  • 타 Account의 자원인 경우: 리소스 기반 정책과 자격 증명 권한(InvokeFunction)이 모두 있어야 호출할 수 있습니다.
PrivateLink 연결 예시
표. 리소스 기반 정책 시나리오

사용자 추가 활용 시나리오

Cloud Functions의 리소스 기반 정책으로 자동으로 등록되진 않지만 필요에 따라 사용자가 추가하여 활용할 수 있습니다.
사용자가 추가하여 활용할 수 있는 시나리오는 다음과 같습니다.

  • 교차 계정 접근
    • A 계정의 IAM 사용자가 B 계정의 Lambda를 실행하고 싶은 경우, B 계정 함수 정책에 A 계정을 등록합니다.
  • 하이브리드 접근 제어
    • 단순히 계정이나 IP만 제한하는 것이 아니라, 특정 사용자와 특정 IP 대역 두 조건이 동시에 만족해야 접근할 수 있도록 구성할 수 있습니다.

Cloud Functions의 리소스 기반 정책 관리

Cloud Functions의 리소스 기반 정책을 확인하고 설정하려면 다음 절차를 따르세요.

  1. 모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
  2. Service Home 페이지에서 Function 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
  3. Function 목록 페이지에서 정책을 설정할 자원을 클릭하세요. Function 상세 페이지로 이동합니다.
  4. Function 상세 페이지의 구성 탭을 클릭하세요.
  5. 리소스 기반 정책 권한 항목의 수정 버튼을 클릭하세요. 리소스 정책 수정 팝업창이 열립니다.
  6. 리소스 정책 수정 팝업창에서 정책 템플릿을 선택한 후, 정책을 작성하세요.
  7. 작성이 완료되면 확인 버튼을 클릭하세요.
    • 삭제 버튼을 클릭하면 등록된 정책이 삭제됩니다.

리소스 기반 정책 예시

사용자는 필요에 따라 리소스 기반 정책을 추가로 정의하거나 기존 정책을 수정하여 활용할 수 있습니다.

참고
  • 일부 기능들의 경우에는 Cloud Functions에서 사용하려면 리소스 기반 정책(또는 자격 증명)이 등록되어 있어야 합니다.
  • 이 가이드에서 설명하고 있는 리소스 기반 정책 예시의 경우, 각 기능들이 활성화되거나 연결될 때 예시의 리소스 기반 정책을 Cloud Functions가 자동으로 등록하고 있습니다.

함수 URL - 인증타입 None

Principal/*인 Public 호출을 허용하는 정책입니다.

정책 템플릿

배경색 변경
{
    "Statement": [
        {
        	"Action": ["scf:InvokeFunctionUrl"],
        	"Condition": {
            	"StringEquals": {
                	"scf:CloudFunctionAuthType": ["NONE"]
            	}
        	},
        	"Effect": "Allow",
        	"Principal": "*", 
            "Resource": ["{{CloudFunctionSrn}}"],   
            "Sid": "InvokeFunctionURLAllowPublicAccess"
        }
    ],
    "Version": "2024-07-01"
}
{
    "Statement": [
        {
        	"Action": ["scf:InvokeFunctionUrl"],
        	"Condition": {
            	"StringEquals": {
                	"scf:CloudFunctionAuthType": ["NONE"]
            	}
        	},
        	"Effect": "Allow",
        	"Principal": "*", 
            "Resource": ["{{CloudFunctionSrn}}"],   
            "Sid": "InvokeFunctionURLAllowPublicAccess"
        }
    ],
    "Version": "2024-07-01"
}
함수 URL - 인증타입 None 정책 템플릿 예시

정책 예시

배경색 변경
{
    "Statement": [
        {
            "Action": ["scf:InvokeFunctionUrl"],
            "Condition": {
                "StringEquals": {
                    "scf:CloudFunctionAuthType": ["NONE"]
                }
            },
            "Effect": "Allow",
            "Principal": "*",
            "Resource": ["srn:e::accountID:kr-west1::scf:cloud-function/functionsID"],
            "Sid": "InvokeFunctionURLAllowPublicAccess"
        }
    ],
    "Version": "2024-07-01"
}
{
    "Statement": [
        {
            "Action": ["scf:InvokeFunctionUrl"],
            "Condition": {
                "StringEquals": {
                    "scf:CloudFunctionAuthType": ["NONE"]
                }
            },
            "Effect": "Allow",
            "Principal": "*",
            "Resource": ["srn:e::accountID:kr-west1::scf:cloud-function/functionsID"],
            "Sid": "InvokeFunctionURLAllowPublicAccess"
        }
    ],
    "Version": "2024-07-01"
}
함수 URL - 인증타입 None 정책 예시

함수 URL - 인증타입 IAM

특정 사용자에게 Public URL 호출을 허용하는 정책입니다.

정책 템플릿

배경색 변경
{
    "Statement": [
        {
            "Action": ["scf:InvokeFunctionUrl"],
            "Condition": {
                "StringEquals": {
                    "scf:CloudFunctionAuthType": ["SCP_IAM"]
                }
            },
            "Effect": "Allow",
            "Principal": {
                "scp": ["srn:{{Environment}}::{{AccountID}}:::iam:user/{{UserId}}"]
            }, 
            "Resource": ["{{CloudFunctionSrn}}"],  
            "Sid": "Statement1"
        }
    ],
    "Version": "2024-07-01"
}
{
    "Statement": [
        {
            "Action": ["scf:InvokeFunctionUrl"],
            "Condition": {
                "StringEquals": {
                    "scf:CloudFunctionAuthType": ["SCP_IAM"]
                }
            },
            "Effect": "Allow",
            "Principal": {
                "scp": ["srn:{{Environment}}::{{AccountID}}:::iam:user/{{UserId}}"]
            }, 
            "Resource": ["{{CloudFunctionSrn}}"],  
            "Sid": "Statement1"
        }
    ],
    "Version": "2024-07-01"
}
함수 URL - 인증타입 IAM 정책 템플릿 예시

정책 예시

배경색 변경
{
    "Statement": [
        {
            "Action": ["scf:InvokeFunctionUrl"],
            "Condition": {
                "StringEquals": {
                    "scf:CloudFunctionAuthType": ["SCP_IAM"]
                }
            },
            "Effect": "Allow",
            "Principal": "*",
            "Resource":  ["srn:e::accountID:kr-west1::scf:cloud-function/functionsID"],
            "Sid": "accountID-iam-invokefunctionurl"
        }
    ],
    "Version": "2024-07-01"
}
{
    "Statement": [
        {
            "Action": ["scf:InvokeFunctionUrl"],
            "Condition": {
                "StringEquals": {
                    "scf:CloudFunctionAuthType": ["SCP_IAM"]
                }
            },
            "Effect": "Allow",
            "Principal": "*",
            "Resource":  ["srn:e::accountID:kr-west1::scf:cloud-function/functionsID"],
            "Sid": "accountID-iam-invokefunctionurl"
        }
    ],
    "Version": "2024-07-01"
}
함수 URL - 인증타입 IAM 정책 예시

API Gateway 트리거

Principal*인 Public 호출을 허용하는 정책입니다.

정책 템플릿

배경색 변경
{
    "Statement": [
        {
            "Action": ["scf:InvokeFunction"],
            "Condition": {
                "SrnLike": {
                    "scp:RequestAttribute/body['x-scf-request-obj-srn']": ["{{ApiGatewayMethodSrn}}"]
                }
            },
            "Effect": "Allow",
            "Principal": {
                "Service": ["apigateway.samsungsdscloud.com"]
            }, 
            "Resource": ["{{CloudFunctionSrn}}"],  
            "Sid": "Statement1"
        }
    ],
    "Version": "2024-07-01"
}
{
    "Statement": [
        {
            "Action": ["scf:InvokeFunction"],
            "Condition": {
                "SrnLike": {
                    "scp:RequestAttribute/body['x-scf-request-obj-srn']": ["{{ApiGatewayMethodSrn}}"]
                }
            },
            "Effect": "Allow",
            "Principal": {
                "Service": ["apigateway.samsungsdscloud.com"]
            }, 
            "Resource": ["{{CloudFunctionSrn}}"],  
            "Sid": "Statement1"
        }
    ],
    "Version": "2024-07-01"
}
API Gateway 트리거 정책 템플릿 예시

정책 예시

배경색 변경
{
    "Statement": [
        {
            "Action": [
                "scf:InvokeFunction"
            ],
            "Condition": {
                "SrnLike": {
                    "scp:RequestAttribute/body['x-scf-request-obj-srn']": [
                        "srn:e::accountID:kr-west1::apigateway:method/MethodID/*/GET/test"
                    ]
                }
            },
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "apigateway.samsungsdscloud.com"
                ]
            },
            "Resource": [
                "srn:e::accountID:kr-west1::scf:cloud-function/functionID"
            ],
            "Sid": "999e9a9999de4d4683c9e10c74ee999z"
        }
    ],
    "Version": "2024-07-01"
}
{
    "Statement": [
        {
            "Action": [
                "scf:InvokeFunction"
            ],
            "Condition": {
                "SrnLike": {
                    "scp:RequestAttribute/body['x-scf-request-obj-srn']": [
                        "srn:e::accountID:kr-west1::apigateway:method/MethodID/*/GET/test"
                    ]
                }
            },
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "apigateway.samsungsdscloud.com"
                ]
            },
            "Resource": [
                "srn:e::accountID:kr-west1::scf:cloud-function/functionID"
            ],
            "Sid": "999e9a9999de4d4683c9e10c74ee999z"
        }
    ],
    "Version": "2024-07-01"
}
API Gateway 트리거 정책 예시

특정 사용자에게 Privatelink Endpoint를 통한 함수 호출을 허용하는 정책입니다.

정책 템플릿

배경색 변경
{
    "Statement": [
        {
            "Action": ["scf:InvokeFunction"],
            "Condition": {
                "StringEquals": {
           			"scf:CloudFunctionPrivatelinkServiceAuthType": ["SCP_IAM"] 
                }
            },
            "Effect": "Allow",
            "Principal": {
                "scp": ["srn:{{Environment}}::{{AccountID}}:::iam:user/{{UserId}}"]
            }, 
            "Resource": ["{{CloudFunctionSrn}}"], 
            "Sid": "Statement1"
        }
    ],
    "Version": "2024-07-01"
}
{
    "Statement": [
        {
            "Action": ["scf:InvokeFunction"],
            "Condition": {
                "StringEquals": {
           			"scf:CloudFunctionPrivatelinkServiceAuthType": ["SCP_IAM"] 
                }
            },
            "Effect": "Allow",
            "Principal": {
                "scp": ["srn:{{Environment}}::{{AccountID}}:::iam:user/{{UserId}}"]
            }, 
            "Resource": ["{{CloudFunctionSrn}}"], 
            "Sid": "Statement1"
        }
    ],
    "Version": "2024-07-01"
}
PrivateLink 연결 정책 템플릿 예시

정책 예시

배경색 변경
{
    "Statement": [
        {
            "Action": [
                "scf:InvokeFunction"
            ],
            "Condition": {
                "StringEquals": {
                    "scf:CloudFunctionAuthType": [
                        "SCP_IAM"
                    ]
                }
            },
            "Effect": "Allow",
            "Principal": {
                "scp": [
                    "srn:e::accountID:::iam:user/userID"
                ]
            },
            "Resource": [
                "srn:e::accountID:kr-west1::scf:cloud-function/functionID"
            ],
            "Sid": "rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr-privatelink-invokefunction"
        }
    ],
    "Version": "2024-07-01"
}
{
    "Statement": [
        {
            "Action": [
                "scf:InvokeFunction"
            ],
            "Condition": {
                "StringEquals": {
                    "scf:CloudFunctionAuthType": [
                        "SCP_IAM"
                    ]
                }
            },
            "Effect": "Allow",
            "Principal": {
                "scp": [
                    "srn:e::accountID:::iam:user/userID"
                ]
            },
            "Resource": [
                "srn:e::accountID:kr-west1::scf:cloud-function/functionID"
            ],
            "Sid": "rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr-privatelink-invokefunction"
        }
    ],
    "Version": "2024-07-01"
}
PrivateLink 연결 정책 예시
PrivateLink 서비스 연계하기
Release Note