Azure Functions에 대한 Azure Tables 입력 바인딩

Azure Tables 입력 바인딩을 사용하여 Azure Cosmos DB for Table 또는 Azure Table Storage의 테이블을 읽습니다.

설정 및 구성 세부 정보에 대한 자세한 내용은 개요를 참조하세요.

Important

이 문서에서는 탭을 사용하여 여러 버전의 Node.js 프로그래밍 모델을 지원합니다. v4 모델은 일반적으로 사용 가능하며 JavaScript 및 TypeScript 개발자를 위해 보다 유연하고 직관적인 환경을 제공하도록 설계되었습니다. v4 모델의 작동 방식에 대한 자세한 내용은 Azure Functions Node.js 개발자 가이드를 참조하세요. v3과 v4의 차이점에 대해 자세히 알아보려면 마이그레이션 가이드참조하세요.

예시

바인딩 사용은 확장 패키지 버전과 함수 앱에서 사용되는 C# 형식에 따라 다르며 다음 중 하나일 수 있습니다.

격리된 작업자 프로세스 클래스 라이브러리 컴파일된 C# 함수는 런타임에서 격리된 프로세스에서 실행됩니다.

버전을 선택하면 모드 및 버전에 대한 예를 볼 수 있습니다.

다음 MyTableData 클래스는 테이블의 데이터 행을 나타냅니다.

public class MyTableData : Azure.Data.Tables.ITableEntity
{
    public string Text { get; set; }

    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public DateTimeOffset? Timestamp { get; set; }
    public ETag ETag { get; set; }
}

Queue Storage 트리거에 의해 시작되는 다음 함수는 입력 테이블에서 행을 가져오는 데 사용되는 큐에서 행 키를 읽습니다. 식 {queueTrigger}는 행 키를 메시지 문자열인 메시지 메타데이터에 바인딩합니다.

[Function("TableFunction")]
[TableOutput("OutputTable", Connection = "AzureWebJobsStorage")]
public static MyTableData Run(
    [QueueTrigger("table-items")] string input,
    [TableInput("MyTable", "<PartitionKey>", "{queueTrigger}")] MyTableData tableInput,
    FunctionContext context)
{
    var logger = context.GetLogger("TableFunction");

    logger.LogInformation($"PK={tableInput.PartitionKey}, RK={tableInput.RowKey}, Text={tableInput.Text}");

    return new MyTableData()
    {
        PartitionKey = "queue",
        RowKey = Guid.NewGuid().ToString(),
        Text = $"Output record with rowkey {input} created at {DateTime.Now}"
    };
}

다음 큐 트리거 함수는 파티션 키 값이 큐 메시지로 설정된 처음 5개 항목을 IEnumerable<T>로 반환합니다.

[Function("TestFunction")]
public static void Run([QueueTrigger("myqueue", Connection = "AzureWebJobsStorage")] string partition,
    [TableInput("inTable", "{queueTrigger}", Take = 5, Filter = "Text eq 'test'", 
    Connection = "AzureWebJobsStorage")] IEnumerable<MyTableData> tableInputs,
    FunctionContext context)
{
    var logger = context.GetLogger("TestFunction");
    logger.LogInformation(partition);
    foreach (MyTableData tableInput in tableInputs)
    {
        logger.LogInformation($"PK={tableInput.PartitionKey}, RK={tableInput.RowKey}, Text={tableInput.Text}");
    }
}

FilterTake 속성은 반환되는 항목 수를 제한하는 데 사용됩니다.

다음 예제에서는 Table Storage의 지정된 파티션에 있는 사람 개체 목록을 반환하는 HTTP 트리거 함수를 보여 줍니다. 예제에서 파티션 키는 http 경로에서 추출되고 tableName 및 연결은 함수 설정에서 가져옵니다.

public class Person {
    private String PartitionKey;
    private String RowKey;
    private String Name;

    public String getPartitionKey() { return this.PartitionKey; }
    public void setPartitionKey(String key) { this.PartitionKey = key; }
    public String getRowKey() { return this.RowKey; }
    public void setRowKey(String key) { this.RowKey = key; }
    public String getName() { return this.Name; }
    public void setName(String name) { this.Name = name; }
}

@FunctionName("getPersonsByPartitionKey")
public Person[] get(
        @HttpTrigger(name = "getPersons", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.FUNCTION, route="persons/{partitionKey}") HttpRequestMessage<Optional<String>> request,
        @BindingName("partitionKey") String partitionKey,
        @TableInput(name="persons", partitionKey="{partitionKey}", tableName="%MyTableName%", connection="MyConnectionString") Person[] persons,
        final ExecutionContext context) {

    context.getLogger().info("Got query for person related to persons with partition key: " + partitionKey);

    return persons;
}

