11

PS-Gallery から入手できる AWS モジュールが必要ですが、 Azure Function内でインストール ステップを実行しようとすると、機能しません。-verbose 引数フラグは、コンソールに何も書き込んでいません。

Azure 関数内で追加の PowerShell モジュールを取得して使用する正しい方法は何ですか?

機能コード

[Console]::WriteLine("PowerShell Timer trigger function executed at:$(get-date)");
if (-not (Get-Module -Name "AWSPowerShell")) {
[Console]::WriteLine("AWSPowerShell not installed");
Install-Module -Name AWSPowerShell -Scope CurrentUser -ErrorAction Continue -Verbose
}
if (-not (Get-Module -Name "AWSPowerShell")){
[Console]::WriteLine("AWSPowerShell install step failed");
}

関数ログ

2016-06-09T11:24:31.108 Function started (Id=e09be687-2e13-4754-942e-eab75c8516e5)
2016-06-09T11:24:32.788 Powershell Timer trigger function executed at:06/09/2016 11:24:32
AWSPowerShell not installed
AWSPowerShell install step failed
2016-06-09T11:24:32.788 Function completed (Success, Id=e09be687-2e13-4754-942e-eab75c8516e5)

アップデート

@travis の回答に従って、nuget パッケージ マネージャーの行を含む、提案されたコードを追加しました。これはまだうまくいきませんでした。別のデバッグ行を追加したところ、nuget を追加しようとしても、モジュール プロバイダーがないことがわかりました。

改訂されたコード

[Console]::WriteLine("Powershell Timer trigger function executed at:$(get-date)");

Get-PackageProvider -Name nuget -ForceBootstrap

$pkg=Get-PackageProvider -ListAvailable
if ($pkg.Count -lt 1){ [Console]::WriteLine("No providers")}

if (-not (Get-Module -listavailable -Name "AWSPowerShell")) {
    [Console]::WriteLine("AWSPowerShell not installed");
    Install-Module -Name AWSPowerShell -Scope CurrentUser -ErrorAction Continue -Verbose -force
}

if (-not (Get-Module -listavailable -Name "AWSPowerShell")){
    [Console]::WriteLine("AWSPowerShell install step failed");
}

Import-Module AWSPowerShell

改訂ログ

2016-06-09T17:54:03.859 Powershell Timer trigger function executed at:06/09/2016 17:54:02
No providers
AWSPowerShell not installed
AWSPowerShell install step failed
2016-06-09T17:54:03.859 Function completed (Success, Id=80efb9fc-5e91-45f9-ab58-3b71fcd764af)
4

4 に答える 4

12

PowerShell スクリプトに対する Azure Functions のサポートは、現在実験段階にあります。次のシナリオがサポートされています。

  1. Azure Functions は、独自のモジュールを持ち込む顧客をサポートできます。これらのモジュールはmodules、PowerShell スクリプトが存在するディレクトリと同じディレクトリにあるという名前のフォルダーに存在します。サンプル関数のKuduコンソールでは、ディレクトリ構造は次のようになります。

ここに画像の説明を入力

  1. Install-Moduleコマンドレットを使用して独自のモジュールをインストールするお客様はサポートされませんが、モジュールをmodulesフォルダーにアップロードすることはできます。

  2. フォルダー内のすべてのモジュールが自動的に読み込まれるため、コマンドレット modulesを明示的に使用する必要はありません。Import-Module

  3. scriptbinary、およびmanifestモジュールをサポートします。これらのモジュールは、modulesフォルダー内のフラットな構造に存在します。レイアウトの例は次のとおりです。

    ここに画像の説明を入力

AWSPowerShell達成しようとしていることに関連して、モジュールがロードされていることを確認するための推奨手順を次に示します。

  1. AWSPowerShell開発マシンにローカルにインストールします。以下のすべてのコンテンツをアップロードする必要があります\AWSPowerShell\3.3.5.0

  2. Kudu インターフェイスを使用して、インストール済みの依存関係を関数のディレクトリAWSPowerShellにあるフォルダーにアップロードします。modulesこれを行うには、関数アプリのポータル UI を開き、[関数アプリの設定]ボタンをクリックします。

  3. 次に、[Kudu に移動] ボタンをクリックして Kudu コンソールを起動します。次のようなスナップショットが表示されます。

    ここに画像の説明を入力

  4. cmd コンソール プロンプトで、関数のフォルダーに移動し、ディレクトリを作成して、すべてのコンテンツをmodulesディレクトリにアップロードします。\AWSPowerShell\3.3.5.0modules

最終的に、以下のスナップショットのようなファイルのリストを含むモジュール フォルダーが作成されます。

ここに画像の説明を入力

  1. 関数を実行します。たとえば、関数に次のスクリプトがあるとします。

    if (-not (Get-Module -Name "AWSPowerShell")) { Write-Output "AWSPowerShell not installed"; } else { Write-Output "AWSPowerShell installed"; }

実行すると、ログ出力は次のようになります。

