何时应使用参数存储来保存配置,何时应使用 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 …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
要重现该问题:
创建系统管理器参数存储变量(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"
}
buildspec.yml具有以下内容:(修改为创建 .tf 文件而不是从 github 采购)
version: 0.2 …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": "*"
        }
    ]
}
我已将策略附加到角色中的目标账户
当我从源帐户获取参数时,它可以工作,但是我无法从目标帐户访问它们。
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": …在我的第一个aws 帐户上,我按以下方式指定了参数:
/config/a => value1
/config/b => value2
/config/c/a => value31
/config/c/b => value32
我想将这些移动到我的第二个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 
其中/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
这会引发错误:
调用 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}}'
但是,我使用的是 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}}'
这会引发错误:
调用 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
在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
我的 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); …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
有什么办法可以从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