0

Amazon CloudFormationとSwaggerを使用したAWSラムダとAPIゲートウェイの導入を自動化しようとしています。これに向けて、APGatewayに必要なラムダやその他のリソース(エンドポイントを含む)を作成するCloudFormationテンプレートを作成しました。外部スワッガーファイルからAPI定義をインポートして、同じCloudFormationテンプレートを複数のラムダとAPIGatewayで使用できるようにしたいと考えています。 CloudFormationテンプレートによって作成されたラムダのARNを、API定義を保持する外部スワッガーファイル(同じCloudFormationテンプレート内で参照される)に参照する方法はありますか?CloudFormationからSwaggerへのARNリファレンスの受け渡し

闊歩内容:私は雲の形成テンプレートから動的にURIの値を交換する必要が上記の統合方法で

"x-amazon-apigateway-integration": { 
       "uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:TestSimpleProxy/invocations", 
       "passthroughBehavior": "when_no_match", 
       "httpMethod": "POST", 
       "type": "aws_proxy" 
      } 

私の雲の形成のスクリプトは以下の通りです:

"myApi":{ 
     "Type" : "AWS::ApiGateway::RestApi", 
     "Properties" : { 
     "BodyS3Location" : S3Location of the swagger definition file, 
     .., 
     .. 
     } 
    } 

答えて

0

は、あなたのCloudFormationテンプレートの"x-amazon-apigateway-integration"一部ですか?

もしそうなら、https://blog.jayway.com/2016/09/18/introduction-swagger-cloudformation-api-gateway/の例に続いて、私はRef関数を使ってその情報を渡すことができると思います。

私はちょうど同じ障害物に遭遇した
+0

応答に感謝します。参照されている例は、雲の形成テンプレート自体にスワッガー定義をハードコードしている場合にのみ機能します。それを外部ファイルからインポートしようとすると。無効なARNエラーが発生しています。 –

+0

エラーを示すCloudFormationテンプレートの完全な例を共有できますか? –

0

...これはませ単純な答えですが、回避策は、あなたが闊歩テンプレートで使用するをしたいラムダARNの解像度を自動化します。それは私のために働いています。ここでは、あなたのラムダ作成し、後で例えば闊歩テンプレートで使用したいCFテンプレートに...

  1. エクスポートラムダARNを行きます

    Outputs: 
        MyLambdaARN: 
        Value: !Ref "LambdaFuncThatIsDefinedInTheTemplate" 
        Export: 
         Name: !Sub "${AWS::StackName}-LambdaARN" 
    
  2. 闊歩テンプレート内ラムダARNエクスポートを参照してください - "たとえば、ステップ1からのエクスポート名を含ん交換可能なトークンを入力して、あなたのラムダためARNの代わりにステップ1のスタックが「MyLambdaStack」として作成された場合は、「MyLambdaStack-LambdaARN」となります。トークン構文について

    • ImportValue function、我々はは、実際に働いていた希望ものを使用してみましょうので、私たちのトークンが!ImportValue(MyLambdaStack-LambdaARN)になります。当社闊歩テンプレート内では、統合の拡張子は次のように私たちのトークンを使用しています
    • x-amazon-apigateway-integration: 
          passthroughBehavior: "when_no_match" 
          uri: "!ImportValue(MyLambdaStack-LambdaARN)" 
          httpMethod": "POST" 
          type: "AWS-PROXY" 
      
  3. 実際のラムダARNとトークンの置き換え - 私たちは!ImportValue(MyLambdaStack-LambdaARN)トークンを交換するには、次のスクリプトを使用します実際のLambda ARNと一緒にそこに必要です。ここで

    #!/bin/bash 
    SWAGGER_FILE=$1 
    
    REPLACEMENTS=$(\ 
        aws cloudformation list-exports --query 'Exports[*].[Name,Value]'\ 
        | awk '{print "s/!ImportValue(" $1 ")/" $2 "/g"}' ORS='; '\ 
    ) 
    
    sed "$REPLACEMENTS" "$SWAGGER_FILE" 
    

    は、このスクリプトは

    1. だけ--query 'Exports[*].[Name,Value]'引数
    2. とエクスポート名と値を文字列として輸出をフォーマットするaws cloudformation list-exports
    3. フィルタを使用して、スタックの輸出のリストをグラブを何ですトークン値を実際のエクスポート値に置き換えるsed置換の数awk '{print "s/!ImportValue(" $1 ")/" $2 "/g"}' ORS='; '
    4. 最後に、012を使用しますを使用して、スワッガーファイル内の置換をスクリプトの最初の引数として渡します。たとえば、

    次のようにあなたがそれを呼び出すことができresolve-arns.shとして、あなたは、このスクリプトを作成した場合:

    ./resolve-arns.sh swagger.yml > resolved-swagger.yml 
    
  4. リファレンスを解決闊歩定義が - 最後に、あなたがresolved-swagger.ymlファイルを参照したいですあなたのAPIを作成するために使用しているCFテンプレートBodyS3Location: resolved-swagger.yml

警告:もちろん

  1. awsコマンドラインツールが利用可能である必要があり、この実装は、AWSのリージョン引数を処理するのに十分な洗練されていません
  2. を設定し...しかし、そのために変更することができます
  3. これはbashスクリプトです... Windowsのような別のOSを使用している場合は、同じアプローチが有効です。私はおそらくpowershellで始めるだろう...)
1

のアプローチが別です。 BodyS3Locationの代わりにBodyプロパティを使用してAWS::ApiGateway::RestApiを使用する場合は、Cloud Formation Instrinsic Functionsを使用して、スガッガテンプレートで必要なARNを参照するか、動的に構築します。

...もちろん、あなたのswaggerテンプレートは、別のファイルではなくCFスクリプトに埋め込まれています。

4

新ソリューション:

CloudFormationテンプレートから直接アップロードテンプレートを参照するために新しいAWS::Include Transformを使用できるようになりました:

ArtifactsBucketはあなたが闊歩をアップロードバケットを指し
Api: 
    Type: AWS::ApiGateway::RestApi 
    Properties: 
    Body: 
     Fn::Transform: 
     Name: AWS::Include 
     Parameters: 
      Location: !Sub s3://${ArtifactsBucket}/swagger.yaml 

スペックを作成または更新する前に次に、Swaggerテンプレート自体に、組み込み関数を使用することができます。ここで

x-amazon-apigateway-integration: 
    type: aws_proxy 
    httpMethod: POST 
    uri: 
    Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${LambdaFunction.Arn}/invocations 

SWAGGERがネイティブ後者をサポートしていないので、私は、代わりにちょうど!Subの長いFn::Sub表記を使用していますし、またAWS::Include上のドキュメントを変換するのでは速記形式はまだサポートされていないことを言います。

SAMを使用する場合は、AWS::Serverless::ApiDefinitionBodyを使用することもできます。

旧回避策:

別の(ややハック、シンプルな)ソリューションCloudFormationテンプレートの最後のリソースとしてAPIをリストアップし、最後に: !Sub |-ボディを指定することです。

このテンプレートを実際のSwaggerファイルと連結し、そのファイルの標準${}構文を使用してパラメータを参照できます。

YAMLを使用しているときにSwaggerファイルを正しくインデントする必要があります(このアプローチはJSONテンプレートでは機能しませんが、Bodyをjqのように置き換える必要があります)これらを使用する場合)。

+1

あなたがリンクしている公式文書は、ほとんど言わないことを理解するのが難しいです。明確な例をありがとう。 –

関連する問題