首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在AWS上使用Terraform安装Windows HotFix

在AWS上使用Terraform安装Windows HotFix
EN

Stack Overflow用户
提问于 2018-03-22 10:06:42
回答 1查看 1.3K关注 0票数 2

我有一个非常简单的PowerShell脚本,它将生成的测试文件从Windows2008AWS数据中心服务器(干净的S3实例)上传到AWS S3桶。如果我使用Terraform (remote-exec provisioner)远程在服务器上运行脚本,那么脚本将在带有StackOverflowException的S3上传时失败。当我直接在服务器上运行脚本时,它运行良好并上传文件。

我已经对文件进行了不同大小的实验,14.5MB似乎是StackOverflowException出现之前的最大容量。当我将RDP放入服务器并直接运行脚本时,任何大小都可以正常工作。我测试了200 it,运行良好。

知道为什么会发生这种事吗?或者我能做些什么来解决这个问题?我需要上传的实际文件是50 is。

以下是重现这个问题的关键部分。terraform.tf文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
resource "aws_instance" "windows" {
  count                       = "1"
  ami                         = "ami-e935fc94" #base win 2008 R2 datacenter
  instance_type               = "t2.micro"

  connection {
    type     = "winrm"
    user     = "<username>"
    password = "<password>"
    timeout  = "30m"
  }

  provisioner "file" {
    source      = "windows/upload.ps1"
    destination = "C:\\scripts\\upload.ps1"
  }

  provisioner "remote-exec" {
    inline = [
      "powershell.exe -File C:\\scripts\\upload.ps1"
    ]
  }
}

PowerShell脚本非常简单。upload.ps1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$f = new-object System.IO.FileStream C:\Temp\test.dat, Create, ReadWrite
$f.SetLength(40MB) # change this to 14.5MB and it works!
$f.Close()
Write-S3Object -BucketName "mybucket" -Folder "C:\Temp" -KeyPrefix "20180322" -SearchPattern "*.dat"

从Terraform (remote-exec提供程序)启动脚本时收到的错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
aws_instance.windows (remote-exec): Process is terminated due to StackOverflowException.

在服务器本身上从RDP运行upload.ps1可以正常工作,包括更大的文件(测试最多可达200 up )。

以下是版本信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Microsoft Windows Server 2008 R2 Datacenter
Powershell Version: 3.0
AWS Tools for Windows PowerShell, Version 3.3.245.0
Amazon Web Services SDK for .NET, Core Runtime Version 3.3.21.15
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-30 19:06:51

这个问题是由窗口错误造成的。对于一个标准的Windows服务器来说,这一切都很好,而且很好--您可以修补并继续前进。但是,在使用Terraform的AWS自动化方面,情况要复杂得多。

理想的解决方案是: 1)使用基本AMI;2)将修补程序应用于自身;3)然后运行WinRM remote-exec,所有这些都来自Terraform。另一种解决方案是使用安装好的修补程序创建一个AMI,并让Terraform使用该AMI生成实例。然而,你却被困在维护非盟驻苏特派团了。

通常,我使用过滤器获取Microsoft提供的基本AMI:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data "aws_ami" "windows2008" {
  most_recent = true

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  filter {
    name   = "name"
    values = ["Windows_Server-2008-R2_SP1-English-64Bit-Base*",]
  }

  owners = ["801119661308", "amazon"]
}

然后我使用那个AMI创建AWS实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
resource "aws_instance" "windows" {
  count                       = "1"
  ami                         = "${data.aws_ami.windows2008.id}"
  ...
}

但是, --基本AMI没有安装热修复 --允许您避免这个WinRM/Windows。如果事情变得棘手的话。

您可以使用userdata脚本来执行多阶段设置。在实例的第一次引导(第一阶段)中,我们将阻止该实例,以便远程执行程序在准备就绪之前不会出现。然后,我们将下载并安装修补程序,然后重新启动(多亏了尼可拉斯·阿克伦德米基·巴拉德利泰奇比)。在第二次引导时(在描述这里的方法中),我们将解除对实例(启用WinRM)的阻塞,以便远程执行部分能够连接。

