ps/Modules/Alkami.DevOps.Inventory/Public/Send-DeploymentManifestToS3.ps1
2023-05-30 22:51:22 -07:00

113 lines
3.9 KiB
PowerShell

function Send-DeploymentManifestToS3 {
<#
.SYNOPSIS
Generates an inventory for the current machine (or accepts one from an existing local file location) and uploads it to s3. If a valid bucket is supplied that will be targeted. Otherwise a bucket name will be generated from machine.config values. If that generates an invalid bucket name it will throw.
.EXAMPLE
Send-DeploymentManifestToS3
This will upload a local manifest to the bucket generated based on machine.config values.
Send-DeploymentManifestToS3 -Bucket "alkami-manifest-test"
This will upload a local manifest to the "alkami-manifest-test" bucket
Send-DeploymentManifestToS3 -Bucket "alkami-manifest-test" -Filename "C:\Temp\foo1.json"
This will upload the manifest in the specified file (no validation is performed here) to the "alkami-manifest-test" bucket
.PARAMETER S3BucketName
Optional bucket name. Mostly used for local (non-aws) machine testing.
.PARAMETER InventoryFilename
Optional local manifest file name.
.PARAMETER ProfileName
[string] Specific AWS CLI Profile to use in AWS API calls
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[Alias("Bucket")]
[string]$S3BucketName,
[Parameter(Mandatory = $false)]
[Alias("Filename")]
[string]$InventoryFilename,
[Parameter(Mandatory = $false)]
[string]$ProfileName
)
$logLead = (Get-LogLeadName)
Import-AWSModule # S3
$defaultTempFileLocation = "c:\temp\manifest"
$filename = ""
$splatParams = @{}
if (!([string]::IsNullOrEmpty($ProfileName))) {
$splatParams["ProfileName"] = "$ProfileName"
}
if ([string]::IsNullOrEmpty($s3BucketName)) {
$envName = Get-AppSetting "Environment.Name"
$envType = Get-AppSetting "Environment.Type"
$envName = $envName.Split(" ")[-1].Replace(".", "-")
if ($envType -eq "Production") {
$envType = "prod"
}
$s3BucketName = "orb-$envType-$envName-script-bucket"
}
if ([string]::IsNullOrEmpty($inventoryFilename)) {
if (!(Test-Path $defaultTempFileLocation)) {
New-Item -Path $defaultTempFileLocation -ItemType "directory"
}
$filename = "$defaultTempFileLocation\$env:computername.json"
Get-MachineInventory -filter chocolatey -asJson | Out-File -FilePath $filename
}
elseif (!($null -eq $inventoryFilename)) {
$filename = $inventoryFilename
}
else {
throw "$logLead : Inventory source is required"
}
$leafName = Split-Path $filename -leaf
$leafNameWithoutExtension = $leafName.Split(".")[0]
$existingManifests = Get-S3Object -BucketName $s3BucketName -KeyPrefix $leafNameWithoutExtension @splatParams
if ($null -eq $existingManifests) {
Write-S3Object -BucketName $s3BucketName -File $filename @splatParams
}
else {
if ($existingManifests.Count -gt 1) {
$oldManifest = $existingManifests | Where-Object {$_.Key -ne $leafName}
if ($oldManifest.Count -gt 1) {
throw "$loglead : Unexpected manifests found in S3. Please manually inspect the bucket."
}
# Force this delete so that we don't ask for human input.
Remove-S3Object -BucketName $s3BucketName -Key $oldManifest.Key -Force @splatParams
}
$fileTimestamp = Get-Date -Format FileDateTimeUniversal
$destinationKey = [System.Io.Path]::GetFileNameWithoutExtension($leafName) + "-" + $fileTimestamp + ".json"
Copy-S3Object -BucketName $s3BucketName -key $leafName -DestinationBucket $s3BucketName -DestinationKey $destinationKey @splatParams
# This should overwrite the existing one that we just copied to a new renamed file.
Write-S3Object -BucketName $s3BucketName -File $filename @splatParams
}
Write-Host "Manifest has been uploaded to $s3BucketName."
}