简体   繁体   中英

AWS CDK look up ARNs from lambda

I am quite new to AWS and have a maybe easy to answer question.

(I am using localstack to develope locally, if this makes any difference)

In a lambda, I got the following code, which should publish a message to an aws-sns.


def handler(event, context):
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.INFO)
    logger.info("confirmed user!")

    notification = "A test"

    client = boto3.client('sns')
    response = client.publish(
        TargetArn="arn:aws:sns:us-east-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        Message=json.dumps({'default': notification}),
        MessageStructure='json'
    )
    return {
        'statusCode': 200,
        'body': json.dumps(response)
    }


For now I "hardcode" the ARN of the sns topic which is output to console when deploying (with cdklocal deploy ).

I am wondering, if there is any convenient way, to lookup the ARN of a AWS ressource? I have seen, there is the

 cdk.Fn.getAtt(logicalId, 'Arn').toString();

function, but I don't know the logicalID of the sns before deployment. So, how can I lookup ARNs during runtime? What is best practice?

(It's a quite annoying task keeping track of all the ARNs if I just hardcode them as strings, and definitly seems wrong to me)

You can use the !GetAtt function in your CloudFormation template to retrieve and pass your SNS topic ARN to to your Lambda.

Resources:
  MyTopic:
    Type: AWS::SNS::Topic
    Properties:
      {...}
  MyLambda:
    Type: AWS::Lambda::Function
    Properties:
      Environment:
        Variables:
          SNS_TOPIC_ARN: !GetAtt MyTopic.Arn

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM