小编Mar*_*llm的帖子

传递 AWS 系统管理器参数存储变量时 Terraform AWS 提供商凭证无效

背景:

我使用 AWS CodeBuild buildspec.yml 迭代 GitHub 存储库中的目录,以使用 Terraform 应用 IaC。为了访问 Terraform AWS 提供商所需的凭证,我使用 AWS 系统管理器参数存储来检索 buildspec.yml 中的访问权限和密钥。

问题:

系统管理器参数存储屏蔽了访问权限和密钥环境值,因此当 Terraform AWS 提供程序继承它们时,提供程序会输出凭证无效:

Error: error configuring Terraform AWS Provider: error validating provider credentials: error calling sts:GetCallerIdentity: InvalidClientTokenId: The security token included in the request is invalid.
    status code: 403, request id: xxxx
Run Code Online (Sandbox Code Playgroud)

要重现该问题:

  • 创建系统管理器参数存储变量(TF_VAR_AWS_ACCESS_KEY_ID=访问权限,TF_AWS_SECRET_ACCESS_KEY=秘密)

  • 使用以下命令创建 AWS CodeBuild 项目:

 "source": {
                "type": "NO_SOURCE",
}
"environment": {
                "type": "LINUX_CONTAINER",
                "image": "aws/codebuild/standard:4.0",
                "computeType": "BUILD_GENERAL1_SMALL"
}
Run Code Online (Sandbox Code Playgroud)

buildspec.yml具有以下内容:(修改为创建 .tf 文件而不是从 github 采购)

version: 0.2 …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services terraform aws-codebuild aws-parameter-store

9
推荐指数
2
解决办法
3万
查看次数

AWS CodeBuild buildspec bash 语法错误:错误替换 if 语句

背景:

我正在使用 AWS CodeBuild buildspec.yml 迭代 GitHub 存储库中的目录。在循环目录路径之前$TF_ROOT_DIR,我使用 bash if 语句来检查 GitHub 分支名称是否$BRANCH_NAME在环境变量内$LIVE_BRANCHES。正如您在下面的错误屏幕截图中看到的,bash if 语句输出错误:syntax error: bad substitution。当我在本地 bash 脚本中重现 if 语句时,if 语句按预期工作。

以下是 CodeBuild 项目中定义的环境变量:

环境 以下是 buildspec.yml 中的相关片段:

version: 0.2
env:
  shell: bash
phases:
  build:
    commands:
      - |
        if [[ " ${LIVE_BRANCHES[*]} " == *"$BRANCH_NAME"* ]]; then
          # Iterate only through BRANCH_NAME directory
          TF_ROOT_DIR=${TF_ROOT_DIR}/*/${BRANCH_NAME}/
        else
          # Iterate through both dev and prod directories
          TF_ROOT_DIR=${TF_ROOT_DIR}/*/
        fi
      - echo $TF_ROOT_DIR
Run Code Online (Sandbox Code Playgroud)

这是显示语法错误的构建日志:

在此输入图像描述

以下是用于重现 CodeBuild …

bash amazon-web-services aws-codebuild

7
推荐指数
1
解决办法
1万
查看次数

在 docker 容器中配置 Pyspark AWS 凭证

我正在使用 Docker 通过 pyspark 开发本地 AWS 粘合作业。Song_data.py 文件包含 AWS 胶水作业。我使用我的 AWS 凭证配置了 Spark 会话,但下面的错误表明情况并非如此。在该文件中,我使用粘合上下文方法设置了 4 个不同的 try 语句来创建动态框架。这是粘合作业文件 (song_data.py):

from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark import SQLContext
from pyspark.sql import SparkSession
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from configparser import ConfigParser
from pyspark import SparkConf

config = ConfigParser()
config.read_file(open('/app/config/aws.cfg'))

