Search code examples
amazon-web-servicesaws-lambdaamazon-snsaws-cdklocalstack

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)


Solution

  • 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