TableInput 주석은 다음 예제와 같이 요청의 json 본문에서 바인딩을 추출할 수도 있습니다.

@FunctionName("GetPersonsByKeysFromRequest")
public HttpResponseMessage get(
        @HttpTrigger(name = "getPerson", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.FUNCTION, route="query") HttpRequestMessage<Optional<String>> request,
        @TableInput(name="persons", partitionKey="{partitionKey}", rowKey = "{rowKey}", tableName="%MyTableName%", connection="MyConnectionString") Person person,
        final ExecutionContext context) {

    if (person == null) {
        return request.createResponseBuilder(HttpStatus.NOT_FOUND)
                    .body("Person not found.")
                    .build();
    }

    return request.createResponseBuilder(HttpStatus.OK)
                    .header("Content-Type", "application/json")
                    .body(person)
                    .build();
}

다음 예제에서는 필터를 사용하여 Azure 테이블에서 특정 이름을 가진 사용자를 쿼리하고 가능한 일치 항목 수를 10개의 결과로 제한합니다.

@FunctionName("getPersonsByName")
public Person[] get(
        @HttpTrigger(name = "getPersons", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.FUNCTION, route="filter/{name}") HttpRequestMessage<Optional<String>> request,
        @BindingName("name") String name,
        @TableInput(name="persons", filter="Name eq '{name}'", take = "10", tableName="%MyTableName%", connection="MyConnectionString") Person[] persons,
        final ExecutionContext context) {

    context.getLogger().info("Got query for person related to persons with name: " + name);

    return persons;
}

다음 예에서는 큐 트리거를 사용하여 단일 테이블 행을 읽는 테이블 입력 바인딩을 보여 줍니다. 바인딩은 partitionKeyrowKey를 지정합니다. 값 "{queueTrigger}"는 rowKey 행 키가 큐 메시지 문자열에서 가져온 것임을 나타냅니다.

import { app, input, InvocationContext } from '@azure/functions';

const tableInput = input.table({
    tableName: 'Person',
    partitionKey: 'Test',
    rowKey: '{queueTrigger}',
    connection: 'MyStorageConnectionAppSetting',
});

interface PersonEntity {
    PartitionKey: string;
    RowKey: string;
    Name: string;
}

export async function storageQueueTrigger1(queueItem: unknown, context: InvocationContext): Promise<void> {
    context.log('Node.js queue trigger function processed work item', queueItem);
    const person = <PersonEntity>context.extraInputs.get(tableInput);
    context.log('Person entity name: ' + person.Name);
}

app.storageQueue('storageQueueTrigger1', {
    queueName: 'myqueue-items',
    connection: 'MyStorageConnectionAppSetting',
    extraInputs: [tableInput],
    handler: storageQueueTrigger1,
});
const { app, input } = require('@azure/functions');

const tableInput = input.table({
    tableName: 'Person',
    partitionKey: 'Test',
    rowKey: '{queueTrigger}',
    connection: 'MyStorageConnectionAppSetting',
});

app.storageQueue('storageQueueTrigger1', {
    queueName: 'myqueue-items',
    connection: 'MyStorageConnectionAppSetting',
    extraInputs: [tableInput],
    handler: (queueItem, context) => {
        context.log('Node.js queue trigger function processed work item', queueItem);
        const person = context.extraInputs.get(tableInput);
        context.log('Person entity name: ' + person.Name);
    },
});

다음 함수는 큐 트리거를 사용하여 단일 테이블 행을 함수에 대한 입력으로 읽습니다.

이 예제에서 바인딩 구성은 테이블의 partitionKey 명시적 값을 지정하고 식을 사용하여 테이블에 전달 rowKey합니다. 식{queueTrigger}rowKey 행 키가 큐 메시지 문자열에서 가져온 것임을 나타냅니다.

function.json의 바인딩 구성:

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "MyQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "PersonEntity",
      "type": "table",
      "tableName": "Person",
      "partitionKey": "Test",
      "rowKey": "{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    }
  ],
  "disabled": false
}

run.ps1PowerShell 코드:

param($MyQueueItem, $PersonEntity, $TriggerMetadata)
Write-Host "PowerShell queue trigger function processed work item: $MyQueueItem"
Write-Host "Person entity name: $($PersonEntity.Name)"

다음 함수는 HTTP 트리거를 사용하여 단일 테이블 행을 함수에 대한 입력으로 읽습니다.