conf = (
    SparkConf()
        .set('spark.hadoop.fs.s3a.access.key', config.get('AWS', 'KEY'))
        .set('spark.hadoop.fs.s3a.secret.key', config.get('AWS', 'SECRET'))
        .set("fs.s3.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
)

sc = SparkContext(conf=conf)
spark = SparkSession(sc)
glueContext = …
Run Code Online (Sandbox Code Playgroud)

python-3.x docker pyspark aws-glue

5
推荐指数
0
解决办法
2654
查看次数

AWS System Manager 启动会话:调用 StartSession 操作时发生错误 (TargetNotConnected):<instance_id> 未连接

问题:

当我尝试使用 AWS System Session Manager CLI 命令在本地连接到正在运行的 EC2 实例时: aws ssm start-session --target i-123456

我收到错误:

An error occurred (TargetNotConnected) when calling the StartSession operation: i-123456 is not connected.
Run Code Online (Sandbox Code Playgroud)

背景:

  • Linux 2 实例托管在自定义 VPC 内的私有子网上
  • VPC端点用于将 System Manager 连接到托管实例,无需 NAT GW 或 IGW。
  • 端点服务名称:
com.amazonaws.us-west-2.s3
com.amazonaws.us-west-2.ec2
com.amazonaws.us-west-2.ec2messages
com.amazonaws.us-west-2.ssm
com.amazonaws.us-west-2.ssmmessages
Run Code Online (Sandbox Code Playgroud)
  • AWS CLI == 2.0.40
  • Python == 3.7.4
  • 自定义 Terraform 模块以在私有子网之一内启动气流实例(请参阅下面的模块“airflow_aws_resources”)
  • 唯一.tf文件,这将是有关这个问题将是airflow.tf模块“airflow_aws_resources”内。此文件包含通过 SSM 连接的 EC2 实例的安全组和实例配置文件配置。

使用 Terraform 重现:

module "airflow_aws_resources" {
  source                      = "github.com/marshall7m/tf_modules/airflow-aws-resources"
  resource_prefix             = "test" …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-vpc aws-ssm

5
推荐指数
3
解决办法
1万
查看次数

在 docker 容器中运行 AWSglue 作业输出“com.amazonaws.SdkClientException:无法连接到服务端点:”

我正在使用 Docker 开发本地 AWS 胶水作业(使用 pyspark)。我有一个 python 文件 (song_data.py),其中包含使用 GlueContext 类的 awsglue 作业。当我在容器终端中运行gluesparksubmit glue_etl_scripts/song_data.py --JOB-NAME test以执行粘合作业脚本时,出现以下错误:

20/06/24 02:12:54 WARN EC2MetadataUtils: Unable to retrieve the requested metadata (/latest/dynamic/instance-identity/document). Failed to connect to service endpoint: 
com.amazonaws.SdkClientException: Failed to connect to service endpoint: 
        at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:100)
        at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:70)
        at com.amazonaws.internal.InstanceMetadataServiceResourceFetcher.readResource(InstanceMetadataServiceResourceFetcher.java:75)
        at com.amazonaws.internal.EC2ResourceFetcher.readResource(EC2ResourceFetcher.java:66)
        at com.amazonaws.util.EC2MetadataUtils.getItems(EC2MetadataUtils.java:402)
        at com.amazonaws.util.EC2MetadataUtils.getData(EC2MetadataUtils.java:371)
        at com.amazonaws.util.EC2MetadataUtils.getData(EC2MetadataUtils.java:367)
        at com.amazonaws.util.EC2MetadataUtils.getEC2InstanceRegion(EC2MetadataUtils.java:282)
        at com.amazonaws.regions.InstanceMetadataRegionProvider.tryDetectRegion(InstanceMetadataRegionProvider.java:59)
        at com.amazonaws.regions.InstanceMetadataRegionProvider.getRegion(InstanceMetadataRegionProvider.java:50)
        at com.amazonaws.regions.AwsRegionProviderChain.getRegion(AwsRegionProviderChain.java:46)
        at com.amazonaws.services.glue.util.EndpointConfig$.getConfig(EndpointConfig.scala:42)
        at com.amazonaws.services.glue.util.AWSConnectionUtils$.<init>(AWSConnectionUtils.scala:36)
        at com.amazonaws.services.glue.util.AWSConnectionUtils$.<clinit>(AWSConnectionUtils.scala)
        at com.amazonaws.services.glue.GlueContext.getCatalogSource(GlueContext.scala:152)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at …
