当前位置: 首页 > 知识库问答 >
问题:

带有。NET核心的AWS机密管理器引发套接字异常

陶朝明
2023-03-14
using System;
using System.IO;
using Amazon;
using Amazon.SecretsManager;
using Amazon.SecretsManager.Model;

namespace AssetView.Contacts.WebApi
{
    public static class SecretManager
    {
        public static string GetSecret(string secretName, string region)
        {
            //string secretName = "av/connectionstring/dev";
            // region = "us-east-1";
            string secret = "";

            MemoryStream memoryStream = new MemoryStream();

            IAmazonSecretsManager client = new AmazonSecretsManagerClient(RegionEndpoint.GetBySystemName(region));

            GetSecretValueRequest request = new GetSecretValueRequest();
            request.SecretId = secretName;
            //request.VersionStage = "AWSCURRENT"; // VersionStage defaults to AWSCURRENT if unspecified.

            GetSecretValueResponse response = null;

            // In this sample we only handle the specific exceptions for the 'GetSecretValue' API.
            // See https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html
            // We rethrow the exception by default.

            try
            {
                response = client.GetSecretValueAsync(request).Result;
            }
            catch 
            {
                throw;
            }

            // Decrypts secret using the associated KMS CMK.
            // Depending on whether the secret is a string or binary, one of these fields will be populated.
            if (response.SecretString != null)
            {
                secret = response.SecretString;
            }
            else
            {
                memoryStream = response.SecretBinary;
                StreamReader reader = new StreamReader(memoryStream);
                secret = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(reader.ReadToEnd()));
            }

            return secret;
        }
    }
}

api文档没有说太多:https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/secretsmanager/misecretsmanageretsecretvalueasyncgetsecretvaluerequestcancellationtoken.html

共有1个答案

谯灿
2023-03-14

原来ECStaskrole没有设置为获取访问机密管理器的权限!不过,错误日志有点误导人。

更新:创建am iam角色,如下所示:

Type: "AWS::IAM::Role"
Properties:
  RoleName: !Join [ '-', [my-ecsTaskrole, !Ref Environment] ]
  AssumeRolePolicyDocument:
    Version: "2012-10-17"
    Statement:
      -
        Effect: "Allow"
        Principal:
          Service:
            - "ecs-tasks.amazonaws.com" 
        Action: 
          - "sts:AssumeRole"
  Policies:
    -
      PolicyName: !Join [ '-', [mysecretmanagerpolicy, !Ref Environment] ]
      PolicyDocument:
        {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                        "secretsmanager:Describe*",
                        "secretsmanager:Get*",
                        "secretsmanager:List*"
                    ],
                    "Resource": "*",
                    "Condition": {
                        "StringEquals": {
                            "secretsmanager:ResourceTag/App": "xyz"
                        }
                    }
                }
            ]
        }

此角色只授予具有指定标记的机密,但您可以对其进行调整。

 类似资料:
  • 但这无济于事,仍然令人崩溃。 我在考虑make try{}catch返回500,并在每个过滤器中进行某种日志记录,但这将导致大量的重复。 有什么办法可以在全球范围内处理吗? MVC服务的添加方式如下:

  • 是否有任何可能的方法,我可以更新AWS秘密管理器中的密钥/值,而不必检索当前值,然后更新它们? 我找到的当前解决方案首先从secrets Manager中检索值: 但我不想检索秘密值。首选语言是Python。

  • 我使用CloudFormation模板创建了一个秘密,如下所示: 当我删除CloudFormation堆栈时,我希望秘密会以7天保留策略的“待定删除”状态存在,因为这是AWS的规定。

  • 当我为Azure开发时,我通常开始复制一些keyvault客户端代码,所以只有keyvault URL会在我的设置文件中,没有秘密会在我的git存储库中结束。 在开始制作Azure函数之后,我意识到不可能为触发器连接字符串(例如服务总线或blob存储)这样做。 推荐的方法似乎是在部署时将应用程序直接连接到Azure中的keyvault,并只在Secret Manager中本地管理机密,如本文所建议

  • .NET核心和ASP.NET核心到底有什么区别?

  • 使用Secrets Manager提供的默认代码和必要的IAM角色,我可以在我的lambda中从Secrets Manager中读取API密钥: 这个Lambda能够成功地从Secrets Manager中检索和打印API密钥。 为了与EC2实例通信,我有一个带有助手层和一些简单测试代码的Lambda: null 我想我已经把范围缩小到VPC了。第一个Lambda只是打印出秘密工作完美,直到我把它