이 예제에서 바인딩 구성은 테이블의 partitionKey 명시적 값을 지정하고 식을 사용하여 테이블에 전달 rowKey합니다. rowKey 식, {id}는 행 키를 요청 경로의 {id} 부분에서 가져온다는 것을 나타냅니다.

function.json 파일의 바인딩 구성:

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "messageJSON",
      "type": "table",
      "tableName": "messages",
      "partitionKey": "message",
      "rowKey": "{id}",
      "connection": "AzureWebJobsStorage",
      "direction": "in"
    },
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ],
      "route": "messages/{id}"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ],
  "disabled": false
}

__init__.py 파일의 Python 코드:

import json

import azure.functions as func

def main(req: func.HttpRequest, messageJSON) -> func.HttpResponse:

    message = json.loads(messageJSON)
    return func.HttpResponse(f"Table row: {messageJSON}")

이 단순 바인딩을 사용하면 행 키 ID가 있는 행을 찾을 수 없는 경우를 프로그래밍 방식으로 처리할 수 없습니다. 보다 세분화된 데이터를 선택하려면 스토리지 SDK를 사용합니다.


특성

In Process격리된 작업자 프로세스 C# 라이브러리는 모두 특성을 사용하여 함수를 정의합니다. 대신 C# 스크립트는 C# 스크립팅 가이드에 설명된 대로 function.json 구성 파일을 사용합니다.

C# 클래스 라이브러리에서 TableInputAttribute은 다음 속성을 지원합니다.

Attribute 속성 설명
TableName 테이블의 이름입니다.
PartitionKey 선택 사항. 읽을 테이블 엔터티의 파티션 키입니다.
RowKey 선택 사항. 읽을 테이블 엔터티의 행 키입니다.
Take 선택 사항. IEnumerable<T>로 읽을 최대 엔티티 수입니다. RowKey와 함께 사용할 수 없습니다.
Filter 선택 사항. 엔티티가 IEnumerable<T>로 읽을 OData 필터 식입니다. RowKey와 함께 사용할 수 없습니다.
Connection 테이블 서비스에 연결하는 방법을 지정하는 앱 설정 또는 설정 컬렉션의 이름입니다. 커넥트 참조하세요.

주석

Java 함수 런타임 라이브러리에서 Table Storage에서 값을 가져올 매개 변수에 주석을 사용합니다@TableInput. 이 주석은 을 사용하여 네이티브 Java 형식, POJO 또는 nullable 값과 함께 사용할 Optional<T>수 있습니다. 이 주석은 다음 요소를 지원합니다.

요소 설명
이름 함수 코드의 테이블 또는 엔터티를 나타내는 변수의 이름입니다.
Tablename 테이블의 이름입니다.
partitionKey 선택 사항. 읽을 테이블 엔터티의 파티션 키입니다.
rowKey 선택 사항. 읽을 테이블 엔터티의 행 키입니다.
take 선택 사항. 읽을 최대 엔터티 수입니다.
filter 선택 사항. 테이블 입력을 위한 OData 필터 식입니다.
connection 테이블 서비스에 연결하는 방법을 지정하는 앱 설정 또는 설정 컬렉션의 이름입니다. 커넥트 참조하세요.

구성

다음 표에서는 input.table() 메서드에 전달된 options 개체에 설정할 수 있는 속성에 대해 설명합니다.

속성 설명
Tablename 테이블의 이름입니다.
partitionKey 선택 사항. 읽을 테이블 엔터티의 파티션 키입니다.
rowKey 선택 사항. 읽을 테이블 엔터티의 행 키입니다. take 또는 filter와 함께 사용할 수 없습니다.
take 선택 사항. 반환할 최대 엔터티 수입니다. rowKey와 함께 사용할 수 없습니다.
filter 선택 사항. 테이블에서 반환할 엔터티에 대한 OData 필터 식입니다. rowKey와 함께 사용할 수 없습니다.
connection 테이블 서비스에 연결하는 방법을 지정하는 앱 설정 또는 설정 컬렉션의 이름입니다. 커넥트 참조하세요.

구성

다음 표에서는 function.json 파일에서 설정한 바인딩 구성 속성에 대해 설명합니다.

