背景:
我使用 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
背景:
我正在使用 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 项目中定义的环境变量:
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 …
我正在使用 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) 问题:
当我尝试使用 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)
背景:
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)
使用 Terraform 重现:
module "airflow_aws_resources" {
source = "github.com/marshall7m/tf_modules/airflow-aws-resources"
resource_prefix = "test" …Run Code Online (Sandbox Code Playgroud) 我正在使用 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) 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
地形==0.12.28
目标是从上游目录继承 terraform .tf 文件。我一直在关注这个存储库,它表明只需在 .tf 文件中声明相对上游文件路径即可。虽然当我跑步时
terraform init仅在 cwd 内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) 我正在尝试通过 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。
EC2实例配置
\n平台:亚马逊Linux
\nAMI:ami-0841edc20334f9287
\n实例类型:t2.micro
\n公共 IPv4:关联的弹性 IPv4
\nEC2实例关联的VPC子网配置:
\n路由表:(目的地 - 目标)
\n10.0.0.0/24 - local
0.0.0.0/0 - igw-...
ACL:(类型 - 协议 - 端口范围 - 源)
\n入境
\nSSH - TCP - 22 - 0.0.0.0/0
出境
\nHTTPS - TCP - 443 - 0.0.0.0/0
安全组:(类型 - 协议 - …
目标使用 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) terraform ×4
aws-glue ×2
python-3.x ×2
amazon-ec2 ×1
amazon-vpc ×1
aws-sdk ×1
aws-ssm ×1
bash ×1
docker ×1
pyspark ×1
ssh ×1