Run Code Online (Sandbox Code Playgroud)

python-3.x aws-sdk aws-glue aws-glue-spark

4
推荐指数
1
解决办法
3962
查看次数

在 terraform 中格式化具有多个值的字符串

Terraform 版本 = .12+

我想知道是否有一种方法可以格式化具有多个值的单个字符串。

我尝试过使用 terraform format 函数,如下所示:

bucket = format("%-%", 'dev', "test")
bucket = format("%-%", ['dev', "test"])
Run Code Online (Sandbox Code Playgroud)

两者都输出错误:

Call to function "format" failed: unrecognized format character '%' at offset
2.
Run Code Online (Sandbox Code Playgroud)

预期的格式化值将是dev-test

string-formatting terraform terraform0.12+

3
推荐指数
1
解决办法
4849
查看次数

从父目录继承 terraform .tf 文件

地形==0.12.28

目标是从上游目录继承 terraform .tf 文件。我一直在关注这个存储库,它表明只需在 .tf 文件中声明相对上游文件路径即可。虽然当我跑步时

  1. terraform init仅在 cwd 内
  2. terraform init在父目录中,然后在 cwd 中

两次尝试都会输出错误:

Error: Argument or block definition required

on shared_data.tf line 1:
   1: ../../shared_data.tf
Run Code Online (Sandbox Code Playgroud)

为了解决这个错误,我尝试使用 terraform 变量首先定义相对路径:

variable "shared_data_path" {
    default = "../../shared_data.tf"
}
var.shared_data_path
Run Code Online (Sandbox Code Playgroud)

输出错误:

Error: Argument or block definition required

  on shared_data.tf line 4:
  4: var.shared_data_path

An argument or block definition is required here. To set an argument, use the
equals sign "=" to introduce the argument value.
Run Code Online (Sandbox Code Playgroud)

terraform

2
推荐指数
1
解决办法
2700
查看次数

aws ec2 ssh 错误:`ssh:连接到主机 x 端口 22:操作超时`

我正在尝试通过 SSH 连接到 EC2 实例。当我尝试连接到实例时,使用ssh -i "test.pem" ec2-user@xx.xx.xx.xx我收到错误:ssh: connect to host xx.xx.xx.xx port 22: Operation timed out

\n

EC2实例配置

\n

平台:亚马逊Linux

\n

AMI:ami-0841edc20334f9287

\n

实例类型:t2.micro

\n

公共 IPv4:关联的弹性 IPv4

\n

EC2实例关联的VPC子网配置:

\n

路由表:(目的地 - 目标)

\n

10.0.0.0/24 - local

\n

0.0.0.0/0 - igw-...

\n

ACL:(类型 - 协议 - 端口范围 - 源)

\n

入境

\n

SSH - TCP - 22 - 0.0.0.0/0

\n

出境

\n

HTTPS - TCP - 443 - 0.0.0.0/0

\n

安全组:(类型 - 协议 - …

ssh amazon-ec2 amazon-web-services

2
推荐指数
1
解决办法
5044
查看次数

迭代字典列表以创建具有不同值的地形资源

目标使用 terraform 创建两个aws_athena_named_query资源。每个查询的配置在单独的字典中定义。所有查询字典都嵌套在一个列表中(请参阅query_dict变量)。

variable query_dict {
    default = [
        {
            name = "query1"
            workgroup = "bar"
            query = "SELECT * FROM foo"   
        },
        {
            name = "query2"
            workgroup = "bar"
            query = "SELECT * FROM baz"   
        }
    ]
}

resource "aws_athena_named_query" "olap" {
  for_each = toset([for query in var.query_dict: {
            name   = query.name
            workgroup = query.workgroup
            query = query.query}])
  name = each.value.name
  query = each.value.query
  database = "test"
  workgroup = each.value.workgroup
}
Run Code Online (Sandbox Code Playgroud)

这会导致错误:

The given …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services terraform terraform0.12+

1
推荐指数
1
解决办法
1万
查看次数