cloudformation中一个Elasticache集群的参考文献

Reference arn of a Elasticache cluster in cloudformation

我想在云形成模板中引用“即将创建的”Redis ElastiCache 集群的 arn。
这是 ElasticacheCluster 模板(在 cloudFormation 中测试和工作)

ElasticacheCluster:
Type: AWS::ElastiCache::CacheCluster
Properties:
  AutoMinorVersionUpgrade: 'true'
  Engine: redis
  CacheNodeType: cache.t2.micro
  NumCacheNodes: '1'
  VpcSecurityGroupIds:
  - Fn::GetAtt:
    - ElastiCacheSecurityGroup
    - GroupId
  CacheSubnetGroupName:
    Ref: ElastiCacheSubnetGroup

我削减了子网组和安全组等其他人员,因为它在这里也不相关。我应该在这里使用我正在尝试的访问策略向另一个资源授予对集群的访问权限:

AccessPolicies:
    Version: '2012-10-17'
    Statement:
    - Effect: Allow
      Principal:
        AWS: "*"
      Action: es:*
      Resource: !GetAtt ElasticacheCluster.Arn
    - Effect: Allow
      Principal:
        AWS: "*"
      Action: es:*
      Resource: !GetAtt ElasticacheCluster.Arn
      Condition:
        IpAddress:
          aws:SourceIp: 0.0.0.0/0

我看到了这个:

the !GetAtt ElasticacheCluster.Arn for the resource entry

但在这种情况下似乎不起作用,因为 !GetAtt 正在返回一组固定的属性,而 ARN 不是其中之一(正如@Anton 在评论中所建议的那样。

我还看到 this other question 可以解决问题,但我更喜欢不依赖于区域和帐户 ID 之类的非硬编码解决方案。
问题的解决方案似乎很简单,但我正在努力寻找一个干净的答案。

正如安东所说,GetAtt 仅具有您可以获得的某些属性。另外,!Ref 将 return logical ID of the resource. Have you thought about trying to use the User and/or the UserGroup 资源来完成你想要的?

我从@multiscup 的回答和问题中引用的 one 中获得灵感。
这种方法远非干净,我正在等待更好的答案,但至少它是有效的。 主要思路是构造arn需要的字符串:

arn:aws:elasticache:region:account-id:cluster:resource-name

为此,我使用连接尝试动态获取元素,这要归功于 built-in CloudFormation 函数:

Resource: !Join 
        - ':'
        - - 'arn:aws:elasticache' 
          - !Ref 'AWS::Region'
          - '<your-account-id>'
          - 'cluster'
          - !FindInMap [Elasticache, Redis, cluster-name]

我使用 Map 来定义 Redis-cluster 因为我在 CloudFormation 模板的其他点也使用了相同的值。也许您也可能会发现拥有地图会有所帮助

Mappings: 
  Elasticache: 
    Redis:
      cluster-name: redis-demo