質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

2回答

3744閲覧

Serverless Framework v3のデプロイが失敗する原因について【Python3.9】

yuta1989

総合スコア65

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2022/07/16 10:29

編集2022/07/19 17:19

デプロイコマンド

sls deploy \ --verbose \ --force \ --region $region \ --region_type ${REGION_TYPE[$i]} \ --stage $STAGE \ --alias $API_ENV \ --test_app_name $TEST_APP_NAME \ --test_main_region $TEST_MAIN_REGION \ --test_sub_region $TEST_SUB_REGION \ --test_domain $TEST_DOMAIN \ --nr_account_id $NR_ACCOUNT_ID

エラー

Error: Cannot resolve serverless.yml: Variables resolution errored with: - Cannot resolve variable at "provider.environment.API_ENV": Value not found at "self" source

環境

Python3.9.10
Serverless Framework v3 (serverless@3.19.0)

デプロイコマンド(sls deploy)を実行したらエラーが出ました。
修正が必要な箇所を教えていただけると嬉しいです。

エラーが出ている箇所はserverless.yml の

API_ENV: ${self:provider.alias}

の部分です。
serverless-aws-aliasというプラグインを使用して、現在デプロイされているエイリアスを${self:provider.alias}で参照しているようです。
Serverless Framework3.19.0にバージョンアップした後、デプロイがエラーで失敗しました。1.61.2に戻したら、デプロイができることは確認しました。

serverless.yml

yml

