성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Roll A Lisp In C - Reading ; https...
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Azure - Blob Storage Account의 Location 이전 방법</h1> <p> 지난 글에도 언급했지만,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Azure - Location이 다른 웹/DB 서버의 경우 발생하는 성능 하락 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12273'>https://www.sysnet.pe.kr/2/0/12273</a> </pre> <br /> Azure는 Location 이전을 수작업으로 해야 합니다. 이에 대해 방법을 찾아보면 아래의 문서가 나오는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Azure Storage 계정을 다른 지역으로 이동 ; <a target='tab' href='https://learn.microsoft.com/ko-kr/azure/storage/common/storage-account-move?tabs=azure-portal'>https://learn.microsoft.com/ko-kr/azure/storage/common/storage-account-move?tabs=azure-portal</a> </pre> <br /> 기존 Storage의 template을 내보내는 방법과 신규 Storage에서 가져오는 방법을 설명하는 것으로, 이것은 해당 Storage에 설정한 환경을 복사하는 것일 뿐 데이터를 마이그레이션하는 작업은 하지 않습니다. 즉, 데이터 이전은 별도로, 수작업으로 해야 합니다. ^^;<br /> <br /> 또한 "<a target='tab' href='https://learn.microsoft.com/ko-kr/azure/storage/common/storage-account-move?tabs=azure-portal'>Azure Storage 계정을 다른 지역으로 이동</a>" 문서의 마지막에 보면 "Azure Data Factory"를 사용하여 데이터를 이동할 수도 있습니다. 직관적인 사용자 인터페이스를 제공합니다."라는 설명으로 "Azure Data Factory"를 이용하면 왠지 간단한 절차만으로 해결될 것 같지만 해당 문서를 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Copy and transform data in Azure Blob storage by using Azure Data Factory ; <a target='tab' href='https://learn.microsoft.com/ko-kr/azure/data-factory/connector-azure-blob-storage'>https://learn.microsoft.com/ko-kr/azure/data-factory/connector-azure-blob-storage</a> </pre> <br /> 그냥 azcopy로 처리하는 것이 더 낫겠다는 생각을 (10초도 안되어서) 하게 될 것입니다. ^^; AzCopy의 사용법은,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Get started with AzCopy ; <a target='tab' href='https://learn.microsoft.com/ko-kr/azure/storage/common/storage-use-azcopy-v10?toc=/azure/storage/blobs/toc.json'>https://learn.microsoft.com/ko-kr/azure/storage/common/storage-use-azcopy-v10?toc=/azure/storage/blobs/toc.json</a> Transfer data with AzCopy and Blob storage ; <a target='tab' href='https://learn.microsoft.com/ko-kr/azure/storage/common/storage-use-azcopy-blobs'>https://learn.microsoft.com/ko-kr/azure/storage/common/storage-use-azcopy-blobs</a> </pre> <br /> 그나마 직관적입니다. 일단, Azure Blob Storage에서 로컬로 복사한다면 다음과 같은 형식으로 실행할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > azcopy copy 'https://<source-storage-account-name>.blob.core.windows.net/<container-name><SAS-token>' '<local-file-path>' --recursive </pre> <br /> 예를 들어,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > source-storage-account-name == udb.blob.core.windows.net local-file-path == d:\temp </pre> <br /> 위의 조건이라면 다음과 같이 실행할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > azcopy copy "https://udb.blob.core.windows.net?...[SAS-token]..." "d:\temp" --recursive </pre> <br /> 여기서 아직 구하지 못한 것이 SAS(Shared access signature) token 값인데, 이것은 Azure Portal에서 다음의 화면을 통해,<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='sas_token_1.png' src='/SysWebRes/bbs/sas_token_1.png' /><br /> <br /> 구할 수 있습니다. 예를 들어, SAS Token의 값이 다음과 같이 구해졌다면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ?sv=2019-10-10&ss=bfqt&srt=sco&sp=rwdlacupx&se=2020-07-18T14:51:29Z&st=2020-07-16T06:51:29Z&sip=168.126.144.30&spr=https&sig=QijTJGThP%3BEi3tSEgCnVZQylMY162FrIg9wafuuFU8E%3D </pre> <br /> 최종적으로 이렇게 실행하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > azcopy copy "https://udb.blob.core.windows.net?sv=2019-10-10&ss=bfqt&...[생략]..." "d:\temp" --recursive </pre> <br /> 만약, 전체 Storage가 아니라 하위 Container만 특정하고 싶다면 URL에 덧붙여 실행할 수 있습니다. 가령, 여러분들의 Storage에 "images"라는 이름의 container가 있다면 이렇게 실행할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > azcopy copy "https://udb.blob.core.windows.net/<span style='color: blue; font-weight: bold'>images</span>?sv=2019-10-10&ss=bfqt&...[생략]..." "d:\temp" --recursive </pre> <br /> SAS Token 관련해서 좀 더 자세한 사항은 다음의 문서에서 확인할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Grant limited access to Azure Storage resources using shared access signatures (SAS) ; <a target='tab' href='https://learn.microsoft.com/ko-kr/azure/storage/common/storage-sas-overview'>https://learn.microsoft.com/ko-kr/azure/storage/common/storage-sas-overview</a> How to Generate an Azure SAS Token to Access Storage Accounts ; <a target='tab' href='https://adamtheautomator.com/azure-sas-token/'>https://adamtheautomator.com/azure-sas-token/</a> </pre> <br /> <hr style='width: 50%' /><br /> <br /> 반대로 로컬의 디렉터리를 Azure Stroage에 넣는 것은 인자 값의 순서만 바꾸면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > azcopy copy '<local-directory-path>\*' 'https://<storage-account-name>.<blob or dfs>.core.windows.net/<container-name>/<directory-path>' </pre> <br /> 단지, 다운로드할 때와는 달리 전체 blob을 올릴 수는 없습니다. 제가 방법을 모르는 걸 수도 있지만, 아래와 같이 오류가 발생합니다. (혹시, 방법을 아시는 분은 덧글 부탁드립니다. ^^)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\>azcopy copy "d:\temp" "https://...[대상_stroage]....blob.core.windows.net?sv=2019-10-1...[생략]..." --recursive INFO: Scanning... failed to perform copy command due to error: cannot transfer individual files/folders to the root of a service. Add a container or directory to the destination URL </pre> <br /> 대신, 하위 Container 별로 올릴 수 있는데, 이때 미리 Container를 생성해 두어야 합니다. 그렇지 않고 실행하면 이번에도 실패합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // 대상 storage에 "temp" container가 만들어져 있지 않은 경우 C:\> azcopy copy "d:\temp" "https://...[대상_stroage]....blob.core.windows.net<span style='color: blue; font-weight: bold'>/temp</span>?sv=2019-10-10&ss=bfqt&srt=sco&sp=rwdlacupx&se=2020-07-19T22:23:20Z&st=2020-07-17T14:23:20Z&spr=https&sig=wSw3VBfT%2FAmvSBVPNXhCNFOJ6eShzXewQIl%2BMb0qfNQ%3D" --recursive INFO: Scanning... INFO: Any empty folders will not be processed, because source and/or destination doesn't have full folder support Job 92ee7705-2dfb-de48-6401-c71ddeb7c900 has started Log file is located at: C:\Users\testusr\.azcopy\92ee7705-2dfb-de48-6401-c71ddeb7c900.log 0.0 %, 0 Done, 0 Failed, 56 Pending, 0 Skipped, 56 Total, Job 92ee7705-2dfb-de48-6401-c71ddeb7c900 summary Elapsed Time (Minutes): 0.0334 Number of File Transfers: 56 Number of Folder Property Transfers: 0 Total Number of Transfers: 56 Number of Transfers Completed: 0 Number of Transfers Failed: 56 Number of Transfers Skipped: 0 TotalBytesTransferred: 0 Final Job Status: Failed </pre> <br /> 따라서, 예를 들어, "d:\temp\images"의 하위 폴더/파일들을 업로드하고 싶다면 그 blob들이 위치할 container도 미리 생성해 놓고 실행해야 합니다. 대개의 경우, 이전에 "images" 컨테이너에 있던 내용들이라면 그 이름 그대로 옮기고 싶을 것이므로 이런 식으로 처리할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > azcopy copy "d:\temp\images\*" "https://...[대상_stroage]....blob.core.windows.net/images?sv=2019-10-10...[생략]..." --recursive </pre> <br /> (위의 예에서 "*" 문자를 빼면, Azure Storage의 images 컨테이너 하위에 다시 "images" 폴더가 생성되고 그 하위에 파일 및 서브 디렉터리가 올라갑니다.)<br /> <br /> 자, 그럼 Azure Storage를 옮기는 방법은 다음과 같이 정리할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 1. 원본 Storage에서 "azcopy copy ..."로 로컬에 모두 다운로드 2. 대상 Storage에 원본의 컨테이너들을 미리 생성해 놓고, 개별 컨테이너마다 "azcopy copy ..."로 업로드 </pre> <br /> <hr style='width: 50%' /><br /> <br /> 위에서 로컬을 경유한 방법을 소개했지만, 사실 전체 Storage를 옮기는 것이라면 다음의 명령어 하나로 해결할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > azcopy copy 'https://<source-storage-account-name>.blob.core.windows.net/<SAS-token>' 'https://<destination-storage-account-name>.blob.core.windows.net/' --recursive </pre> <br /> 문서 상으로는 위와 같이 SAS-token을 source-storage-account 측에만 제공하지만, 제가 해본 결과로는 destination-storage-account 측에도 지정해야 했었습니다. (아마 같은 storage 내에서라면 필요 없겠지만 다른 storage라면 필요할 것입니다. 그렇긴 한데 제가 이거저거 너무 테스트를 많이 해봐서 확실치 않습니다. ^^;) 어쨌든, 다음과 같은 명령어 하나로 storage 이전을 간단하게 마무리했습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > D:\temp\blob> <span style='color: blue; font-weight: bold'>azcopy copy "https://...source....blob.core.windows.net?sv=2019-10-10...[소스측_sas_token]..." "https://...dest....blob.core.windows.net?sv=2019-10-10...[목적지측_sas_token]..." --recursive</span> INFO: Scanning... INFO: Any empty folders will not be processed, because source and/or destination doesn't have full folder support Job 54c45f3e-5bc6-ae47-7e87-9a9dc3d575c4 has started Log file is located at: C:\Users\testusr\.azcopy\54c45f3e-5bc6-ae47-7e87-9a9dc3d575c4.log 100.0 %, 9851 Done, 0 Failed, 6 Pending, 0 Skipped, 9857 Total, 2-sec Throughput (Mb/s): 7.7693 Job 54c45f3e-5bc6-ae47-7e87-9a9dc3d575c4 summary Elapsed Time (Minutes): 25.3103 Number of File Transfers: 9857 Number of Folder Property Transfers: 0 Total Number of Transfers: 9857 Number of Transfers Completed: 9857 Number of Transfers Failed: 0 Number of Transfers Skipped: 0 TotalBytesTransferred: 2141323772 Final Job Status: Completed </pre> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, azcopy 명령어 사용 전 login 작업은 해야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\temp> <span style='color: blue; font-weight: bold'>azcopy login --tenant-id 9F848C20-BBDF-413D-B9AC-117390503A2E</span> To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code DCNCEVAMF to authenticate. INFO: Login succeeded. C:\temp> </pre> <br /> 위에서 --tenant-id 값은 해당 서비스가 속해있는 <a target='tab' href='https://www.sysnet.pe.kr/2/0/11495'>azure 구독과 관련한 AAD</a>의 tenant-id를 입력하면 됩니다. 이 값은 <a target='tab' href='https://www.sysnet.pe.kr/2/0/11502#tenantid'>프로그램으로도 구할 수 있지만</a> Azure Portal 내의 "Azure Active Directory"에서도 구할 수 있습니다.<br /> <br /> <img alt='sas_token_2.png' src='/SysWebRes/bbs/sas_token_2.png' /><br /> <br /> <hr style='width: 50%' /><br /> <br /> 지난 글과 마찬가지로,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Azure - Location이 다른 웹/DB 서버의 경우 발생하는 성능 하락 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12273'>https://www.sysnet.pe.kr/2/0/12273</a> </pre> <br /> Storage 역시 그것을 액세스하는 측과 같은 Location에 있는 것이 성능상 (당연하겠지만) 좋습니다. 이를 위해 다음과 같은 소스 코드로 측정을 해봤는데요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using Azure.Storage.Blobs; using System; using System.Diagnostics; using System.IO; namespace ConsoleApp2 { // (deprecated) // Install-Package WindowsAzure.Storage // or // Install-Package Microsoft.Azure.Storage.Common // Install-Package Microsoft.Azure.Storage.Blob // or // .NETStandard,Version=v2.0 // .NET Framework 4.6.1 or later // Install-Package Azure.Storage.Blobs class Program { static void Main(string[] args) { string blobConnectionString = "DefaultEndpointsProtocol=...[생략]..."; Action<int, BlobClient, Action<int, BlobClient>> action = (loopCount, blobClient, work) => { Stopwatch st = new Stopwatch(); st.Start(); work(loopCount, blobClient); st.Stop(); Console.WriteLine(st.ElapsedMilliseconds); }; BlobServiceClient bsc = new BlobServiceClient(blobConnectionString); BlobContainerClient bcc = bsc.GetBlobContainerClient("images"); BlobClient bc = bcc.GetBlobClient("test.png"); action(1, bc, RunCommand); action(1, bc, RunCommand); action(1, bc, RunCommand); } private static void RunCommand(int loopCount, BlobClient blobClient) { MemoryStream ms = new MemoryStream(); blobClient.DownloadTo(ms); } } } </pre> <br /> Location이 달랐을 때는,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\temp\perf>ConsoleApp2.exe 805 41 41 C:\temp\perf>ConsoleApp2.exe 693 43 44 </pre> <br /> 40ms 이상의 고정적인 지연 시간이 발생하지만 같은 Location에 있을 때는,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\temp\perf>ConsoleApp2.exe 573 4 2 C:\temp\perf>ConsoleApp2.exe 396 3 2 </pre> <br /> "<a target='tab' href='https://www.sysnet.pe.kr/2/0/12273'>Azure - Location이 다른 웹/DB 서버의 경우 발생하는 성능 하락</a>" 글에서와 유사하게 지연 시간이 없어졌습니다.<br /> <br /> (<a target='tab' href='https://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=1612&boardid=331301885'>첨부 파일은 이 글의 예제 코드를 포함</a>합니다.)<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
6586
(왼쪽의 숫자를 입력해야 합니다.)