function.json 속성 설명
type table로 설정해야 합니다. 이 속성은 Azure Portal에서 바인딩을 만들 때 자동으로 설정됩니다.
direction in로 설정해야 합니다. 이 속성은 Azure Portal에서 바인딩을 만들 때 자동으로 설정됩니다.
이름 함수 코드의 테이블 또는 엔터티를 나타내는 변수의 이름입니다.
Tablename 테이블의 이름입니다.
partitionKey 선택 사항. 읽을 테이블 엔터티의 파티션 키입니다.
rowKey 선택 사항. 읽을 테이블 엔터티의 행 키입니다. take 또는 filter와 함께 사용할 수 없습니다.
take 선택 사항. 반환할 최대 엔터티 수입니다. rowKey와 함께 사용할 수 없습니다.
filter 선택 사항. 테이블에서 반환할 엔터티에 대한 OData 필터 식입니다. rowKey와 함께 사용할 수 없습니다.
connection 테이블 서비스에 연결하는 방법을 지정하는 앱 설정 또는 설정 컬렉션의 이름입니다. 커넥트 참조하세요.

로컬에서 개발하는 경우 Values 컬렉션의 local.settings.json 파일에 애플리케이션 설정을 추가합니다.

연결

connection 속성은 앱이 테이블 서비스에 연결해야 하는 방법을 지정하는 환경 구성에 대한 참조입니다. 다음을 지정할 수 있습니다.

  • 연결 문자열이 포함된 애플리케이션 설정의 이름
  • ID 기반 연결을 함께 정의하는 여러 애플리케이션 설정에 대한 공유 접두사의 이름

구성된 값이 단일 설정에 대해 정확히 일치하고 다른 설정에 대해 접두사가 일치하는 경우 정확한 일치가 사용됩니다.

Connection string

Azure Table Storage의 테이블에 대한 연결 문자열을 가져오려면 스토리지 계정 액세스 키 관리에 표시된 단계를 따릅니다. Azure Cosmos DB for Table의 테이블에 대한 연결 문자열을 가져오려면 Azure Cosmos DB for Table FAQ에 표시된 단계를 따릅니다.

이 연결 문자열은 바인딩 구성의 connection 속성에 지정된 값과 일치하는 이름으로 애플리케이션 설정에 저장해야 합니다.

앱 설정 이름이 "AzureWebJobs"로 시작하는 경우 여기에서 이름의 re기본der만 지정할 수 있습니다. 예를 들어 connection을 “MyStorage”로 설정한 경우 함수 런타임 기능은 “AzureWebJobsMyStorage”라는 앱 설정을 찾습니다. connection을 비워 두면 함수 런타임 기능은 AzureWebJobsStorage라는 앱 설정에서 기본 스토리지 연결 문자열을 사용합니다.

ID 기반 연결

테이블 API 확장을 사용하는 경우 비밀과 함께 연결 문자열 사용하는 대신 앱에서 Microsoft Entra ID사용하도록 할 수 있습니다. 이는 Azure Storage의 테이블에 액세스할 때만 적용됩니다. ID를 사용하려면 트리거 및 바인딩 구성의 connection 속성에 매핑되는 공통 접두사 아래에 설정을 정의합니다.

connection을 "AzureWebJobsStorage"로 설정하는 경우 ID로 호스트 스토리지에 연결을 참조하세요. 다른 모든 연결의 경우 확장에는 다음 속성이 필요합니다.

속성 환경 변수 템플릿 설명 예제 값
Table Service URI <CONNECTION_NAME_PREFIX>__tableServiceUri1 HTTPS 체계를 사용하여 연결 중인 Azure Storage Table Service의 데이터 평면 URI입니다. https://<storage_account_name>.table.core.windows.net

1<CONNECTION_NAME_PREFIX>__serviceUri는 별칭으로 사용할 수 있습니다. 두 양식이 모두 제공되면 tableServiceUri 양식이 사용됩니다. 전체 연결 구성이 Blob, 큐 및/또는 테이블에서 사용되는 경우 serviceUri 형식을 사용할 수 없습니다.

연결을 사용자 지정하기 위해 다른 속성을 설정할 수 있습니다. ID 기반 연결의 공통 속성을 참조하세요.

전체 연결 구성이 Azure Storage의 Blob, 큐 및/또는 테이블에서 사용되는 경우 serviceUri 형식을 사용할 수 없습니다. URI는 테이블 서비스만 지정할 수 있습니다. 대안으로 동일한 접두사 아래에 있는 각 서비스에 대한 URI를 제공하여 단일 연결을 사용할 수 있습니다.

Azure Functions 서비스에서 호스트되는 경우 ID 기반 연결에 관리 ID가 사용됩니다. 사용자가 할당한 ID는 credentialclientID 속성을 사용하여 지정할 수 있지만 기본적으로 시스템 할당 ID가 사용됩니다. 리소스 ID를 사용하여 사용자가 할당한 ID를 구성하는 것은 지원되지 않습니다. 로컬 개발과 같은 다른 컨텍스트에서 실행할 때 사용자 지정할 수 있지만 대신 개발자 ID가 사용됩니다. ID 기반 연결을 사용하여 로컬 개발을 참조하세요.