1service: TEST-v2-escalation-api 2 3frameworkVersion: '3' 4variablesResolutionMode: 20210219 5configValidationMode: warn 6 7provider: 8 name: aws 9 runtime: python3.9 10 region: ${opt:region, 'ap-northeast-1'} 11 stage: ${opt:stage, 'dev'} 12 memorySize: 1024 13 timeout: 30 14 API_ENV: envB 15 16 tracing: 17 apiGateway: true 18 lambda: true 19 logs: 20 restApi: 21 level: INFO 22 fullExecutionData: true 23 24 stackName: ${self:custom.TEST_app_name}-${self:provider.stage}-escalation-api 25 apiName: ${self:custom.TEST_app_name}-${self:provider.stage}-escalation-api 26 27 iamRoleStatements: 28 - Effect: "Allow" 29 Action: 30 - "logs:CreateLogGroup" 31 - "logs:CreateLogStream" 32 - "logs:DescribeLogGroups" 33 - "logs:DescribeLogStreTEST" 34 - "logs:PutLogEvents" 35 - "logs:GetLogEvents" 36 - "logs:FilterLogEvents" 37 Resource: "*" 38 - Effect: "Allow" 39 Action: 40 - "s3:*" 41 Resource: 42 - "arn:aws:s3:::${self:custom.masterdata-bucket_name.main}" 43 - "arn:aws:s3:::${self:custom.masterdata-bucket_name.main}/*" 44 - "arn:aws:s3:::${self:custom.masterdata-bucket_name.sub}" 45 - "arn:aws:s3:::${self:custom.masterdata-bucket_name.sub}/*" 46 - "arn:aws:s3:::${self:custom.escalation-api-bucket_name.${self:custom.region_type}}" 47 - "arn:aws:s3:::${self:custom.escalation-api-bucket_name.${self:custom.region_type}}/*" 48 - Effect: "Allow" 49 Action: 50 - "dynamodb:*" 51 Resource: 52 - "arn:aws:dynamodb:${self:provider.region}:#{AWS::AccountId}:table/${opt:dynamodb_table_name_phone-incidents}" 53 - "arn:aws:dynamodb:${self:provider.region}:#{AWS::AccountId}:table/${opt:dynamodb_table_name_phone-assign}" 54 - "arn:aws:dynamodb:${opt:TEST_main_region}:#{AWS::AccountId}:table/${opt:backlog_setting_table_name}" 55 - "arn:aws:dynamodb:${opt:TEST_sub_region}:#{AWS::AccountId}:table/${opt:backlog_setting_table_name}" 56 - "arn:aws:dynamodb:${opt:TEST_main_region}:#{AWS::AccountId}:table/${opt:backlog_setting_binding_table_name}" 57 - "arn:aws:dynamodb:${opt:TEST_sub_region}:#{AWS::AccountId}:table/${opt:backlog_setting_binding_table_name}" 58 - Effect: "Allow" 59 Action: 60 - "xray:PutTraceSegments" 61 - "xray:PutTelemetryRecords" 62 Resource: "*" 63 - Effect: "Allow" 64 Action: 65 - "sts:AssumeRole" 66 Resource: "*" 67 environment: 68 phone_incidents_table: ${opt:dynamodb_table_name_phone-incidents} 69 phone_assign_table: ${opt:dynamodb_table_name_phone-assign} 70 escalation_bucket_name: ${self:custom.escalation-api-bucket_name.${self:custom.region_type}} 71 slack_oauth_token: ${opt:slack_oauth_token} 72 pd_subdomain: ${opt:pd_subdomain} 73 TEST_APPNAME: ${self:custom.TEST_app_name} 74 TEST_STAGE: ${self:provider.stage} 75 TEST_ACCOUNT_ID: "#{AWS::AccountId}" 76 TEST_GLOBAL_VALUE_DOMAIN_BASE: ${opt:TEST_domain} 77 NEW_RELIC_ACCOUNT_ID: ${opt:nr_account_id} 78 API_ENV: ${self:provider.alias} 79 REGION: ${self:provider.region} 80 REGION_TYPE: ${self:custom.region_type} 81 82custom: 83 TEST_app_name: ${opt:TEST_app_name} 84 pythonRequirements: 85 useDownloadCache: true 86 useStaticCache: true 87 newrelicPythonLambdaLayer: 88 ap-northeast-1: 89 arn: arn:aws:lambda:ap-northeast-1:111111111111:layer:NewRelicPython36:9 90 us-west-2: 91 arn: arn:aws:lambda:us-west-2:111111111111:layer:NewRelicPython36:12 92 region_type: ${opt:region_type, 'secondary'} 93 escalation-api-bucket_name: 94 primary: ${opt:s3_bucket_escalation-api-bucket_name_primary} 95 secondary: ${opt:s3_bucket_escalation-api-bucket_name_secondary} 96 masterdata-bucket_name: 97 main: ${self:custom.TEST_app_name}-${self:provider.stage}-${opt:TEST_main_region}-#{AWS::AccountId}-masterdata 98 sub: ${self:custom.TEST_app_name}-${self:provider.stage}-${opt:TEST_sub_region}-#{AWS::AccountId}-masterdata 99 100package: 101 exclude: 102 - node_modules/** 103 include: 104 - ../../lib/** 105 106functions: 107 # phone 108 phone-register: 109 name: ${self:provider.apiName}-phone-register 110 handler: newrelic_lambda_wrapper.handler 111 layers: 112 - ${self:custom.newrelicPythonLambdaLayer.${self:provider.region}.arn} 113 environment: 114 NEW_RELIC_LAMBDA_HANDLER: phone/functions/register.main 115 events: 116 - http: 117 path: phone/call 118 method: post 119 private: true 120 cors: true 121 phone-checker: 122 name: ${self:provider.apiName}-phone-checker 123 handler: newrelic_lambda_wrapper.handler 124 layers: 125 - ${self:custom.newrelicPythonLambdaLayer.${self:provider.region}.arn} 126 environment: 127 NEW_RELIC_LAMBDA_HANDLER: phone/functions/checker.main 128 events: 129 - http: 130 path: phone/call 131 method: get 132 private: true 133 cors: true 134 phone-callback-action: 135 name: ${self:provider.apiName}-phone-callback-action 136 handler: newrelic_lambda_wrapper.handler 137 layers: 138 - ${self:custom.newrelicPythonLambdaLayer.${self:provider.region}.arn} 139 environment: 140 NEW_RELIC_LAMBDA_HANDLER: phone/functions/callback_action.main 141 events: 142 - http: 143 path: phone/callback/action 144 method: get 145 private: false 146 cors: true 147 phone-callback-status: 148 name: ${self:provider.apiName}-phone-callback-status 149 handler: newrelic_lambda_wrapper.handler 150 layers: 151 - ${self:custom.newrelicPythonLambdaLayer.${self:provider.region}.arn} 152 environment: 153 NEW_RELIC_LAMBDA_HANDLER: phone/functions/callback_status.main 154 events: 155 - http: 156 path: phone/callback/status 157 method: post 158 private: false 159 cors: true 160 # backlog 161 backlog-notify: 162 name: ${self:provider.apiName}-backlog-notify 163 handler: newrelic_lambda_wrapper.handler 164 # handler: backlog/functions/notify.handler 165 layers: 166 - ${self:custom.newrelicPythonLambdaLayer.${self:provider.region}.arn} 167 environment: 168 NEW_RELIC_LAMBDA_HANDLER: backlog/functions/notify.handler 169 main_region: ${opt:TEST_main_region} 170 sub_region: ${opt:TEST_sub_region} 171 masterdata_bucket_name_main: ${self:custom.masterdata-bucket_name.main} 172 masterdata_bucket_name_sub: ${self:custom.masterdata-bucket_name.sub} 173 backlog_setting_table_name: ${opt:backlog_setting_table_name} 174 backlog_setting_binding_table_name: ${opt:backlog_setting_binding_table_name} 175 backlog_setting_encrypt_key: ${opt:backlog_setting_encrypt_key} 176 backlog_setting_role_arn: ${opt:backlog_setting_role_arn} 177 backlog_setting_role_external_id: ${opt:backlog_setting_role_external_id} 178 events: 179 - http: 180 path: backlog/notify 181 method: post 182 private: true 183 cors: true 184 backlog-post: 185 name: ${self:provider.apiName}-backlog-post 186 #handler: newrelic_lambda_wrapper.handler 187 handler: backlog/functions/post.main 188 layers: 189 - ${self:custom.newrelicPythonLambdaLayer.${self:provider.region}.arn} 190 environment: 191 NEW_RELIC_LAMBDA_HANDLER: backlog/functions/post.main 192 events: 193 - http: 194 path: backlog/call 195 method: post 196 private: true 197 cors: true 198 # healthcheck 199 healthcheck: 200 name: ${self:provider.apiName}-healthcheck 201 handler: healthcheck/functions/healthcheck.main 202 environment: 203 AWS_API_RETRY_COUNT: 2 # Retry count 204 events: 205 - http: 206 path: healthcheck 207 method: get 208 209plugins: 210 - serverless-python-requirements 211 - serverless-pseudo-parameters 212 - serverless-plugin-include-dependencies 213 - serverless-aws-alias