2016-10-11T18:26:01.486 Function started (Id=582b69aa-6236-436d-81c5-c08ada8ae674)
2016-10-11T18:26:03.267 Loaded modules:
/AWSPowerShell/modules/AWSPowerShell.psd1
/AWSPowerShell/modules/AWSPowerShell.dll
/AWSPowerShell/modules/AWSSDK.APIGateway.dll
/AWSPowerShell/modules/AWSSDK.ApplicationAutoScaling.dll
/AWSPowerShell/modules/AWSSDK.ApplicationDiscoveryService.dll
/AWSPowerShell/modules/AWSSDK.AutoScaling.dll
/AWSPowerShell/modules/AWSSDK.AWSMarketplaceCommerceAnalytics.dll
/AWSPowerShell/modules/AWSSDK.AWSMarketplaceMetering.dll
/AWSPowerShell/modules/AWSSDK.AWSSupport.dll
/AWSPowerShell/modules/AWSSDK.CertificateManager.dll
/AWSPowerShell/modules/AWSSDK.CloudFormation.dll
/AWSPowerShell/modules/AWSSDK.CloudFront.dll
/AWSPowerShell/modules/AWSSDK.CloudHSM.dll
/AWSPowerShell/modules/AWSSDK.CloudSearch.dll
/AWSPowerShell/modules/AWSSDK.CloudSearchDomain.dll
/AWSPowerShell/modules/AWSSDK.CloudTrail.dll
/AWSPowerShell/modules/AWSSDK.CloudWatch.dll
/AWSPowerShell/modules/AWSSDK.CloudWatchEvents.dll
/AWSPowerShell/modules/AWSSDK.CloudWatchLogs.dll
/AWSPowerShell/modules/AWSSDK.CodeCommit.dll
/AWSPowerShell/modules/AWSSDK.CodeDeploy.dll
/AWSPowerShell/modules/AWSSDK.CodePipeline.dll
/AWSPowerShell/modules/AWSSDK.CognitoIdentity.dll
/AWSPowerShell/modules/AWSSDK.CognitoIdentityProvider.dll
/AWSPowerShell/modules/AWSSDK.ConfigService.dll
/AWSPowerShell/modules/AWSSDK.Core.dll
/AWSPowerShell/modules/AWSSDK.DatabaseMigrationService.dll
/AWSPowerShell/modules/AWSSDK.DataPipeline.dll
/AWSPowerShell/modules/AWSSDK.DeviceFarm.dll
/AWSPowerShell/modules/AWSSDK.DirectConnect.dll
/AWSPowerShell/modules/AWSSDK.DirectoryService.dll
/AWSPowerShell/modules/AWSSDK.DynamoDBv2.dll
/AWSPowerShell/modules/AWSSDK.EC2.dll
/AWSPowerShell/modules/AWSSDK.ECR.dll
/AWSPowerShell/modules/AWSSDK.ECS.dll
/AWSPowerShell/modules/AWSSDK.ElastiCache.dll
/AWSPowerShell/modules/AWSSDK.ElasticBeanstalk.dll
/AWSPowerShell/modules/AWSSDK.ElasticFileSystem.dll
/AWSPowerShell/modules/AWSSDK.ElasticLoadBalancing.dll
/AWSPowerShell/modules/AWSSDK.ElasticLoadBalancingV2.dll
/AWSPowerShell/modules/AWSSDK.ElasticMapReduce.dll
/AWSPowerShell/modules/AWSSDK.Elasticsearch.dll
/AWSPowerShell/modules/AWSSDK.ElasticTranscoder.dll
/AWSPowerShell/modules/AWSSDK.GameLift.dll
/AWSPowerShell/modules/AWSSDK.IdentityManagement.dll
/AWSPowerShell/modules/AWSSDK.ImportExport.dll
/AWSPowerShell/modules/AWSSDK.Inspector.dll
/AWSPowerShell/modules/AWSSDK.IoT.dll
/AWSPowerShell/modules/AWSSDK.IotData.dll
/AWSPowerShell/modules/AWSSDK.KeyManagementService.dll
/AWSPowerShell/modules/AWSSDK.Kinesis.dll
/AWSPowerShell/modules/AWSSDK.KinesisAnalytics.dll
/AWSPowerShell/modules/AWSSDK.KinesisFirehose.dll
/AWSPowerShell/modules/AWSSDK.Lambda.dll
/AWSPowerShell/modules/AWSSDK.MachineLearning.dll
/AWSPowerShell/modules/AWSSDK.MobileAnalytics.dll
/AWSPowerShell/modules/AWSSDK.OpsWorks.dll
/AWSPowerShell/modules/AWSSDK.RDS.dll
/AWSPowerShell/modules/AWSSDK.Redshift.dll
/AWSPowerShell/modules/AWSSDK.Route53.dll
/AWSPowerShell/modules/AWSSDK.Route53Domains.dll
/AWSPowerShell/modules/AWSSDK.S3.dll
/AWSPowerShell/modules/AWSSDK.SecurityToken.dll
/AWSPowerShell/modules/AWSSDK.ServiceCatalog.dll
/AWSPowerShell/modules/AWSSDK.SimpleEmail.dll
/AWSPowerShell/modules/AWSSDK.SimpleNotificationService.dll
/AWSPowerShell/modules/AWSSDK.SimpleSystemsManagement.dll
/AWSPowerShell/modules/AWSSDK.SimpleWorkflow.dll
/AWSPowerShell/modules/AWSSDK.Snowball.dll
/AWSPowerShell/modules/AWSSDK.SQS.dll
/AWSPowerShell/modules/AWSSDK.StorageGateway.dll
/AWSPowerShell/modules/AWSSDK.WAF.dll
/AWSPowerShell/modules/AWSSDK.WorkSpaces.dll
/AWSPowerShell/modules/log4net.dll
/AWSPowerShell/modules/AWSPowerShellCompleters.psm1
2016-10-11T18:27:21.265 AWSPowerShell installed
2016-10-11T18:27:21.464 Function completed (Success, Id=582b69aa-6236-436d-81c5-c08ada8ae674)