下面是我的userdata/PowerShell脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$StateFile = "C:\Temp\userdata_state.txt"
If(-Not (Test-Path -Path $StateFile))
{
  # PHASE 1

  # Close the instance to WinRM connections until instance is ready (probably already closed, but just in case)
  Start-Process -FilePath "winrm" -ArgumentList "set winrm/config/service/auth @{Basic=`"false`"}" -Wait

  # Set the admin password for WinRM connections
  $Admin = [adsi]("WinNT://./Administrator, user")
  $Admin.psbase.invoke("SetPassword", "${tfi_rm_pass}")

  # Create state file so after reboot it will know
  New-Item -Path $StateFile -ItemType "file" -Force

  # Make it so that userdata will run again after reboot
  $EC2SettingsFile="C:\Program Files\Amazon\Ec2ConfigService\Settings\Config.xml"
  $Xml = [xml](Get-Content $EC2SettingsFile)
  $XmlElement = $Xml.get_DocumentElement()
  $XmlElementToModify = $XmlElement.Plugins

  Foreach ($Element in $XmlElementToModify.Plugin)
  {
      If ($Element.name -eq "Ec2HandleUserData")
      {
          $Element.State="Enabled"
      }
  }
  $Xml.Save($EC2SettingsFile)

  # Download and install hotfix

  # Download self-extractor
  $DownloadUrl = "https://hotfixv4.trafficmanager.net/Windows%207/Windows%20Server2008%20R2%20SP1/sp2/Fix467402/7600/free/463984_intl_x64_zip.exe"
  $HotfixDir = "C:\hotfix"
  $HotfixFile = "$HotfixDir\KB2842230.exe"
  mkdir $HotfixDir
  (New-Object System.Net.WebClient).DownloadFile($DownloadUrl, $HotfixFile)

  # Extract self-extractor
  Add-Type -AssemblyName System.IO.Compression.FileSystem
  [System.IO.Compression.ZipFile]::ExtractToDirectory($HotfixFile, $HotfixDir)

  # Install - NOTE: wusa returns immediately, before install completes, so you must check process to see when it finishes
  Get-Item "$HotfixDir\*.msu" | Foreach { wusa ""$_.FullName /quiet /norestart"" ; While (@(Get-Process wusa -ErrorAction SilentlyContinue).Count -ne 0) { Start-Sleep 3 } }

  # Reboot
  Restart-Computer
}
Else 
{
  # PHASE 2

  # Open WinRM for remote-exec
  Start-Process -FilePath "winrm" -ArgumentList "quickconfig -q"
  Start-Process -FilePath "winrm" -ArgumentList "set winrm/config/service @{AllowUnencrypted=`"true`"}" -Wait
  Start-Process -FilePath "winrm" -ArgumentList "set winrm/config/service/auth @{Basic=`"true`"}" -Wait
  Start-Process -FilePath "winrm" -ArgumentList "set winrm/config @{MaxTimeoutms=`"1900000`"}"
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49435628

