Azure関数からプログラムでデータファクトリパイプラインを呼び出そうとしていました。次のエラーをスローします。
リンク: http://eatcodelive.com/2016/02/24/starting-an-Azure-data-factory-pipeline-from-c-net/
AuthorizationFailed:オブジェクトID 'XXX829e05'XXXX-XXXXX'のクライアント 'XXXX-XXXXX-XXXX'には、スコープに対してアクション 'Microsoft.DataFactory/datafactories/datapipelines/read'を実行する権限がありません'/subscriptions/XXXXXX-4bf5-84c6-3a352XXXXXX/resourcegroups/fffsrg/providers/Microsoft.DataFactory/datafactories/ADFTestFFFS/datapipelines/ADFTutorialPipelineCustom'.
同様の問題を検索しようとしましたが、検索結果のいずれも私の問題の解決策を提供しませんでした。問題の可能性を教えてください。
目的は、ファイルがblobに追加されるたびにデータファクトリパイプラインを実行することです。結果を達成するために、blobトリガーを使用してAzure関数からデータファクトリパイプラインを呼び出そうとしています。
ステップ1:Azureポータルにログインする
ステップ2:左側のメニューバーでサブスクリプションを見つけてクリックします。
ステップ3:[アクセス制御IAM]をクリックし、[追加]をクリックします。
ステップ4:[権限の追加]ウィンドウで、役割の投稿者を選択します。 [選択]入力ボックスに、Azure ADで作成した(Azure Active Directoryで作成した)アプリ名を入力して選択します。私の場合、Azure Resource Managementを作成しました。
ステップ5:許可が成功した後、サブスクリプションウィンドウで[更新]をクリックすると、リストにアプリが表示されます。以下の例を参照してください。
データファクトリに関連する権限がないため、パイプラインのスコープに対してアクション 'Microsoft.DataFactory/datafactories/datapipelines/read'を実行する権限がないというエラーが表示されます。
データファクトリリソースまたは子リソースを作成および管理するには、「Contributor」/「DataFactoryContributor」権限が必要です。次のリンクのAzure RBACロールの詳細:
https://docs.Microsoft.com/en-us/Azure/active-directory/role-based-access-built-in-roles
お客様はAzure Function内からADFクライアントを使用しようとしているため、ADFクライアントの認証にはAADアプリケーションとサービスプリンシパルを使用することをお勧めします。 AADアプリケーションとサービスプリンシパルを作成する手順については、次を参照してください。
Active Directoryアプリケーション、サービスプリンシパルを作成する方法の手順に従い、次のリンクのData Factory Contributorロールと、ADFクライアントでサービスプリンシパルを使用するためのコードサンプルに割り当てます。
AzureリソースグループとRBACを使用する場合の一般的な問題を参照してください https://blogs.msdn.Microsoft.com/Azure4fun/2016/10/20/common-problem-when-using-Azure-resource-groups-rbac/
この問題は、新しいサブスクリプションで発生する可能性が高く、通常、そのサブスクリプションで特定のリソースタイプが一度も作成されていない場合に発生します。
サブスクリプション管理者は、サブスクリプションレベルではなくリソースグループレベルのレベルまでアクセスを分離するという戦略と矛盾するサブスクリプションレベルで、リソースグループの所有者にコントリビューター権限を付与することにより、この問題を修正することがよくあります。
根本的な原因
一部の管理者は、一部のリソースはこれらのリソースを作成するためにサブスクリプションレベルにアクセスする必要があり、リソースグループレベルの「所有者」権限では不十分であると言います。それは真実ではありません。
最初に戻って、これがどのように機能するかを理解しましょう。
Azureのリソースを(リソースマネージャーモデルを使用して)プロビジョニングするには、そのリソースの作成をサポートするリソースプロバイダーが必要です。たとえば、仮想マシンをプロビジョニングする場合、「Microsoft.Compute」リソースプロバイダーをサブスクリプションで最初に使用可能にしてから、それを実行する必要があります。
リソースプロバイダーは、サブスクリプションのレベルでのみ登録されます。
幸いなことに、Azure Resource Manager(ARM)はそれを把握できるほどインテリジェントです。新しいAzureリソースがプロビジョニングされたときに、そのリソースタイプに必要なリソースプロバイダーがサブスクリプションにまだ登録されていない場合、ARMはそれを登録しようとします。そのアクション(リソースプロバイダーの登録)サブスクリプションレベルへのアクセスが必要です。
既定では、新しいAzureサブスクリプションは一般的に使用されるリソースプロバイダーのリストに事前登録されます。たとえば、IoTHubのリソースプロバイダーはそれらの1つではありません。
ユーザーに特定のリソースグループの所有者権限のみが付与されている場合、そのユーザーがリソースプロバイダーの初回登録が必要なリソースをプロビジョニングしようとすると、その操作は失敗します。これが、IoThubをプロビジョニングしようとしたときに上記のケースで発生したことです。
結論として、ユーザーがHDInsight、IotHub、SQLDWなどのリソースを作成できるようにするには、サブスクリプションレベルへのアクセス許可を付与する必要がありますDO NOT…などこれらのリソースのリソースプロバイダーが既に登録されている限り、所有者権限があります。
最近、同じメッセージでこの問題が発生し、ユーザーが別のサブスクリプションでログインしていることが原因であることがわかりました(2つあります)。 az login --subscriptionを使用して、問題を解決しました。
私はこの投稿に従うことで解決しました: https://www.nwcadence.com/blog/resolving-authorizationfailed-2016 PowerShellのコマンドで:
Get-AzureRmResourceProvider -ListAvailable | Select-Object ProviderNamespace | Foreach-Object { Register-AzureRmResourceProvider -ProviderName $_.ProviderNamespace}
この投稿に従ってください: https://docs.Microsoft.com/en-us/Azure/azure-resource-manager/resource-group-create-service-principal-portal
この投稿では、ロールは「リーダー」として提供されます。「リーダー」は代わりに「所有者」である必要があります。
溶液:
以下のコードは私のために機能します。 Azure資格情報でログインした後、Power Shellで試してください。
実装:
$azureAdApplication = New-AzureRmADApplication -DisplayName <AppName> -HomePage <URL> -IdentifierUris <URL with domain> -Password <Password>
New-AzureRmRoleAssignment -RoleDefinitionName "Data Factory Contributor" -ServicePrincipalName $azureAdApplication.ApplicationId