AWS SSM RunCommand - проблема с документом RunRemoteScript для запуска сценария PowerShell с параметрами - PullRequest
0 голосов
/ 27 апреля 2020

В AWS SSM я использую документ RunRemoteScript для запуска сценария PowerShell для установки некоторого программного обеспечения на управляемые экземпляры SSM. Сценарий размещается в общедоступной c доступной корзине S3.

RunCommand прекрасно работает со сценарием, не принимающим никаких параметров. Программное обеспечение было успешно развернуто на управляемых экземплярах. Но мой скрипт имеет уникальный CID, встроенный в код. По соображениям безопасности мне нужно вынуть его и установить в качестве параметра для сценария PS. С тех пор RunCommand просто продолжает сбой.

Мой скрипт выглядит следующим образом (с параметром CID):

param (
        [Parameter(Position = 0, Mandatory = 1)]
        [string]$CID
)

Start-Transcript -Path "$([System.Environment]::GetEnvironmentVariable('TEMP','Machine'))\app_install.log" -Append
function Install-App {
    <#
    Installs App
    #>
    [CmdletBinding()]
    [OutputType([PSCustomObject])]
    param (
        [Parameter(Position = 0, Mandatory = 1)]
        [string]$msiURL,
        [Parameter(Position = 2, Mandatory = 1)]
        [string]$InstallCheck,
        [Parameter(Position = 3, Mandatory = 1)]
        [string]$CustomerID
    )

    if ( -not(Test-Path $installCheck)) {
    # Do stuff
    ...
    }
    else {
        Write-Host ("$installCheck - Already Installed")
        Return "Already Installed, Skipped $(($msiURL -split '([^\\/]+$)')[1])"
    }
}


Install-App -msiURL "https://s3.amazonaws.com/app.foo.com/Windows/app.exe" -InstallCheck "C:\Program Files\App\app.exe" -CustomerID $CID

Stop-Transcript

Следуя приведенной ниже документации AWS SSM, я запускаю команду ниже запустить RunCommand. https://docs.aws.amazon.com/systems-manager/latest/userguide/integration-remote-scripts.html

aws ssm send-command --document-name "AWS-RunRemoteScript" --targets "Key=instanceids,Values=mi-abc12345" 
--parameters '{"sourceType":["S3"],"sourceInfo":["{\"path\": "https://s3.amazonaws.com/app.foo.com/Windows/app_install.ps1\"}"],"commandLine":["app_install.ps1 abcd123456"]}'

RunCommand продолжает сбой с ошибкой ниже:

----------ERROR-------

app_install.ps1 : The term 'app_install.ps1' is not recognized

as the name of a cmdlet, function, script file, or operable program. Check the

spelling of the name, or if a path was included, verify that the path is

correct and try again.

At C:\ProgramData\Amazon\SSM\InstanceData\mi-abcd1234\document\orchest

ration\a6811111d-c411-411-a222-bad123456\runPowerShellScript\_script.ps1:4

char:2

+ app_install.ps1 abcd123456

+ ~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : ObjectNotFound: (app_install.ps1:String)

[], CommandNotFoundException

+ FullyQualifiedErrorId : CommandNotFoundException

failed to run commands: exit status 255

Я подозреваю, что это связано с тем, как RunCommand обрабатывает аргумент для скрипт PowerShell. Но я не могу найти никаких примеров, кроме официального документа, которому я следовал. Кто-нибудь может указать, в чем здесь проблема?

Кстати, я уже безуспешно пытался поставить ps1 после ". \".

1 Ответ

0 голосов
/ 28 апреля 2020

Я выяснил причину проблемы. Роль IAM, прикрепленная к экземпляру, не имела достаточных прав для доступа к корзине S3, содержащей сценарий. В результате SSM не смог загрузить скрипт в экземпляр, поэтому ошибка «... ps1 не распознана».

Так что это на самом деле не связано с кодом.

...