复制
相关文章
HTTP、WebSocket、gRPC 或 WebRTC:哪种通信协议最适合您的应用程序?
在为您的应用程序选择通信协议时,有很多不同的选择。在本文中,我们将了解四种流行的解决方案:HTTP、WebSocket、gRPC和WebRTC。我们将通过调查其背后的技术、它的最佳用途及其优缺点来探索每个协议。
用户1418987
2023/10/16
3.2K0
HTTP、WebSocket、gRPC 或 WebRTC:哪种通信协议最适合您的应用程序?
HTTP、WebSocket、gRPC 或 WebRTC:哪种通信协议最适合您的应用程序?
在为您的应用程序选择通信协议时,有很多不同的选择。在本文中,我们将了解四种流行的解决方案:HTTP、WebSocket、gRPC和WebRTC。我们将通过调查其背后的技术、它的最佳用途及其优缺点来探索每个协议。
用户1418987
2023/10/16
1.8K0
HTTP、WebSocket、gRPC 或 WebRTC:哪种通信协议最适合您的应用程序?
在 .NET 应用程序中运行 JavaScript
前几天我在做一个副业,意识到我需要使用一些 JavaScript 功能。一想到要再次处理 Node.js 和 npm,我就完全放弃了,所以我决定研究一下在 .NET 应用程序中运行 JavaScript 的可能性。很疯狂吧?实际上,这出乎意料的简单。
独立观察员
2022/12/06
2.6K0
在 .NET 应用程序中运行 JavaScript
检查 Flutter 应用程序是否在 Web 上运行(书籍推荐)
您可以使用基础kIsWeb常量检查您的 Flutter 应用程序是否在 Web 浏览器上运行。
徐建国
2022/03/30
1.7K0
检查 Flutter 应用程序是否在 Web 上运行(书籍推荐)
gRPC: 如何在 gRPC 服务中添加 HTTP 基本验证?
本文将介绍如何在 gRPC 微服务中添加 API Auth。我们将介绍 Basic Auth,X-API-Key 两种 API Auth 模式。
尹东勋
2021/10/17
2.7K0
gRPC: 如何在 gRPC 服务中添加 HTTP 基本验证?
在WordPress 的文章或页面中运行PHP 代码
如果你在编辑器中输入PHP 代码,默认的话WordPress 不会为你执行这段代码的——只会文本方式输出。Tutsplus 上有一篇文章以插件的方式告知我们实现在WordPress 的文章或页面中运行PHP 代码的方法,下面介绍下。 原理小介绍 懂php 的都知道,PHP中载入其他PHP文件可以用include() 或者 require() 函数,因此为了实现在WordPress 的文章或页面中运行PHP 代码,我们可以将打算运行的代码写入一个额外的PHP 文件中,放在某个目录下,通过某种机制调用。英文原文
Jeff
2018/01/19
4.6K0
在WordPress 的文章或页面中运行PHP 代码
在bash中检测进程是否正在运行
比如我们启动了一个这样的进程python -m SimpleHTTPServer 8000,我们想检测这个进程是否存在,可以这样。
技术小黑屋
2018/09/04
3.6K0
在 CentOS 上使用 Jexus 托管运行 ZKEACMS
张善友
2017/05/22
2.3K0
在 CentOS 上使用 Jexus 托管运行 ZKEACMS
在CentOS上使用Jexus托管运行 ZKEACMS
ZKEACMS Core 是基于 .net core 开发的,可以在 windows, linux, mac 上跨平台运行,接下来我们来看看如何在 CentOS 上使用Jexus托管运行 ZKEACMS,通常我们在Linux部署ASP.NET Core应用,按照微软的官方文档,我们通常需要Nginx 搭配 Systemd (https://docs.microsoft.com/en-us/aspnet/core/publishing/linuxproduction), Nginx并没有接管Kestrel 进
张善友
2018/01/22
1.2K0
在CentOS上使用Jexus托管运行 ZKEACMS
gRPC在Spring Cloud中的应用
在微服务开发中,服务间的调用一般有两种方式:Feign、RestTemplate,但在实际使用过程中,尤其是Feign,存在各种限制及局限性,如:HTTP请求方式、返回类型等限制,有时会让你觉得那那都别扭。在微服务项目中,服务间的调用,是非常普遍频繁的,其性能也不是很理想。
xcbeyond
2020/04/01
5.4K0
gRPC在Spring Cloud中的应用
在Docker中使用nginx托管vue应用程序
首先,我们将使用Vue CLI生成入门Vue应用程序,我们将这个应用命名vue-nginx-docker
公众号: 云原生生态圈
2020/12/31
1.1K0
gRPC在C#中的未来属于grpc-dotnet
grpc-dotnet(Grpc.Net.Client[1]和Grpc.AspNetCore.Server[2] nuget 包)现在是.NET/C#中推荐的 gRPC 实现。最初的 gRPC C#实现(Grpc.Core nuget 包)将进入维护模式,不会得到任何新功能,只会收到重要的错误修复和安全修复。最终的计划是在未来的某个时候逐步完全淘汰 Grpc.Core。该公告描述了我们决定这样做的原因,并更详细地列出了该计划。
CNCF
2021/05/07
2.1K0
ChatGPT初体验|在 ChatGPT 中运行容器或Kubernetes?
The OpenAI API can be applied to virtually any task that involves understanding or generating natural language or code. We offer a spectrum of models with different levels of power suitable for different tasks, as well as the ability to fine-tune your own custom models. These models can be used for everything from content generation to semantic search and classification.
DevOps云学堂
2022/12/29
1.8K1
ChatGPT初体验|在 ChatGPT 中运行容器或Kubernetes?
2 - 哪里可以运行 JavaScript?
原文:https://dev.to/bhagatparwinder/where-can-i-run-javascript-995
前端黑板报
2022/04/19
1.4K0
2 - 哪里可以运行 JavaScript?
cloudbase-init用户是否可以禁用或删除
cloudbase-init是初始化程序,涉及很多功能,比如购买机器时、重装系统时、重置密码时指定的密码的生效,购买机器时、重装系统时指定的hostname的生效,购买机器时指定的userdata的生效等重要功能。
Windows技术交流
2021/09/28
4.7K0
java虚拟机可以运行的文件_虚拟机的网络模型有
类的实例(不包括局部变量与方法参数)都存储在Java堆 堆用于存储对象实例,比如通过 new创建的对象实例就保存在堆中,堆中的对象的由垃圾回收器负责回收。
全栈程序员站长
2022/09/29
8300
java虚拟机可以运行的文件_虚拟机的网络模型有
在Go中对gRPC+ProtoBuf与Http+Json进行基准测试
服务之间通信的最简单的解决方案是使用JSON over HTTP。尽管JSON具有许多明显的优点(比如它具有很好的可读性,易于理解,且通常性能良好),但它还是有一些问题的。在局域网内的数据交互,Google的Protocal Buffer这种结构编码是比JSON更好的选择。 gRPC默认使用protobuf,它更快,因为它是二进制的且是类型安全的。我编写了一个演示项目,使用JSON over HTTP与使用gRPC API的方式进行了一次基准测试。 该库包含2个相同的API:基于Protobuf的gRP
李海彬
2018/03/28
3.1K0
在Go中对gRPC+ProtoBuf与Http+Json进行基准测试
在Go中对gRPC+ProtoBuf与Http+Json进行基准测试
服务之间通信的最简单的解决方案是使用JSON over HTTP。尽管JSON具有许多明显的优点(比如它具有很好的可读性,易于理解,且通常性能良好),但它还是有一些问题的。在局域网内的数据交互,Google的Protocal Buffer这种结构编码是比JSON更好的选择。
石瞳禅
2018/09/18
1.7K0
在Go中对gRPC+ProtoBuf与Http+Json进行基准测试
讨论在 Linux Control Groups 中运行 Java 应用程序的暂停问题
本篇原文来自 LinkedIn 的 Zhenyun Zhuang,原文:Application Pauses When Running JVM Inside Linux Control Groups[1],在容器化的进程中,或多或少会给现有应用程序带来一些问题,这篇文章讲的是 LinkedIn 在使用 cgroups 构建容器化产品过程中,发现资源限制策略对 Java 应用程序性能会产生一些影响,文章深入分析问题根本原因,并给出解决方案。笔者看过后,觉得非常赞,因此翻译后献给大家,希望对大家有帮助。
涤生
2019/05/15
2.3K0
点击加载更多

相似问题

Appengine托管虚拟机部署失败

11

在HTTP1.1内核中是否可以使用gRPC?

45

是否可以在虚拟机上运行IPhone应用程序

40

在托管虚拟机的本地开发环境中运行web应用程序时出现appengine.NewContext错误

13

托管虚拟机是否可以滚动更新?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文