gpt4 book ai didi

amazon-web-services - 在资源部分映射用户数据

转载 作者:行者123 更新时间:2023-12-03 07:15:01 25 4
gpt4 key购买 nike

我正在尝试使用 AWS cloudformation。对于此模板,我尝试将用户数据链接到参数 selectAMI。如果选择 AmazonLinux2,脚本将安装 httpd。如果选择 UbuntuServer,脚本将安装 apache2

所以,显然两者的脚本是不同的。我尝试在有条件的情况下实现此功能,请参阅下面的 YAML 脚本

---
Mappings :
mapAMI :
AmazonLinux2 :
AMI : ami-090fa75af13c156b4

UbuntuServer :
AMI : ami-052efd3df9dad4825

mapUserData :
AmazonLinux2 :
Data : |
#!/bin/bash -xe
sudo yum update -y
sudo yum install httpd
sudo systemctl start httpd
sudo systemctl enable httpd.service
echo "User Data executed successfully and installed HTTPD" > AmazonLinux2.txt

UbuntuServer :
Data : |
sudo #!/bin/bash -xe
sudo apt update && sudo apt upgrade
sudo apt install apache2
sudo systemctl start apache2
sudo systemctl enable apache2.service
echo "User Data executed successfully and installed apache2" > UbuntuServer.txt

Parameters :
selectAMI :
Description : Select the operating system or machine image for the instance. Amazon linux 2 or Ubuntu
AllowedValues :
- AmazonLinux2
- UbuntuServer
Type : String

Conditions :
IsAmiUbuntu :
!Equals [!Ref selectAMI, UbuntuServer]

Resources :
EC2Instance :
Type : AWS::EC2::Instance
Properties:
UserData :
Fn::Base64 :
Fn::Sub :
!If [IsAmiUbuntu, !FindInMap [mapUserData, UbuntuServer, Data], !FindInMap [mapUserData, AmazonLinux2, Data]]
...

当我尝试验证模板时,我遇到了 ValidationError - 模板错误:一个或多个 Fn::Sub 内部函数未指定预期参数。指定一个字符串作为第一个参数,并指定一个可选的第二个参数来指定要在字符串中替换的值的映射

请帮助我了解如何正确映射用户数据,以便在创建 EC2Instance 时安装 httpdapache2

最佳答案

各位程序员/爱好者,

感谢@Paolo。

以下是我遇到的一些问题以及问题的解决方案。

  1. 为什么 userdata 没有执行?

事实证明,用户数据中缺少 -y 标志。因此,执行停止了,因为它无限期地等待用户输入。以下是代码中更新的映射部分片段。即使安装了 HTTPD 或 Apache2,最后一行的 .txt 文件也不会创建,或者它们是在不同的位置创建的。

Mappings :
mapAMI :
AmazonLinux2 :
AMI : ami-090fa75af13c156b4

UbuntuServer :
AMI : ami-052efd3df9dad4825

mapUserData :
AmazonLinux2 :
Data : |
#!/bin/bash
sudo yum update -y
sudo yum install -y httpd
sudo systemctl start httpd
sudo systemctl enable httpd.service
echo "User Data executed successfully and installed HTTPD" > ~/AmazonLinux2.txt
UbuntuServer :
Data : |
#!/bin/bash
sudo apt update && sudo apt upgrade -y
sudo apt install -y apache2
sudo systemctl start apache2
sudo systemctl enable apache2.service
echo "User Data executed successfully and installed apache2" > ~/UbuntuServer.txt
  • 如何在资源部分映射用户数据?
  • 我们需要记住,我们不会替换任何变量。所以Fn::Sub是完全没有必要的。由于我们使用两个函数来映射(Fn::Base64 和 Fn::If),其中一个函数必须是完整形式,另一个可以是缩写形式。检查 documentation 中的注释部分.

    这是实现的代码片段。

    Conditions : 
    AmIUbuntu :
    !Equals [!Ref selectAMI, UbuntuServer]

    Resources :
    EC2Instance :
    Type : AWS::EC2::Instance
    Properties:
    UserData :
    Fn::Base64 :
    !If [AmIUbuntu, !FindInMap [mapUserData, UbuntuServer, Data], !FindInMap [mapUserData, AmazonLinux2, Data]]

  • 我还学到了什么?
  • 检查日志文件。当 userdata 执行时,AWS 会记录它。正确执行没有问题,否则检查cloud-init-output.log文件并解码并解决问题。

    运行以下命令来cat日志文件。

    sudo cat/var/log/cloud-init-output.log

    使用 AmazonLinux2 时,YUM 通过 HTTPS 协议(protocol)访问亚马逊的 yum 存储库。因此,请确保在安全组中提供出站 HTTPS 规则。

    允许入站 SSH 规则设置 EC2 实例连接。 EC2 实例连接不仅适用于 amazon Linux,还适用于 ubuntu。

    查看模板 validator 。谨慎使用!

    有兴趣查看我的完整代码吗? Click here

    关于amazon-web-services - 在资源部分映射用户数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73368654/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com