注: すべてのモジュールが実行時にロードされるため、関数の完了には時間がかかります。

ほとんどの IaaS セットアップとは異なり、Azure Function はマルチテナント環境で実行されることに注意してください。そのため、次の既知の警告が残っています。

  1. 当社のインフラストラクチャは、セキュリティ リスクと見なされる低レベル API を実行する関数 (対話モード、ホスト資格情報へのアクセス、レジストリ編集など) を防ぎます。使用している PowerShell スクリプトまたはモジュールがこれらのブロックされた API のいずれかを呼び出す場合、Functions でそれらのワークロードを実行することはできません。それにもかかわらず、私たちの目標はできるだけ多くのシナリオをサポートすることであるため、お客様からの需要量に基づいてブロック解除シナリオに優先順位を付けます。

  2. 現在、PowerShell バージョン 4.0 と Azure PowerShell 1.4 がインフラストラクチャにインストールされています。これらのバージョンはまもなくアップグレードされます。Azure Functions での PowerShell のサポートが追加されるにつれて、モジュール スイートは時間の経過とともにアップグレードまたは追加される可能性があります。これらのプレインストールされたモジュールが既存のモジュールと競合する可能性がわずかにあります。

于 2016-10-11T19:56:30.637 に答える
1

-listavailable呼び出しに追加して、ロードされたモジュールだけでなく、すべてのモジュールを探すようにする必要がありget-moduleます。

非対話型環境で install-module を機能させるには、nuget をブートストラップする必要がある場合があります。コマンドは次のとおりです。Get-PackageProvider -Name nuget -ForceBootstrap

インストール元のリポジトリが信頼されていない場合は、コマンドを強制する必要がある場合がありますinstall-module

[Console]::WriteLine("Powershell Timer trigger function executed at:$(get-date)");

if (-not (Get-Module -listavailable -Name "AWSPowerShell")) {
    [Console]::WriteLine("AWSPowerShell not installed");
    Install-Module -Name AWSPowerShell -Scope CurrentUser -ErrorAction Continue -Verbose -force
}

if (-not (Get-Module -listavailable -Name "AWSPowerShell")){
    [Console]::WriteLine("AWSPowerShell install step failed");
}

参考までに: [Console]::WriteLine は、PowerShell で自動化されたスクリプトを使用するための適切な方法とは見なされていません。Write-Verbose このように強制することができますWrite-Verbose -message 'my message' -verbose

于 2016-06-09T16:21:32.460 に答える
0

その理由は、モジュールをロードする場所を指定していないためだと思います。現在$env:PSModulePathは次のようにリストされています

WindowsPowerShell\モジュール;
D:\Program Files (x86)\WindowsPowerShell\Modules; D:\Windows\system32\WindowsPowerShell\v1.0\Modules\;
d:\Program Files\Microsoft Security Client\MpProvider\;
D:\Program Files\Microsoft Message Analyzer\PowerShell\;
D:\Program Files\WindowsPowerShell\Modules\;
D:\Program Files (x86)\MicrosoftSDKs\Azure\PowerShell\ResourceManager\AzureResourceManager\;
D:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\ServiceManagement\;
D:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\Storage\

最初のものをどこから参照しているのか完全にはわからないので、そこに置くことができませんでした。だから私は代わりにこれをまとめました

$env:PSModulePath = $env:PSModulePath + ";d:\home\modules\"

import-module azured 
$out = Deploy-Template
[Console]::WriteLine($out)
Out-File -Encoding Ascii $Env:res -inputObject $out

これにより、モジュール (d:\home\modules にあります) がロードされ、期待どおりに動作します。

Get-PackageProvider -Name nuget -ForceBootstrap機能しない理由は、PackageManagementモジュールがインストールされていないためです。ただし、nuget は既にインストールされています。その方法でパッケージをインストールするには、 kuduと直接対話する必要があります。

関数によって少しおかしくなっているのは私だけではないことがわかってうれしいです;)

于 2016-06-21T12:33:07.640 に答える