AWS экспортирует имя DynamoDB в Python - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь создать таблицу DynamoDB, не имея свойства name в файле .yml, чтобы его имя формировалось в облаке, и экспортировать его имя в python для доступа. Могу ли я это сделать, если да, то как?

Моя текущая идея - экспортировать имя как параметр ssm, но я не знаю, как.

Ответы [ 4 ]

0 голосов
/ 20 февраля 2019

Вот как я это сделал: Python:

ssm = boto3.client('ssm')
resp = dict(ssm.get_parameter(Name='TableName', WithDecryption=False))
tableName = str(json.loads(json.dumps(resp['Parameter'],default=str))['Value'])

Это мой yaml-файл с облачной информацией:

Resources:
  DynamoTable:
    Type: "AWS::DynamoDB::Table"
      Properties:
        AttributeDefinitions:
          - AttributeName: A_Key
            AttributeType: "S"
          - AttributeName: Serial
            AttributeType: "S"
        KeySchema:
          - AttributeName: A_Key
            KeyType: HASH
          - AttributeName: Serial
            KeyType: RANGE
  DynamoTableParameter:
    Type: "AWS::SSM::Parameter”
    Properties:
      Name: "TableName”
      Type: String
      Value: !Ref DynamoTable
0 голосов
/ 19 февраля 2019

Я предполагаю, что ваш вопрос связан с AWS CloudFormation, поскольку вы упоминаете файл .yml.

Вы можете сообщить имя в разделе вывода вашего шаблона облачной информации, если ваша функция python объявлена ​​в другом шаблоне.Затем вы можете использовать describe-stack API или CLI для получения значения из вывода.

См .: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html и https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html

Если ваша функция python объявлена ​​втот же шаблон, вы можете просто обратиться к своему логическому ресурсу, чтобы получить имя (согласно https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html)

Например,

Раздел, который создает таблицу

MyTable:
    Type: AWS::DynamoDB::Table
    Description: your decsriptions
    Properties:
       ... your properties ...

Раздел, который ссылается на него (здесь приведен пример с AWS::AppSync::DataSource, но он применяется к любому типу ресурсов

MyTableDataSource:
    Type: AWS::AppSync::DataSource 
    Properties:
      ...
      DynamoDBConfig:
        TableName:
          Ref: MyTable
        AwsRegion:
          Fn::Sub: ${AWS::Region}

или для получения таблицы ARN в политике IAM

  Policies:
  - PolicyName: mypolicy
    PolicyDocument:
      Version: 2012-10-17
      Statement:
      - Effect: Allow
        Action:
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:DeleteItem
        - dynamodb:UpdateItem
        - dynamodb:Query
        - dynamodb:Scan
        Resource:
        - Fn::Join:
          - ''
          - - Fn::GetAtt:
              - MyTable
              - Arn
            - '*'
0 голосов
/ 19 февраля 2019

Согласно вашему ответу на мой комментарий, вы хотите добавить таблицу DynamoDB в файл yml.Если таблица и лямбда находятся в одном и том же .yml, вы можете просто сделать! Ref YourTable внутри переменных Lambda Environment.

Примерно так:

YourLambda:
  Type: AWS::Serverless::Function
  Properties:
    Environment:
      Variables:
        YourTableName: !Ref YourTable

Вы такженеобходимо добавить политику, присоединенную к лямбде, в Свойства -> Политики, и вы можете ссылаться на имя таблицы там же.

Однако, если вы хотите ссылаться на имя, не перемещая экземпляр DynamoDB внутриФайл .yml, тогда вам нужно сделать его статической ссылкой, сделав запись в хранилище параметров, а затем сослаться на нее следующим образом (убедившись, что ваш CFN имеет доступ к ssm: getParameter):

YourLambda:
  Type: AWS::Serverless::Function
  Properties:
    Environment:
      Variables:
        YourTableName: '{{resolve:ssm:/PATH/TO/TABLENAME:1}}'
0 голосов
/ 19 февраля 2019

Вы можете пометить его в шаблоне облачной информации и получить ресурсы по тегу в boto.

import boto3

client = boto3.client('rds')

custom_filter = [{
    'Name':'tag:Owner', 
    'Values': ['user@example.com']}]

response = client.describe_instances(Filters=custom_filter)

(Этот код в основном скопирован с https://stackoverflow.com/a/48073016/10553976)

И это будет соответствовать тегированиюэкземпляры со следующим:

Tags: 
  - 
    Key: "Owner"
    Value: "user@example.com"

Важно: если вы хотите применить теги к чему-то другому, чем экземпляры, вам нужно будет использовать метод, отличный от методов describe в клиенте rds.

...