ID에 권한 부여

사용되는 모든 ID에는 의도한 작업을 수행할 수 있는 권한이 있어야 합니다. 대부분 Azure 서비스의 경우 이는 해당 권한을 제공하는 기본 제공 또는 사용자 지정 역할을 사용하여 Azure RBAC에서 역할을 할당해야 함을 의미합니다.

Important

일부 사용 권한은 모든 컨텍스트에 필요하지 않은 대상 서비스에 의해 노출될 수 있습니다. 가능한 경우 최소 권한 원칙을 준수하여 ID에 필요한 권한만 부여하세요. 예를 들어 앱이 데이터 원본에서 읽을 수만 있으면 되는 경우 읽기 권한만 있는 역할을 사용합니다. 읽기 작업에 대한 과도한 권한이 될 수 있으므로 해당 서비스에 쓰기도 허용하는 역할을 할당하는 것은 부적절합니다. 마찬가지로 역할 할당이 읽어야 하는 리소스에 대해서만 범위가 할당되도록 할 수 있습니다.

런타임 시 Azure Storage 테이블 서비스에 대한 액세스를 제공하는 역할 할당을 만들어야 합니다. 소유자와 같은 관리 역할로는 충분하지 않습니다. 다음 표에서는 정상적인 작업에서 Azure Storage에 대해 Azure Tables 확장을 사용할 때 권장되는 기본 제공 역할을 보여 줍니다. 작성하는 코드에 따라 애플리케이션에 추가 권한이 필요할 수 있습니다.

바인딩 유형 기본 제공 역할의 예(Azure Storage1)
입력 바인딩 스토리지 테이블 데이터 판독기
출력 바인딩 스토리지 테이블 데이터 기여자

1 앱이 Azure Cosmos DB for Table의 테이블에 대신 연결하는 경우 ID 사용이 지원되지 않으며 연결은 연결 문자열을 사용해야만 합니다.

사용

바인딩 사용은 확장 패키지 버전과 함수 앱에서 사용되는 C# 형식에 따라 다르며 다음 중 하나일 수 있습니다.

격리된 작업자 프로세스 클래스 라이브러리 컴파일된 C# 함수는 런타임에서 격리된 프로세스에서 실행됩니다.

버전을 선택하여 모드 및 버전에 대한 사용 세부 정보를 확인합니다.

단일 테이블 엔터티로 작업할 때 Azure Tables 입력 바인딩은 다음 형식에 바인딩될 수 있습니다.

Type 설명
ITableEntity를 구현하는 JSON 직렬화 가능 형식 함수는 엔터티를 POCO(Plain-Old CLR 개체) 형식으로 역직렬화하려고 시도합니다. 형식은 ITableEntity를 구현하거나 문자열 RowKey 속성과 문자열 PartitionKey 속성을 가져야 합니다.
TableEntity1 사전과 유사한 형식의 엔터티입니다.

쿼리에서 여러 엔터티로 작업할 때 Azure Tables 입력 바인딩은 다음 형식에 바인딩될 수 있습니다.

Type 설명
IEnumerable<T> 여기서 TITableEntity를 구현합니다. 쿼리에서 반환된 항목의 열거형입니다. 각 엔터티는 하나의 엔터티를 나타냅니다. T 형식은 ITableEntity를 구현하거나 문자열 RowKey 속성과 문자열 PartitionKey 속성을 가져야 합니다.
TableClient1 테이블에 연결된 클라이언트. 이는 테이블 처리에 대한 대부분의 제어를 제공하며 연결에 충분한 권한이 있는 경우 테이블에 쓰는 데 사용할 수 있습니다.

1 이러한 형식을 사용하려면 Microsoft.Azure.Functions.Worker.Extensions.Tables 1.2.0 이상SDK 형식 바인딩에 대한 공통 종속성을 참조해야 합니다.

TableInput 특성을 사용하면 함수를 트리거한 테이블 행에 액세스할 수 있습니다.

context.extraInputs.get()을 사용하여 입력 행 데이터를 가져옵니다.

데이터는 function.json 파일의 키에 지정된 name 대로 입력 매개 변수에 전달됩니다. 지정 partitionKey 하 고 rowKey 특정 레코드를 필터링할 수 있습니다.

테이블 데이터는 JSON 문자열로 함수에 전달됩니다. 입력 예제와 같이 호출 json.loads 하여 메시지를 직렬화 해제합니다.

구체적인 사용법은 예제를 참조하세요.

다음 단계