何时应使用参数存储来保存配置,何时应使用 AppConfig?例如,如果我必须在运行时更改日志级别,是否应该将其存储在 SSM 或 Appconfig 中?
优缺点都有什么?这两者有什么区别,特别是在具有 lambda 函数的无服务器应用程序的上下文中?
app-config amazon-web-services aws-ssm aws-parameter-store aws-serverless
我将所有秘密数据保存到 AWS Parameter Store 中,我的应用程序使用 docker-compose 运行,并尝试aws ssm get-parameters在内部进行评估docker-compose.yaml:
version: "3.7"
services:
db:
image: postgres
restart: always
volumes:
- /home/ec2-user/dbdata:/var/lib/postgresql/data
environment:
POSTGRES_USER: $$(aws ssm get-parameters --name DB_USERNAME --region eu-north-1 --output text --query Parameters[].Value)
POSTGRES_PASSWORD: $$(aws ssm get-parameters --name DB_PASSWORD --region eu-north-1 --output text --with-decryption --query Parameters[].Value)
POSTGRES_DB: $$(aws ssm get-parameters --name DB_NAME --region eu-north-1 --output text --query Parameters[].Value)
ports:
- 5432:5432
auth:
build: .
restart: always
environment:
DB_ENDPOINT: $$(aws ssm get-parameters --name DB_ENDPOINT --region eu-north-1 --output …Run Code Online (Sandbox Code Playgroud) amazon-web-services docker docker-compose aws-parameter-store
背景:
我使用 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 开发者论坛帖子(现已不再可用)中提到的说明进行操作。
政策
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"ssm:GetParametersByPath",
"ssm:GetParameters",
"ssm:GetParameter"
],
"Resource": "arn:aws:ssm:eu-central-1:XXXXXXXXXX:parameter/some-root/*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "ssm:DescribeParameters",
"Resource": "*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我已将策略附加到角色中的目标账户
当我从源帐户获取参数时,它可以工作,但是我无法从目标帐户访问它们。
C:\Users\my-home>aws ssm get-parameters-by-path --path "/some-root/" --profile aws-acc-src
{
"Parameters": [
{
"Name": "/some-root/dev",
"Type": "SecureString",
"Value": "AQICAHh5z4qygT6rbxBnR/PmJn811vO30kBJNB+JrB1tdKNBeAEHFLSQDpTMsRMc1l0D8lXYAAAAYTBfBgkqhkiG9w0BBwagUjBQAgEAMEsGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM+Qmz5FoNcESEXabnAgEQgB6MdOlb545EPN61QqA50w7rH3sghmNWvxsLPPneHEA=",
"Version": 1,
"LastModifiedDate": "2020-10-06T16:03:32.637000+03:00",
"ARN": "arn:aws:ssm:eu-central-1:XXXXXXXX:parameter/some-root/dev"
}
]
}
aws ssm get-parameters-by-path --path "/some-root/" --with-decryption --profile aws-acc-src
{
"Parameters": [
{
"Name": "/some-root/dev",
"Type": "SecureString",
"Value": …Run Code Online (Sandbox Code Playgroud) 在我的第一个aws 帐户上,我按以下方式指定了参数:
/config/a => value1
/config/b => value2
/config/c/a => value31
/config/c/b => value32
Run Code Online (Sandbox Code Playgroud)
我想将这些移动到我的第二个aws 帐户。
我在参数存储中手动创建了这些参数。
如何轻松地将这些值从一个帐户复制到另一个帐户?
使用aws ssm get-parameters --names "<param-name>"会有点太困难,因为我有太多的参数。
amazon-web-services ssm amazon-systems-manager aws-parameter-store
我有一个连接到 AWS 上的 PostgreSQL 的 Spring 启动应用程序。我想将数据库配置(如数据库 URL、用户名和密码)存储在 AWS 参数存储中作为安全字符串。
我想从 AWS Parameter store 中的环境变量中访问这些参数,就像我们设置的一样:
SERVER_PORT = 5000
SPRING_DATASOURCE_PASSWORD = /dev/databases/postgresql/awsdbinstance/password
Run Code Online (Sandbox Code Playgroud)
其中/dev/databases/postgresql/awsdbinstance/password是 AWS 参数存储的名称。
我还向 EC2 实例添加了 IAM 策略以进行 SSMReadOnly 访问,但仍然无法访问这些值。我做错了什么,我怎样才能做到这一点?
另外,实现这一目标的标准方法是什么?
我不想在 YAML 文件中添加一个试图从 AWS 参数存储中检索值的属性,而是我认为如果通过 Elastic Beanstalk 环境变量本身注入该属性会更好。
amazon-web-services amazon-elastic-beanstalk aws-parameter-store
坚持使用 AWS Parameter Store 中的 SecureString。我试图将数据库密码称为:
DatabasePassword:
Type: AWS::SSM::Parameter::Value<SecureString>
NoEcho: 'true'
Default: /environment/default/database_password
Description: The database admin account password
Run Code Online (Sandbox Code Playgroud)
这会引发错误:
调用 CreateStack 操作时发生错误 (ValidationError):模板格式错误:无法识别的参数类型:SecureString
但是,如果我引用此参数String而不是SecureString它会引发不同的错误:
调用 CreateStack 操作时发生错误 (ValidationError):模板引用的参数 [/environment/default/database_password] 具有 CloudFormation 不支持的类型。
我确实尝试使用'{{resolve:ssm-secure:parameter-name:version}}',它适用于数据库配置:
MasterUsername: !Ref DatabaseUsername
MasterUserPassword: '{{resolve:ssm-secure:/environment/default/database_password:1}}'
Run Code Online (Sandbox Code Playgroud)
但是,我使用的是 AWS Fargate docker 容器,我将这些值作为环境变量提供:
Environment:
- Name: DATABASE_HOSTNAME
Value: !Ref DatabaseHostname
- Name: DATABASE_USERNAME
Value: !Ref DatabaseUsername
- Name: DATABASE_PASSWORD
Value: '{{resolve:ssm-secure:/environment/default/database_password:1}}'
Run Code Online (Sandbox Code Playgroud)
这会引发错误:
调用 CreateStack 操作时发生错误 (ValidationError):SSM Secure reference is not supported in: [AWS::ECS::TaskDefinition/Properties/ContainerDefinitions/Environment] …
以下是具有密码的docker-compose文件的片段:
test:
build: ../../
dockerfile: docker/dev/Dockerfile
volumes_from:
- cache
links:
- db
environment:
DJANGO_SETTINGS_MODULE: todobackend.settings.test
MYSQL_HOST: db
MYSQL_USER: root
MYSQL_PASSWORD: password
TEST_OUTPUT_DIR: /reports
db:
image: mysql:5.6
hostname: db
expose:
- "3386"
environment:
MYSQL_ROOT_PASSWORD: password
Run Code Online (Sandbox Code Playgroud)
在AWS环境中运行此文件,
可以在s3中使用KMS存储,另一种方法是AWS参数存储
在构建dockerfile并使用启动容器时docker-compose,如何安全地维护秘密,而又不将其公开给文本文件?任何代码段...
docker docker-compose aws-parameter-store aws-secrets-manager
所以我配置了 lambda 函数的 .yaml 文件,如下所示:
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: An AWS Serverless Specification template describing your function.
Resources:
NewUser:
Type: 'AWS::Serverless::Function'
Properties:
Handler: NewUser/index.handler
Runtime: nodejs8.10
Environment:
Variables:
database_encrypt: ${ssm:databaseEncrypt}
database_password: ${ssm:databasePassword}
database_server: '8.8.8.8'
database_user: ${ssm:databaseUser}
database_version: ${ssm:databaseVersion}
Description: ''
MemorySize: 128
Timeout: 15
Role: 'arn:aws:iam::663404525923:role/LambdaRole'
Events:
LambdaMicroservice:
Type: Api
Properties:
Path: /User/NewUser
Method: ANY
Run Code Online (Sandbox Code Playgroud)
我的 lambda 函数如下所示:
var config = {
user: process.env.database_user,
password: process.env.database_password,
server: process.env.database_server,
database: process.env.database_version,
options: {encrypt: true}
};
class UserService {
constructor(){
console.log(config); …Run Code Online (Sandbox Code Playgroud) amazon-web-services node.js aws-lambda serverless-framework aws-parameter-store
我创建了 spring boot(gradle) 应用程序,并包含了依赖项:
org.springframework.cloud:spring-cloud-starter-aws-parameter-store-config.
我想用来AWSSimpleSystemsManagement从 AWS 参数存储中读取配置,但我被迫这样写(在 aws 中):
config/application_dev/server.port: 8080
Run Code Online (Sandbox Code Playgroud)
有什么办法可以从spring boot中读取这样的内容: dev.application.server.port:8080
目前我认为所有这些都是通过自动配置管理的,有没有办法覆盖它
java spring amazon-web-services spring-boot aws-parameter-store
aws-ssm ×2
docker ×2
amazon-iam ×1
app-config ×1
aws-lambda ×1
java ×1
node.js ×1
spring ×1
spring-boot ×1
ssm ×1
terraform ×1