package.json

{ "name": "test-v2-escalation-api", "description": "", "version": "2.0.0", "dependencies": { "serverless-aws-alias": "^1.8.0" }, "devDependencies": { "serverless-python-requirements": "^4.2.5", "serverless-pseudo-parameters": "^2.2.0", "serverless-plugin-log-subscription": "^1.2.0", "serverless-plugin-tracing": "^2.0.0", "serverless-plugin-include-dependencies": "^3.2.1" } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

エラーが出ている箇所はserverless.yml の
API_ENV: ${self:provider.alias}
の部分です。

ご自身で答えを示されているような気が・・・

TEST_STAGE: ${self:provider.stage}
【略】
API_ENV: ${self:provider.alias}

serverless.ymlの記載順に読み込みが行われていると仮定すると、TEST_STAGEの読み込みには成功し、API_ENVの読み込みには失敗したということになりますよね。であれば、その違いを意識してserverless.ymlを確認すれば自ずと答えは出てくるのではないでしょうか?
※全く外していたら申し訳ないですが・・・

投稿2022/07/18 15:53

ninja250r

総合スコア152

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuta1989

2022/07/19 11:33

ご回答ありがとうございます。 serverless-aws-aliasというプラグインを使用して、現在デプロイされているエイリアスを${self:provider.alias}で参照しているようでした。 質問に追記しておきますmm 3.19.0にバージョンアップした後、デプロイがエラーで失敗しました。1.61.2に戻したら、デプロイができることは確認しました。
guest

0

ベストアンサー

エラーが出ている箇所はserverless.yml の
API_ENV: ${self:provider.alias}
の部分です。

ご自身で答えを示されているような気が・・・

TEST_STAGE: ${self:provider.stage}
【略】
API_ENV: ${self:provider.alias}

serverless.ymlの記載順に読み込みが行われていると仮定すると、TEST_STAGEの読み込みには成功し、API_ENVの読み込みには失敗したということになりますよね。であれば、その違いを意識してserverless.ymlを確認すれば自ずと答えは出てくるのではないでしょうか?
※全く外していたら申し訳ないですが・・・

【7/19追記】
こちらには

Deploy an alias
To deploy an alias to a stage, just add the --alias option to serverless deploy with the alias name as option value.
Example: serverless deploy --alias myAlias

とありますが織り込み済みでしょうか?
デプロイ時のコマンド文字列も示されると良いかと思いました。

【7/20追記】
まず結論から書きますとserverless-aws-aliasは、Serverless Framework3に対応していないです。根拠はプラグイン紹介ページのリンク先のこちらのページの概要欄に「Alias support for Serverless 1.x 」と明記されている点です。

では今回の対応としてどうするか?ということになりますが、
①特段の要件がなければ、そもそものバージョンアップを諦める。
②v3のお作法に従い、フルスクラッチのつもりですべてのコードを書き直す。
のいずれかということになろうかと思います。

※以下余談ですが、stackoverflowの同様の質問にレス・コメントが1件たりとも付かないあたり、小手先の回避策は実質ないと判断しています。

投稿2022/07/19 14:54

編集2022/07/20 16:53
ninja250r

総合スコア152

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuta1989

2022/07/19 17:19

ご回答ありがとうございます。 はい、デプロイコマンドに--aliasを追加しています。 こちらも質問に追記しておきますm(__)m
yuta1989

2022/07/21 01:41

ご丁寧にご回答いただきありがとうございます! Serverless Framework3にバージョンアップすることは諦めることにしましたm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問